локальный поиск по населенным пунктам, на основе данных osm

Доброго времени суток!
Уважаемое сообщество, кто нибудь делал локальный поиск по населенным пунктам с выделением границ.
Поясню: меня интересует схема бд, конфигурация железа, какие могут быть подводные камни и прочие советы.
В качестве бд у меня mssql. Пишу на c#/js. Самый большой вопрос - как организовать бд для отдачи данных? Может кто знает как устроен nominatim?
Использовал ли кто нибудь для поиска по бд поисковый движок SphinX?
Поделитесь опытом, буду благодарен!

Флаг вам в руку :slight_smile:
Могу сказать что все достаточно запутано :slight_smile: населенные пункты могут быть как в relation так и в ways данных в тагов не так много как кажется , много нодов и всего остального.

Можешь изучить мои наработки по этой теме . но для mysql/php https://github.com/saintbyte/import_from_osm_file . код там довольно примитивный так что можешь переписать его на С#

Для геоданных лучше всего использовать postgres+postgis и osm2pgsql. Nominatim использует базу osm2pgsql, при инициализации он фактически “дорабатывает” под свои нужды. Поиск на openstreetmap.ru использует sphinx (плюс postgres), но в публичном доступе всего кода поисковой части пока нет.

Почему именно postgres?
Спасибо за комментарии!
Еще интересно как тот же nominatim так быстро находит все way и node которые входит в relation и возвращает их клиенту.

Номинатим по тому что есть в осм строит “нормальную” геометрию и работает уже с нею. Постгрес - так сложилось что самая популярная геопространсвенная бд на сегодня - postgis.

Вам только РФ или всю планету надо?

Могу предложить свои наработки (которые на openstreetmap.ru), если поиск, например, по области, т.к. обновление России около суток. Но по ним мало доков.
общая схема: osmosis втягивает данные в postgresql+postgis, потом sql скриптами воткнутыми в python создаем отдельную адресную таблицу, по виду похожему КЛАДРа, сфинкс это все индексирует. Данные забираются через api (cgi) на python с обработкой.
но там хватает костылей :wink:

а с mssql пытались в моей схеме pg заменить, но осм данные геморно было грузить. Подробностей не знаю, не я делал, да и думаю, сейчас уже и не узнаешь.

Потому что именно для postgres написано практически единственное вменяемое опенсурсное кроссплатформенное геометрическое расширение - PostGIS. Аналог для mysql умеет, насколько я помню, только bbox’ы вокруг геометрий, аналог для oracle безбожно медленный и глючный, что там было про mssql я уже и не помню.

Геометрические индексы позволяют довольно быстро отсеивать неподходящие варианты.

Главный подводный камень - разобраться как вообще устроены данные в осм, нужные для адресного поиска.
Можно посмотреть мою лекцию:
https://www.youtube.com/watch?feature=player_embedded&v=6oFGAbjNtHc

Про номинатим так же есть доклад авторов:
https://www.openstreetmap.org/user/Zkir/diary/19983

2 dkiselev
Да мне нужен весь мир в идеале.

2 ErshKUS
Данные из planet.osm я уже экспортировал в mssql. В бд следующих таблицы: node, node_tags, way, way_tags, way_nodes, relation, relation_tags, relation_members. Если интересно могу расписать поля в каждой таблице.

Спасибо большое всем за ответы, буду писать о результатах в этот топик.
Я так понимаю нужно теперь по тэгам отсеять все что не связано с населенными пунктами и потом реорганизовать оставшиеся данные.
Как насчет схем бд?

Cr_osm, все-таки не очень понятно, что хочется получить в результате. Если свой адресный поиск/геокодер, то это один разговор. Если нужен просто список населенных пунктов, то немного другой. В последнем случае достаточно просто выбрать из осм все точки (node) c тегом place=*.

В первом посте упоминаются гранцы НП, причем тут они?

Просто сами точки населенных пунктов выдрадь нет проблем. А с границами, в РФ это place=* в других странах admin_level=6-8 причем в разных странах по разному.

Это настолько важно, что я это повторю. Хотя возможно это не имеет прямого отношения к этому топику.

Для номинатима границы населенных пунктов НЕ нужны. Номинатим это система адресного поиска, а не построения жестких адресных реестров.

Нужен геокодер! С границами нас. пунктов поясню- например в том же номинатиме или гугле или яндексе при поиске деревни/города/страны короче населенного пункта на карте появляется не только точка, но и, по возможности, граница этого…назовем объекта. Задача обратного геокодирования не требуется(пока). Т.е. вводим название прим. Красноярск, получаем ответ в виде возможных вариантов, при выборе подвечиваем если возможно границу в данном примере города плюс маркер в точке. Все.

Это вам поможет умный подход к тагам :slight_smile:
Вот обратное преобразование - это веселее :slight_smile:

Можете вот это посмотреть.

https://github.com/kiselev-dv/gazetteer

Я чуть попозже собираюсь здесь на форуме рассказать поподробнее что это и как это использовать.

Спасибо обязательно посмотрю