Как извлечь иерархические данные о городе / штате / стране из файлов OSM XML планеты? - PullRequest
13 голосов
/ 16 сентября 2011

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

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

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

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

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

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

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

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

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

1 Ответ

15 голосов
/ 17 сентября 2011

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

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

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

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

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

...