2013-02-05 12 views
7

Sto cercando un modo per recuperare gli incroci stradali con precisione dai dati OpenStreetMap (OSM). Sono consapevole che domande e domande simili sono state poste e risposte, ma i dati che potrei recuperare dal metodo suggerito non sono molto accurati.Come posso trovare un elenco di intersezioni stradali dai dati OpenStreetMap?

Prima di tutto, io sono a conoscenza di seguenti domande:

Le risposte alle domande di cui sopra suggeriscono di:

"Query tutto modi in un determinato rettangolo di selezione e cercare nodi condivisi da due o più modi come exp coniato nell'altra risposta. "

Ho seguito questo suggerimento e ha scritto uno script python che estrae gli elementi di nodo da un file XML (file OSM) che ho scaricato da OpenStreetMap. Di seguito è riportato il codice:

try: 
    from xml.etree import cElementTree as ET 
except ImportError, e: 
    from xml.etree import ElementTree as ET 

def extract_intersections(osm, verbose=True): 
    # This function takes an osm file as an input. It then goes through each xml 
    # element and searches for nodes that are shared by two or more ways. 
    # Parameter: 
    # - osm: An xml file that contains OpenStreetMap's map information 
    # - verbose: If true, print some outputs to terminal. 
    # 
    # Ex) extract_intersections('WashingtonDC.osm') 
    # 
    tree = ET.parse(osm) 
    root = tree.getroot() 
    counter = {} 
    for child in root: 
     if child.tag == 'way': 
      for item in child: 
       if item.tag == 'nd': 
        nd_ref = item.attrib['ref'] 
        if not nd_ref in counter: 
         counter[nd_ref] = 0 
        counter[nd_ref] += 1 

    # Find nodes that are shared with more than one way, which 
    # might correspond to intersections 
    intersections = filter(lambda x: counter[x] > 1, counter) 

    # Extract intersection coordinates 
    # You can plot the result using this url. 
    # http://www.darrinward.com/lat-long/ 
    intersection_coordinates = [] 
    for child in root: 
     if child.tag == 'node' and child.attrib['id'] in intersections: 
      coordinate = child.attrib['lat'] + ',' + child.attrib['lon'] 
      if verbose: 
       print coordinate 
      intersection_coordinates.append(coordinate) 

    return intersection_coordinates 

Se corro questo codice con i dati ho esportato da OSM (esempio, ho usato i dati esportati Area di esportazione da: Min Lat: 38,89,239 mila, Max Lat: 38,89,981 mila, Min Lon : -77,03212, e Max Lon:. -77,02119), esso stampa le coordinate che assomigliano:

38.8966440,-77.0259810 
38.8973430,-77.0280900 
38.9010391,-77.0270309 
38.8961050,-77.0319620 
... 

Se io tracciare queste coordinate su Google Maps, sembra che: enter image description here

(io ho usato http://www.darrinward.com/lat-long/ per tracciare i dati.) A quanto pare i dati contiene alcuni nodi che sono non intersezioni (probabilmente sono negozi che si trovano ad affrontare verso due steets.)

sto facendo qualcosa di sbagliato o è questo il migliore "intersezione" dati I può ottenere da OSM? Apprezzo il tuo aiuto e i tuoi commenti.

migliore,

+0

Sto cercando di fare qualcosa di simile a te. Attualmente estraggo tutti i nodi dal tag 'ways' per autostrade del tipo autostrade (in seguito includerò altri tipi di autostrada --- primaria, secondaria ecc.). (in un dizionario python con chiave essendo il modo in cui id e valori sono la lista di nodi) Usando il tuo post, sto affrontando lo stesso tuo problema.Potresti per favore fammi sapere come posso ottenere tutti i nodi che si intersecano nel modo in cui tipo ---- Autostrada --- Solo autostrada ?? Qualsiasi aiuto sarà apprezzato :) –

+0

Ecco un'altra domanda simile su stackoverflow: http://stackoverflow.com/questions/12965090/get-list-of-all-intersections-in-a-city/18385182 – tyr

risposta

4

Prima Tipp:

Non solo confrontare con Google Maps, confrontare le vostre coordinate principalmente con visualizzazione OpenStreetMap. Gli attraversamenti stradali particolarmente complessi, sebbene rappresentino la stessa strada, possono essere modellati in modo diverso.

2): Guarda se stai davvero utilizzando il giusto tipo di modi: Sono quei percorsi a piedi, mescolati con le strade? Esistono vari tipi, con differenti attributi: accessibili per i veicoli, ecc. In Google MAps, le strade bianche sono quelle accessibili dai veicoli

3) Per ulteriori informazioni, se non si mescolano poligoni di casa.

+0

Ciao AlexWien , Grazie mille! (1) Sì, lo terrò a mente. (2) e (3) Avevi ragione, ho mescolato diversi tipi di strade. Ho estratto strade e ora è stato risolto :) Grazie ancora :) – Kotaro

+1

@ Kotaro: Come hai finalmente risolto questo? Qual è il modo di estrarre strade? – statBeginner

+1

@statBeginner: Nel codice precedente che estrae gli elementi '', ho finito per filtrare gli elementi di autostrada che non sono necessari (ad es. 'Footway'). Più in particolare, utilizzo 'autostrada',' tronco', 'primario',' secondario', 'tertialy' e' residenziale'. Vedi http://wiki.openstreetmap.org/wiki/Key:highway – Kotaro

Problemi correlati