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