Come semplificare una rete instradabile?


24

Ho un grafico di rete che devo semplificare nel senso di ridurre il numero di spigoli . L'idea sarebbe quella di unire i nodi che si trovano vicini e rimuovere i bordi corti di collegamento.

Come è possibile ottenere questo risultato in PostGIS o GRASS? O ci sono approcci migliori per semplificare automaticamente una rete come questa?

Ho già provato la funzione ST_SnapToGrid ma non sono contento dei risultati (grigio = originale, nero = snapped):

inserisci qui la descrizione dell'immagine


1
Lo stai facendo per semplificare un'analisi basata sulla rete o per scopi di visualizzazione? Se è il primo, quale analisi verrà eseguita?
whuber

È per l'analisi del percorso più breve.
underdark

2
Poiché molti degli algoritmi del percorso più breve sono O (E + V), forse non hai nemmeno bisogno di questa semplificazione? All'altro estremo, per tali analisi è spesso possibile effettuare semplificazioni drasticamente più aggressive. Ad esempio, quell'insieme di tre segmenti paralleli e i relativi segmenti adiacenti a sinistra (che sembrano una scatola orizzontale) può essere sostituito da un triangolo se nessuna origine o destinazione si trova all'interno di tali segmenti. Ne parlo perché sono sicuro che esiste un codice (non GIS) per tali operazioni su grafici (astratti).
whuber

Vuoi mantenere la geometria dei bordi (ad es. Curve) o è sufficiente mantenere la topologia + nodo XY? Inoltre, è necessario assicurarsi che i nodi su Z diverse (ad es. Cavalcavia) non si aggancino?
AnserGIS,

La topologia è la chiave. La geometria può cambiare un po '. L'ordine Z deve rimanere intatto.
underdark

Risposte:


7

Il più vicino a cui sono arrivato finora è questo:

v.clean input=roads output=snap5rmline tool=snap,rmline thresh=5 

Sta facendo scattare le strade con una tolleranza di 5 metri e rimuovendo tutte le linee di lunghezza zero. Non è una soluzione ottimale poiché sembra agganciare in modo piuttosto casuale a qualche vertice.

inserisci qui la descrizione dell'immagine


In effetti, il risultato forse non è accurato ma l'uso di v.clean è interessante, grazie per la condivisione
simo

Quell'immagine è stata creata nell'erba?
NetConstructor.com il

L'immagine mostra i risultati di GRASS v.clean visualizzati in QGIS.
underdark

Problemi con il mantenimento di "strane intersezioni" o strade separate di pendenza?
Dassouki,

Che ne dici di elaborare ST_SnapToGrid dopo v.clean?
kttii,

5

Hai provato GRASS v.generalize ?

v.generalizeconsente di scegliere l'algoritmo di generalizzazione con l' attributo method . Ce ne sono un sacco: douglas, douglas_reduction, lang, riduzione, reumann, boyle, slide_averaging, distance_weighting, chaiken, hermite, snake, network, displacement .

E parametri aggiuntivi come threshold, degree_thresh, angle_thresh(a seconda dell'algoritmo scelto) può aiutare a ottenere un risultato preciso.

Ecco un tutorial .


Grazie per il link. Ci sto provando anche se non riesco davvero a capire quale combinazione di metodi e valori di soglia darà il risultato che sto cercando.
underdark

Non riesco davvero a trovare un metodo v.generalize che farà quello che voglio.
underdark

2
È un peccato, il comando è ricco di molti algoritmi ma, come hai detto prima, è probabilmente abbastanza complesso da impostare per ottenere il risultato atteso. Forse un guru di algoritmi di generalizzazione, qui? Hai provato anche il metodo dei serpenti ?
simo

Non un algo-guru qui, ma trovo il metodo dei serpenti il ​​migliore per alcune delle mie corse v.genralize che ho fatto in passato.
Maning

1
Per la cronaca, i parametri sono stati semplificati da oggi in GRASS SVN. Per entrare a far parte di GRASS 6.4.2.
markusN

4

Non l'ho fatto ma penso di poter suggerire una direzione.

  1. Crea una topologia con PostGIS per il tuo grafico.
  2. Trova tutti i nodi con solo due bordi.
  3. Guarisci i bordi.

ST_ModEdgeHeal fonderà un bordo nell'altro. ST_NewEdgeHeal sostituirà entrambi con un nuovo vantaggio.

Manuale di topologia PostGIS


Grazie @Sean. Farà altro che unire due bordi? Qualche idea su come rimuovere i bordi corti e agganciare i loro nodi insieme?
underdark

@Underdark, non vedo niente di semplice. Potresti fare tutto in PL / SQL ma probabilmente non aiuta. Puoi eseguire prima ST_SnapToGrid?
Sean,

1

@underdark, vedo che hai scritto uno strumento per densificare le linee in Sextante. Pertanto suggerisco il seguente algoritmo per evitare lo snap "casuale" di uno dei tuoi punti.

Seleziona i segmenti di linea che vuoi eliminare in base alla loro lunghezza.

Per ciascuno di quei segmenti, crea un punto nel punto centrale

Elimina il segmento piccolo

Ora puoi usare ST_Snap in PostGIS (vedi esempio qui )

EDIT: nota che nel tuo caso, potresti anche usare prima v.net per rimuovere gli pseudo-nodi (nodo che collega solo due linee)


Elaborare come v.net può essere utilizzato per rimuovere gli pseudo-nodi. Grazie
osmjit,

0

Inoltra come Michaël Michaud ha analizzato questo nell'elenco degli sviluppatori di OpenJUMP:

> Interesting question. There has been so much research works about
> generalization that it is surely not a simple task. I have tested the
> following approach with mitigated results :
> - make the layer planar with the noder plugin
> - detect small cycles with the graph plugin
> - merge adjacent cycles
> - create a point inside each cycles surface
> - remove network segments along these cycles (query + DE-9IM)
> - detect roads touching the cycles
> - project the center points of cycles to the road endpoints ==> replace small roundabout by simple nodes
> 
> Possible improvements (probably need a dedicated plugin)
> - make it work on non planar graph (or just remove bridges/tunnels from the graph)
> - replace small edges between two nodes with degree 3+ by a single node,    not only small cycles
> - process iteratively starting with smallest edges/cycles

Grazie per aver pubblicato questa risposta. Sono un po 'confuso perché dovresti forzare il grafico a planare. Dopotutto, le reti stradali non sono grafici planari (ponti, tunnel).
underdark

Solo perché Michaël ha effettuato un test rapido con gli strumenti grafici esistenti che ha scritto per OpenJUMP e al momento non supportano grafici non planari. Salta il primo passo se QGIS e GRASS hanno strumenti simili che supportano grafici non planari.
user30184

Penso che questo sia l'approccio giusto: separare la rete in grafici planari. In ogni grafico planare il problema è più semplice, ad esempio si potrebbe usare l'approccio sopra o semplicemente triangolare e diserbare la TIN dei bordi stradali corti. Quindi estrarre nuovamente i bordi della strada e unire gli strati.
AnserGIS,
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.