PgRouting - Come tagliare i collegamenti quando si raggiungono i costi massimi?


13

Ho un file di forma polilinea che rappresenta una rete stradale e un secondo file di forma contenente punti. Vorrei utilizzare PostGIS (presumibilmente PgRouting) per identificare sottoreti o aree di servizio che si irradiano da questi punti.

In sostanza, spero di porre la domanda: "A partire dal punto X, fino a che punto potrei camminare in una determinata direzione, dato un budget totale di viaggio di 1 km, seguendo la rete stradale?" Il risultato sarebbe una serie di polilinee ritagliate che rappresentano la gamma totale di possibilità di viaggio, dato un budget di viaggio di 1 km.

Per riferimento, questa analisi GRASS sembra essere esattamente ciò che voglio fare (tranne che voglio farlo in PostGIS): http://www.gdf-hannover.de/lit_html/grass60_v1.2_en/node57.html#sec: optalloc

Il prossimo esempio sembra essere quasi quello che voglio fare, tranne per il fatto che sembra rispondere alla domanda "su quali nodi potrei viaggiare con un budget di viaggio di X distanza?" http://underdark.wordpress.com/2011/02/12/drive-time-isochrones/

La seconda non è proprio la risposta che sto cercando, poiché voglio che le polilinee siano tagliate alla mia distanza di viaggio - non mi interessa se riesco a raggiungere un nodo.


Un'opzione che mi viene in mente è quella di dividere in qualche modo le mie polilinee in molti punti. Questo mi avvicina alla risposta giusta, ma sembra piuttosto confuso, e ancora non mi porta abbastanza lì.
Peter,

Risposte:


2

Un pensiero che avevo era quello di 1) eseguire la routine driving_distance e 2) utilizzare la routine "points_as_polygon" di pgRouting (che chiama la funzione alfahahape) per generare i poligoni più piccoli a determinate distanze di costo in base ai punti della routine driving_distance ritorna. Quindi potresti selezionare tutte le strade all'interno dei poligoni che ti darebbero un'idea generale del viaggio.

Se non hai seguito la discussione sull'elenco degli utenti di pgRouting , hanno discusso di più opzioni di recente (discussioni di maggio e giugno 2011).


1
Discussioni interessanti sull'elenco utenti. Peccato che la funzione driving_distance sia difettosa.
underdark

1

Poiché questo è davvero un problema di grafico, ciò di cui hai bisogno è la connettività / topologia + informazioni sui costi. Per pg_routing, questa è la tabella che si invia agli algoritmi del percorso più breve. Questo articolo contiene informazioni su come costruirne uno (suppongo che tu ne abbia già uno). Mi dispiace non posso dare la tua funzione esatta in pg_routing che lo fa, ma scriverne uno dovrebbe essere fattibile. Tuttavia, posso dirti che se continui a chiamare ripetutamente il percorso più breve, stai facendo ripetutamente l'algoritmo sottostante e distruggendo il risultato - non è affatto efficiente.

La soluzione diventa quindi camminare su ogni lato aggiungendoli a una "lista di percorsi" e calcolando un costo fino a quando il budget (ovvero la distanza) non viene superato. Se il budget è accettabile (ovvero il budget non è stato elaborato), si aggiunge anche la geometria a un "sacchetto della geometria dell'elenco accettabile". Devi elaborare ogni bordo esattamente una volta. Per l'ultimo taglio (in cui i budget vengono sovraccaricati), è necessario ottenere la lunghezza e interpolare la distanza esatta che si desidera percorrere , quindi aggiungere il risultato alla "lista accettabile". Il tuo risultato è l' unione di quella borsa geometrica.


1
C'è una sottigliezza nell'ultimo passaggio: alcuni bordi potrebbero essere raggiunti da uno dei suoi punti finali. Ciò può causare l'inclusione di parti di entrambe le estremità o persino dell'intero bordo, anche se attraversare l'intero bordo da uno dei due punti eccederà il limite di budget. Ad esempio, considerare il viaggio dal punto a lungo un grafico non orientato con bordi di lunghezza unitaria {(a, b), (a, c), (b, c)} e un budget di 1.6. È possibile raggiungere sia b o c ad un costo di 1, con 0,6 da spendere. Ciò rende accessibile ogni punto lungo il bordo (b, c).
whuber

Hai ragione :) +1
Ragi Yaser Burhum,

1

"A partire dal punto X, fino a che punto potrei camminare in una determinata direzione, dato un budget totale di viaggio di 1 km, seguendo la rete stradale?"

Dato che devi considerare solo una piccola regione (raggio di 1 km al massimo), potresti probabilmente cavartela dividendo i collegamenti in più piccoli pezzi (a seconda dell'accuratezza che desideri ottenere) e creando i nodi necessari. Le reti "ad alta risoluzione" risultanti dovrebbero essere ancora gestibili.

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.