Постановка проблемы: учитывая маршрут автобуса (определяемый как линейная линия ln.the_geom) и набор местоположений автобусных остановок (pt1.the_geom, pt2.the_geom, ... ptn.the_geom), разделите маршрут автобуса на сегменты между автобусными остановками , Я использую две функции 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))
Вышеуказанное хорошо работает, если маршрут автобуса не имеет перекрывающихся участков. Однако, если есть перекрывающиеся секции, ST_line_locate_point привязывает точку к другому концу линейной строки. Например: автобус путешествует из А в В, совершает петлю, а затем из В в А. «А в В» и «В в А» - это параллельные маршруты, все точки которых перекрываются. В случае автобусных остановок P1 и P2, P2 вместо этого отображается в точку P2 '(в противоположном направлении). В этом случае сегмент извлекается неправильно (если включены дополнительные сегменты).
Как решить такие проблемы? Перекрывающиеся автобусные маршруты могут происходить на любом участке маршрута ...
источник
Ответы:
Предполагая, что маршрут автобуса перекрывает себя не более 2-х раз в любой заданной точке, тогда это можно решить, изменив линию для точки определения местоположения второй линии, найдя ближайшую точку, ближайшую к концу линии. Вам нужно будет вычесть это из 1, чтобы использовать в запросе ST_LineSubstring. Например
источник