Простой геокодер

Мне черезвычайно надоела ситуация с тем, что Nominatim никогда не обновляется, а “геокодер нового поколения” всё никак никем не заканчивается, поэтому написал свой.

Ставившиеся цели:

Вживую геокодер можно пощупать на http://openstreetmap.by/, набрав что-нибудь в поиске или передав в страничку параметром ?q=.

Цели, не ставившиеся перед геокодером:

  • Находить всё. Это задача Яндекса, и если ее решать, то можно упереться в то же, что и Номинатим - импорт в базу будет происходить не в реальном времени, а с (много)недельным отставанием;
  • Искать POI. На мой взгляд, это задача каталогов POI, а не геокодера, поэтому поиски типа “магазины мебели вокруг завода такого-то” поддерживать не планируется;
  • Поддерживать все адресные схемы и весь мир. На мой взгляд, вполне достаточно ограничиться русским языком;
  • Поддерживать поиск по некрасивым данным. Если кто-то напишет addr:street=“Ленина улица” вместо addr:street=“улица Ленина” (см. соглашение об именовании), то вполне нормально, если такой объект не будет найден.

Формат ввода:
а) Поиск по строгому совпадению name полигона и введенной строки (регистрозависимый). Вполне достаточно, чтобы написать Минск и найти в базе ближайший к вам Минск.
б) Поиск по паре “улица-дом-(город)” (регистронезависимый, relaxed). Выдаёт ближайший к опорной точке дом с таким адресом;
в) Поиск по улице (-городу) (регистронезависимый, relaxed). Выдаёт ближайший к вам сегмент улицы с таким названием.
г) Поиск по населенным пунктам (регистронезависимый, relaxed). Выдаёт населенный пункт с похожим названием.

Требования к данным:

  • addr:street и name у улиц должен быть заполнен согласно Соглашению об именовании дорог, допустимы сокращения “ул.”, “просп.” и “пер.”;
  • addr:street должен быть в базе проекта streetmangler (https://github.com/AMDmi3/streetmangler, автор AMDmi3, дополнения можно присылать там же, на гитхабе, в виде баг-репортов и пулл-реквестов);
  • addr:housenumber записан в формате “48А к2 с1” - дом номер 48А, корпус 2, строение 1. на данный момент поиска по составным номерам домов нет.
  • двойные адреса задаются в следующем виде: основной адрес прописывается на контур здания (addr:street, addr:housenumber), дополнительные адреса ставятся на точки (addr:street, addr:housenumber ,без тега building) внутри контура основного здания.

Как-то так. Попробуйте поискать свой дом; найдётся? Если да, мне будет приятно услышать “спасибо”, если нет, то мне хотелось бы знать ссылку на объект в OSM и тот запрос, который вы вводите. :slight_smile:

К слову, в реальной жизни искать пои — не задача геокодера, но и не задача каталога. Запросы вида «поесть» или «суши» КРАЙНЕ актуальны в практическом применении. Даже из моего личного опыта.

А вообще ня, мой дом находит :3
Вечером затестирую.

Вбиваю “3-я линия 27 Ростов-на-Дону” - выдаёт тот же адрес, но в Краснодаре. Nominatim выдаёт то что надо.

Мой дом находит, слава котам!

Не находит улицу Нарского в Острогожске. Сам Острогожск находит, соседнюю с ним улицу Крамского находит.
Запрос: “Острогожск нарского”
Осмовей: http://www.openstreetmap.org/browse/way/51655450

Запрос: “Московское шоссе Самара” приводит сюда
Должен к http://www.openstreetmap.org/browse/relation/1531821 или хотя бы одному из указанных там

Запрос “Кандалакша Фрунзе 33” выдаёт:
Тверскую область, Конаково

“Сухой Лог” - находит Сухой Лог в Томской области. хотя он к моему геоположению не близок (ip должен быть екатеринбуржский, геопозиционирование в других местах работает нормально). Вариантов с выбором других мест не предлагает

“Сухой Лог, Сведловская область” - вообще переходит в Омск

upd:
хм… странно… начал находить правильный Сухой Лог…

Мою улицу, мой дом не находит. Например, Карташихина 4.

А можно на http://openstreetmap.by/ добавить переключалку источника тайлов между русским и белорусским языками?

Набираю “новосибирск, ильича, 3”, попадаю в Бердск на улицу Новосибирскую. (искал: вот)

“цветной проезд, 3” - попадаю в Барнаул. “Новосибирск, цветной проезд, 3” - в Томск. (вот что искал)

Почему-то меня при входе определяют как жителя Богучанского района Красноярского края. :slight_smile:

А это MaxMind вместо нормальной геобазы.

исходники будут?

будут. Дайте до ума довести.

На БитБукете, пожалуйста.

Клонируй что угодно и куда угодно :slight_smile:

В случае чего используй hg convert, Люк!

Если не писать в запросе “ё”, то не находит. Кстати, в Яндексе название улицы как раз без “ё”, но запросом с “ё” тоже находит.

По запросу “дмитров” выдаёт улицу Большую Дмитровку.

По запросам “краинка” и “валуево” вообще ничего не находит.

Запрос “Титова Екатеринбург” приводит в Заславль, Белоруссия. Ну а хотелось бы екатеринбург :slight_smile:

Добавлена поддержка городов и прочих населенных пунктов.

Запросы должны быть теперь отвязаны от “ё”, они с “е” считаются одной буквой.

“Дмитров”, “краинка”, “валуево” находит соответствующие ближайшие населенные пункты.

“новосибирск, ильича, 3” и “новосибирск цветной проезд 3” тоже находятся.

У кого-нибудь что-то ещё не находится?)

Находит, спасибо. Но находит только один из. И по запросу “Валуево” выдаётся не “Валуево”, а “Верхнее Валуево”. Может из-за населения…

Ещё “озеро долгое” не ищется (гм… это относится к POI, которые вы не планируете искать?).