Extrahieren von Sublinestring aus einem Linestring mit überlappenden Segmenten

15

Problemstellung: Teilen Sie die Busroute bei einer gegebenen Busroute (definiert als Linienfolge in der Bushaltestelle) und einer Reihe von Bushaltestellen (pt1.the_geom, pt2.the_geom, ... ptn.the_geom) in Segmente zwischen Bushaltestellen auf . Ich benutze zwei Postgis-Funktionen

    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))

Das oben Genannte funktioniert gut, wenn die Busroute keine überlappenden Abschnitte aufweist. Wenn sich Abschnitte überlappen, fängt der ST_line_locate_point jedoch einen Punkt am anderen Ende der Linienfolge. Beispiel: Der Bus fährt von A nach B, bildet eine Schleife und fährt dann von B nach A. "A nach B" und "B nach A" sind parallele Routen, bei denen sich alle Punkte überlappen. Bei den Bushaltestellen P1 und P2 wird P2 stattdessen auf den Punkt P2 'abgebildet (in der entgegengesetzten Richtung). In diesem Fall wird das Segment falsch extrahiert (wenn zusätzliche Segmente enthalten sind).

Wie kann man solche Probleme lösen? Die überlappenden Buslinien können auf jedem Streckenabschnitt vorkommen ... BEISPIEL

user35469
quelle
Gibt es eine Möglichkeit, die Termini Ihrer Busrouten zu identifizieren und die geschlossene Linienfolge in beide Richtungen in eine Linie aufzuteilen? Dann haben Sie keine überlappenden Segmente mehr. Beispielsweise könnten Sie den am weitesten entfernten Punkt auf der Linie von Anfang an finden und Ihre Linie mit diesem Punkt in zwei Richtungen trennen.
Raffael
3
Alte Frage, aber es sieht so aus, als müssten Sie Start und Endpunkt von Abschnitten abrufen, sich mit dem Punktedatensatz verbinden und alle Abschnitte entfernen, deren Anfangspunktreihenfolge größer als der Endpunkt ist. Ergibt das irgendeinen Sinn?
Jorge Sanz
1
Geben Sie bitte die Geometrie WKT für die angegebene Busroute an.
kttii

Antworten:

1

Angenommen, die Busroute überlappt sich an einem bestimmten Punkt nicht öfter als zweimal, dann könnte dies gelöst werden, indem die Linie für den Ortungspunkt der zweiten Linie umgekehrt wird und der dem Ende der Linie nächstgelegene Punkt lokalisiert wird. Sie müssen diesen Wert von 1 subtrahieren, um ihn in der ST_LineSubstring-Abfrage zu verwenden. Z.B

ST_LineSubstring(ln.the_geom,
  ST_LineLocatePoint(ln.the_geom, pt1.the_geom),
  1 - ST_LineLocatePoint(ST_Reverse(ln.the_geom), pt2.the_geom))
Nathan Lawrence
quelle