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.