2013-11-16 3 views
2

Я хочу сделать запросы для адресов в базу данных postgis с данными из openstreetmap, проверить, существует ли такой адрес в базе данных, и если да, получите координаты. База данных была заполнена из файла .pbf с использованием осмоса. Это схема базы данных http://pastebin.com/Yigjt77f. У меня есть адреса в виде названия города, названия улицы и номера улицы. Самое главное для меня в этой таблице:postgis запрос для адресов (с данными osm)

CREATE TABLE node_tags (
    node_id BIGINT NOT NULL, 
    k text NOT NULL, 
    v text NOT NULL 
); 

к колонке в виде тегов, один, что меня интересует, являются: addr:housenumber, addr:street, addr:city и v имеет соответствующее значение. Сначала я ищу, если имя города соответствует одному в базе данных, чем в наборе результатов, который я ищу для улицы, а не для номера дома. Проблема в том, что я не знаю, как сделать SQL-запрос, который получит этот результат с запросом только один раз. Я могу сначала спросить только имя города, получить все node_id, которые соответствуют моему городу, и сохранить их в java-программе, чем делать запросы, запрашивающие каждый найденный (соответствующий моему городу) id_number (список из моей java-программы) для улицы и т. Д. , Этот способ действительно медленный, потому что, запрашивая более подробную информацию (город, чем улица, чем номер), я должен делать все больше и больше запросов, и более того, я должен проверять множество адресов. Как только у меня будет соответствие node_id, я могу легко найти координаты, так что это не проблема.

Пример этой таблицы:

node_id | k | v <br> 
    123 | addr:housenumber | 50 
    123 | addr:street | Kingsway 
    123 | addr:city | London 
    123 | (some other stuff) | ..... 
    100 | addr:housenumber | 121 
    100 | addr:street | Edmund St 
    100 | addr:city | London 

Я надеюсь, что я ясно объяснил, что это моя проблема.

ответ

2

Это не так просто, как вы думаете. Адреса в OSM иерархически, как в реальном мире. Не все elements в OSM имеют полный адрес. Некоторые из них имеют только addr:housenumber и просто принадлежат к ближайшей улице. Некоторые из них имеют addr:housenumber и addr:street, но не addr:city, потому что они просто принадлежат к ближайшему городу. Или они заключены в boundary relation, который указывает соответствующий город. И вместо addr:housenumber иногда также просто адрес интерполяции, описанный addr:interpolation ключом. См. addr key wiki page для получения дополнительной информации.

Страница Karlsruhe Schema в викторине OSM много объясняет адреса в OSM. В нем также упоминаются отношения associatedStreet, которые иногда используются для группировки номеров домов и их соответствующих улиц.

Как видите, одного запроса в базе данных, вероятно, будет недостаточно. Если вам нужно вдохновение, вы можете взглянуть на поисковую систему адресов OSM Nominatim. Но обратите внимание, что Nominatim использует другую схему базы данных, чем обычная, чтобы оптимизировать адресные запросы. Вы также можете взглянуть на одно из многих routing applications, которым все должны выполнять поиск адресов.

+0

Благодарим вас за ответ. Я знаю, что некоторые части адресов могут быть связаны с другими элементами, которые находятся в разных таблицах, и получение их может быть непростым. Мой вопрос заключался в том, как выполнить запрос (тот, который я описал), зная, что он не получит всех адресов. Это довольно временный ярлык, но сейчас мне это нужно. – katjet0

Смежные вопросы