Подтвердить что ты не робот

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

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

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

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

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

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

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

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

  • A) это противоречиво и
  • B) это текстовое поле свободной формы, а не ссылка на OSM node (то есть is_in: "Город Вестминстер" не дает мне никакой ссылки на Вестминстер node).

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

4b9b3361

Ответ 1

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

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

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

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

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