2011-09-16 13 views
12

Chcę napisać skrypt, który analizuje pliki XML OpenStreetMap (OSM) i buduje bazę danych miast w sposób hierarchiczny. Chcę wynikowy zestaw danych mają hierarchię, która może wyglądać tak w USA:Jak mogę wyodrębnić hierarchiczne dane miasta/stanu/kraju z plików planety XML OSM?

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

a może tak w Wielkiej Brytanii:

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

Wyjście będzie dokument JSON, który opisuje hierarchia dla wszystkich miast w pliku OSM, o strukturze podobnej do powyższych przykładów.

Używam biblioteki Pythona i biblioteki "imposm" i mogę załadować i parsować plik bez problemu; moim problemem jest brak zrozumienia struktury danych OSM: nie wiem, jak poznać relację rodzic/dziecko między węzłami w danych OSM. Na przykład, jeśli zlokalizuję węzeł dla "Soho", jak mogę powiązać go z węzłami dla "City of Westminster", "Greater London", "Middlesex" i "England"?

wiem, że niektóre węzły mają "is_in" znacznik, który może dać niektóre z tych informacji, ale

  • A) jest to niespójne i
  • B) wydaje się być tekst free-form pole, a nie link do węzła OSM (np. is_in: "City of Westminster" nie daje mi żadnego łącza do węzła Westminster).

Proszę dać mi znać, jeśli masz jakieś sugestie, jak połączyć te węzły w sposób hierarchiczny.

Odpowiedz

14

Zasadniczo wszystko w "OSM" jest "dowolne". Istnieją konwencje dotyczące tagowania, ale nie ma gwarancji, że ludzie się do nich przylgną. Musisz więc trochę wyczyścić dane i postprocessing, aby uzyskać spójne dane.

Co do relacji rodzic-dziecko, istnieją relacje nie podłączone na stałe w OSM inne niż:

  • węzeł jest używany przez jednego lub więcej sposobów
  • Węzeł jest członkiem jednego lub więcej Stosunki
  • droga jest członkiem jednego lub więcej stosunków
  • relacja jest członkiem jednego lub więcej stosunków

OSM relacje mogą być używane do definiowania relacji hierarchicznych, ale sposób, w jaki są one zdefiniowane, jest bardzo ogólny. Semantyka opiera się na konwencjach (zwykle opisywanych na stronach Wiki OSM).

Jeśli szukasz relacji "is_in", myślę, że musisz ją ustalić za pomocą metod geometrycznych. Na szczęście nie można polegać tylko na tagowaniu OSM.

+0

dzięki za odpowiedź, Igor. to użyteczne informacje i wygląda na to, że nie mogę polegać na strukturze danych OSM, aby uzyskać potrzebne dane. Myślę, że lepiej będzie, gdybym dostał moje dane z miejsca takiego jak geonames.org. – luke

+0

nie może wyszukać wszystkich węzłów, które mają granice otaczające punkt szczególny? na przykład jeśli masz ulicę, powinieneś znaleźć węzeł, taki jak miasto, województwo, powiat i kraj, ponieważ ich granice otaczają szerokość i długość geograficzną ulicy? – Tom

Powiązane problemy