Come estrarre la linea secondaria da una stringa lineare con segmenti sovrapposti


15

Dichiarazione del problema: data una linea di autobus (definita come linestring ln.the_geom) e una serie di posizioni delle fermate di autobus (pt1.the_geom, pt2.the_geom, ... ptn.the_geom), dividere la rotta del bus in segmenti tra le fermate . Sto usando due funzioni postgis

    ST_line_substring(ln.the_geom,ST_line_locate_point
    ln.the_geom,pt1.the_geom),ST_line_locate_point(ln.the_geom,pt2.the_geom))

Quanto sopra funziona bene se il percorso del bus non ha sezioni sovrapposte. Tuttavia, se sono presenti sezioni sovrapposte, ST_line_locate_point eseguirà lo snap di un punto sull'altra estremità della stringa lineare. Ad esempio: il bus viaggia da A a B, crea un loop, quindi viaggia da B a A. "A a B" e "B a A" sono percorsi paralleli con tutti i punti sovrapposti. In caso di fermate bus P1 e P2, P2 viene invece mappato nel punto P2 '(nella direzione opposta). Il segmento viene estratto in modo errato in questo caso (in cui sono inclusi segmenti extra).

Come risolvere problemi come questo? Le linee di autobus sovrapposte possono verificarsi in qualsiasi sezione del percorso ... ESEMPIO


Esiste un modo per identificare i termini delle linee del bus e dividere la linea chiusa in una linea in entrambe le direzioni? Quindi non avrai più segmenti sovrapposti. Ad esempio, potresti trovare il punto più lontano sulla linea dall'inizio e separare la linea in due direzioni usando quel punto.
Raffaello,

3
Vecchia domanda ma, sembra che tu abbia bisogno di iniziare e enpoint di sezioni, unirti al set di dati punti e rimuovere qualsiasi sezione con un ordine iniziale di ordine superiore al punto finale. Questo ha senso?
Jorge Sanz,

1
Fornirai la geometria WKT per il percorso del bus indicato?
kttii,

Risposte:


1

Supponendo che il percorso del bus non si sovrapponga più di 2 volte in un dato punto, questo potrebbe essere risolto invertendo la linea per il punto di localizzazione della seconda linea, individuando il punto più vicino più vicino alla fine della linea. Dovrai sottrarlo da 1 per utilizzarlo nella query ST_LineSubstring. Per esempio

ST_LineSubstring(ln.the_geom,
  ST_LineLocatePoint(ln.the_geom, pt1.the_geom),
  1 - ST_LineLocatePoint(ST_Reverse(ln.the_geom), pt2.the_geom))
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.