Jak wyodrębnić sublestring z linestring z nakładającymi się segmentami

15

Opis problemu: Biorąc pod uwagę trasę autobusu (zdefiniowaną jako wykładzina ln.the_geom) i zestaw lokalizacji przystanków autobusowych (pt1.the_geom, pt2.the_geom, ... ptn.the_geom), podziel trasę autobusu na segmenty między przystankami autobusowymi . Korzystam z dwóch funkcji 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))

Powyższe działa dobrze, jeśli trasa autobusu nie ma pokrywających się odcinków. Jeśli jednak zachodzą na siebie sekcje, ST_line_locate_point przyciągnie punkt do drugiego końca oznaczenia linii. Na przykład: Autobus jedzie od A do B, wykonaj pętlę, a następnie jedzie od B do A. „A do B” i „B do A” to trasy równoległe, z wszystkimi punktami na siebie zachodzącymi. W przypadku przystanków autobusowych P1 i P2, P2 jest odwzorowywany zamiast tego w punkcie P2 '(w przeciwnym kierunku). W tym przypadku segment jest niepoprawnie wyodrębniany (jeśli uwzględniono dodatkowe segmenty).

Jak rozwiązać takie problemy? Nakładające się trasy autobusów mogą się zdarzyć na dowolnym odcinku trasy ... PRZYKŁAD

użytkownik35469
źródło
Czy istnieje sposób na określenie terminali linii autobusowych i podzielenie zamkniętego linii na linię w obu kierunkach? Wtedy nie będziesz już mieć nakładających się segmentów. Na przykład od początku możesz znaleźć najdalszy punkt na linii i oddzielić linię w dwóch kierunkach, używając tego punktu.
raphael
3
Stare pytanie, ale wygląda na to, że musisz zacząć i enpoint sekcji, połączyć się z zestawem danych punktów i usunąć dowolną sekcję, której początkowy punkt jest większy niż punkt końcowy. Czy to ma jakiś sens?
Jorge Sanz
1
Czy podasz geometrię WKT dla danej trasy autobusu?
kttii

Odpowiedzi:

1

Zakładając, że trasa autobusu zachodzi na siebie nie więcej niż 2 razy w danym punkcie, można to rozwiązać, odwracając linię dla punktu lokalizacji drugiej linii, lokalizując najbliższy punkt najbliższy końca linii. Musisz odjąć to od 1, aby użyć w zapytaniu ST_LineSubstring. Na przykład

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
źródło