Qual è un modo efficace per rilevare incroci stradali su una mappa?


14

Potrei ricevere mappe da qualsiasi fonte per il mio progetto, e per l'algoritmo C ++ che sto realizzando, è indispensabile che l'algoritmo sappia dove si trovano i nodi stradali (nodi in cui si incontrano più di due segmenti stradali). Inoltre, in molte delle mappe che ottengo, ci sono strade che saltano e non funzionano (cioè: le strade non sono collegate correttamente). Un modo per correggere il problema è "ripulendo" la rete stradale utilizzando Autocad. Le domande che ho sono:

  1. Esiste un modo efficiente (qualche software in grado di farlo?) Per ottenere la mia mappa in un formato GML, che contiene informazioni sugli incroci stradali nella mappa? (forse ha un tag GML che dice che un nodo particolare è una giunzione)
  2. Esiste un altro modo per "ripulire" la rete stradale?

I colleghi hanno suggerito FME, ma ciò comporta la scrittura di script e non siamo sicuri che lo script sia abbastanza flessibile da soddisfare tutte le mappe. L'unico altro modo per rilevare giunzioni è usare la forza bruta e trovare quali segmenti stradali hanno nodi comuni. ArcGIS sarebbe d'aiuto? (non l'ho usato, ma ne ho sentito parlare) Sono sicuro che dovrebbe esserci un modo migliore ...


2
Deve trovare strade che si intersecano da sole? Come dovrebbe gestire le geometrie degenerate (polilinee in cui tutti i vertici coincidono quindi con lunghezza zero). Come dovrebbe gestire le linee coincidenti in cui l'intersezione è un segmento lineare e non solo un punto?
Kirk Kuykendall,

@Kirk: sono un po 'scioccato dalle situazioni che hai citato. Sono nuovo di GIS e non sapevo nemmeno che esistessero tali possibilità. 1. L'intersezione personale richiede più segmenti. A meno che non sia un cavalcavia, considererei tali incroci come incroci. 2. Non sono nemmeno in grado di visualizzare cos'è la geometria degenerata, quindi non so cosa rispondere. 3.Le linee coincidenti dovrebbero essere trattate come due strade separate perché è così che presumo che sarebbero anche nella vita reale.
Nav

Risposte:


9

Se hai le strade in una forma spaziale, come uno Shapefile, puoi caricarle in PostGIS e trovarle automaticamente usando una query SQL. L'ho già fatto in precedenza: l'istruzione SQL è progettata per trovare per ogni strada quelli che si intersecano geograficamente e creano un punto nodale per ogni incrocio.

Proverò a ripulirlo più tardi, ma ecco il flusso di base che puoi prendere ...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

Le funzioni ST_ * sono ciò che fa funzionare questo in PostGIS

  • ST_Envelope : prende il riquadro di delimitazione di una determinata geometria: viene utilizzato per accelerare l'algoritmo. Si può restringere una ricerca geografica con i riquadri di delimitazione in un passaggio rapido ma meno accurato e quindi scansionare i risultati con le geometrie effettive.
  • ST_Intersects : determina se due geometrie si intersecano
  • ST_Intersection : restituisce l'intersezione di due geometrie

I seguenti sono solo frammenti poiché non ho tempo di finire, forse qualcuno può modificarlo prima di tornare qui ...

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id

Solo condivisione: un altro database che ho trovato è questo: < oracle.com/technetwork/database/berkeleydb/overview/index.html >. Apparentemente le query sono molto veloci perché le query sono disponibili come librerie che possono essere incorporate nell'applicazione.
Nav

1
@ dmsnell- Forse potresti fornire un esempio del tipo di query SQL utilizzata per eseguire questa attività?
RyanKDalton,

11

Puoi analizzare le polilinee in modi sorprendenti usando i buffer. Questo di solito è inefficiente - i buffer creano molti vertici aggiuntivi - ma (a) è una tecnica disponibile in molti GIS (vettoriali o basati su raster) e (b) a volte può produrre informazioni che altrimenti sarebbero difficili da ottenere.

In questo caso, tamponare la strada di una piccola quantità e quindi tamponare con il negativo della stessa quantità lascia piccole "isole" attorno a tutte le curve e intorno a tutte le intersezioni. È facile dimostrarlo geometricamente.

Ecco un esempio di un buffer di polilinea da 10 m (grigio) e del suo buffer di -10 m (rosso chiaro) in una mappa larga 650 m:

Figura 1

Ora intersecare il livello di polilinea originale con questi poligoni dell'isola, unire i segmenti per identificatore dell'isola e contare i pezzi:

figura 2

I segmenti di colore giallo chiaro indicano i pezzi di alto conteggio e i segmenti di ciano scuro indicano quelli di basso conteggio. In questo modo abbiamo (a) trovato tutte le curve e intersezioni (comprese le autointersezioni) e le giunzioni vicine (vedere l'estrema sinistra, dove i due segmenti non si incontrano del tutto)) e (b) differenziarono le curve dalle intersezioni. Possiamo trovare le quasi giunzioni selezionando le isole che contengono due o più segmenti collegati: le curve contengono solo segmenti collegati.

A causa della simmetria del buffering, i centroidi delle isole di intersezione sono i punti di intersezione.

Un aspetto bellissimo di questo stile di analisi è che non importa come viene rappresentata la polilinea sottostante: potrebbe essere una singola funzione, potrebbe essere una caratteristica per ogni segmento di linea o qualsiasi altra via di mezzo.


6

Sì, potresti farlo con FME di sicuro. Esistono molti "trasformatori" che gestiscono cleanup, intersezioni e topologia; Vorrei provare il trasformatore TopologyBuilder in questo caso.

Qualsiasi scripting è tutto fatto in un ambiente grafico, quindi è molto semplice da fare.

Puoi sempre ottenere una versione di prova da www.safe.com

(Informativa: Mark Ireland, aka FME Evangelist, Safe Software Inc.)


Io secondo questo. FME è ottimo per questo particolare problema, sia la trasformazione da AutoCAD in GML sia la pulizia topologica. Può essere sorprendentemente universale nella sua applicazione.
blord-castillo,


-1

L'analista di reti Arcgis, che puoi ottenere con una prova gratuita, lo fa in meno di 10 secondi e con pochi clic.


-1

Il processo può essere eseguito in ArcGIS con analista di rete.

C'è anche un altro modo in ArcGIS: puoi seguire i seguenti passaggi: "Arctoolbox" → "Strumenti di gestione dei dati" → "caratteristiche" → "caratteristiche vertici ai punti" e lì puoi fare ciò di cui hai bisogno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.