2011-09-16 9 views
12

Voglio scrivere uno script che analizzi i file XML OpenStreetMap (OSM) e costruisca un database di città e città in modo gerarchico. Voglio che i set di dati risultante di avere una gerarchia che potrebbe apparire come questo negli Stati Uniti:Come posso estrarre dati gerarchici di città/stato/paese dai file del pianeta XML OSM?

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

e forse in questo modo nel Regno Unito:

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

L'uscita sarà un documento JSON che descrive una gerarchia per tutte le città nel file OSM, con una struttura come gli esempi sopra.

Sto usando Python e la libreria parser "imposm" e posso caricare e analizzare il file senza problemi; il mio problema è la mancanza di comprensione di come sono strutturati i dati OSM: non so come conoscere la relazione genitore/figlio tra i nodi nei dati di OSM. Per esempio, se trovo il nodo per "Soho", come posso legarlo ai nodi per "City of Westminster", "Greater London", "Middlesex" e "England"?

So che alcuni nodi hanno un tag "is_in" che potrebbe dare alcune di queste informazioni, ma

  • A) questo è incoerente e
  • B) sembra essere un testo in formato libero campo, non un collegamento a un nodo OSM (ad esempio is_in: "City of Westminster" non mi fornisce alcun collegamento al nodo di Westminster).

Per favore fatemi sapere se avete suggerimenti su come collegare questi nodi gerarchicamente.

risposta

14

Fondamentalmente tutto è "a forma libera" in OSM. Ci sono convenzioni sul tagging, ma non vi è alcuna garanzia che le persone si attengano a loro. Quindi dovrai fare un po 'di pulizia e post-elaborazione dei dati per ottenere qualcosa di coerente.

Per quanto riguarda i rapporti tra genitori e figli, non ci sono rapporti non cablati in OSM diversi:

  • Un nodo è utilizzato da uno o più modi
  • Un nodo è un membro di uno o più relazioni
  • un modo è un membro di una o più relazioni
  • una relazione è un membro di una o più relazioni

OSM le relazioni possono essere utilizzate per definire relazioni gerarchiche, ma il modo in cui vengono definite è molto generico. La semantica è basata su convenzioni (di solito descritte nelle pagine Wiki di OSM).

Se stai cercando una relazione "is_in", penso che dovrai stabilirlo utilizzando metodi geometrici. Sfortunatamente, non puoi davvero fare affidamento solo sui tag OSM per questo.

+0

grazie per la risposta, Igor. sono informazioni utili e sembra che non possa fare abbastanza affidamento sulla struttura dei dati OSM per ottenere i dati di cui ho bisogno. Penso che sia meglio ottenere i miei dati da qualche parte come geonames.org. – luke

+0

non può cercare tutti i nodi che hanno confini che circondano il punto di interesse? per esempio. se hai una strada, dovresti trovare nodi come città, provincia, distretto e nazione perché i loro confini circondano la latitudine e la posizione della longitudine della strada? – Tom

Problemi correlati