Как я могу извлечь иерархические данные о городе / штате / стране из файлов планеты OSM XML?

Я хочу написать сценарий, который анализирует XML-файлы OpenStreetMap (OSM) и строит базу данных городов в иерархическом порядке. Я хочу, чтобы результирующий набор данных имел иерархию, которая в США может выглядеть так:

USA -> California -> San Francisco County -> San Francisco

и, может быть, так в Великобритании:

United Kingdom -> England -> Middlesex -> London -> Soho

Результатом будет документ JSON, описывающий иерархию для всех городов в файле OSM со структурой, подобной приведенным выше примерам.

Я использую Python и библиотеку синтаксического анализатора imposm, и я могу загружать и анализировать файл без проблем; Моя проблема заключается в отсутствии понимания того, как структурированы данные OSM: я не знаю, как узнать отношения родитель / потомок между узлами в данных OSM. Например, если я нахожу узел для «Сохо», как я могу связать его с узлами для «Вестминстерский город», «Большой Лондон», «Мидлсекс» и «Англия»?

Я знаю, что на некоторых узлах есть тег is_in, который может дать некоторую часть этой информации, но

  • А) это непоследовательно и
  • Б) кажется, что это текстовое поле произвольной формы, а не ссылка на узел OSM (например, is_in: «Город Вестминстер» не дает мне никакой ссылки на узел Вестминстера).

Пожалуйста, дайте мне знать, если у вас есть предложения по иерархическому связыванию этих узлов.


person luke    schedule 16.09.2011    source источник


Ответы (1)


В основном в OSM все в свободной форме. Существуют соглашения о добавлении тегов, но нет гарантии, что люди будут их придерживаться. Таким образом, вам нужно будет выполнить некоторую очистку данных и постобработку, чтобы добиться согласованности.

Что касается родительско-дочерних отношений, в OSM нет никаких жестких отношений, кроме:

  • Узел используется одним или несколькими способами
  • Узел является членом одного или нескольких отношений
  • Путь - это член одного или нескольких отношений
  • Отношение является членом одного или нескольких отношений

Отношения OSM можно использовать для определения иерархических отношений, но способ их определения очень общий. Семантика основана на соглашениях (обычно описываемых на страницах OSM Wiki).

Если вы ищете связь "is_in", я думаю, вам нужно будет установить ее, используя геометрические методы. К сожалению, вы не можете полагаться только на теги OSM.

person Igor Brejc    schedule 17.09.2011
comment
спасибо за ответ, Игорь. это полезная информация, и похоже, что я не могу достаточно полагаться на структуру данных OSM, чтобы получить данные, которые мне нужны. Думаю, мне лучше получить данные откуда-нибудь вроде geonames.org. - person luke; 19.09.2011
comment
не может ли он найти все узлы, граничащие с интересующей точкой? например если у вас есть улица, вы должны найти такой узел, как город, провинция, район и страна, потому что их границы окружают положение улицы по широте и долготе? - person Tom; 09.05.2014