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:
(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,
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 :) –
Ecco un'altra domanda simile su stackoverflow: http://stackoverflow.com/questions/12965090/get-list-of-all-intersections-in-a-city/18385182 – tyr