Как извлечь подстроку из подстроки с перекрывающимися сегментами

15

Постановка проблемы: учитывая маршрут автобуса (определяемый как линейная линия 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 '(в противоположном направлении). В этом случае сегмент извлекается неправильно (если включены дополнительные сегменты).

Как решить такие проблемы? Перекрывающиеся автобусные маршруты могут происходить на любом участке маршрута ... ПРИМЕР

user35469
источник
Есть ли способ для вас, чтобы определить конечные точки ваших автобусных маршрутов и разделить закрытую линию в одну сторону в любом направлении? Тогда у вас больше не будет перекрывающихся сегментов. Например, вы можете найти самую дальнюю точку на линии от начала и разделить вашу линию на два направления, используя эту точку.
Рафаэль
3
Старый вопрос, но, похоже, вам нужно получить начало и конец сечений, объединить с набором данных точек и удалить все сечения с начальной точкой, упорядоченной больше, чем конечная точка. Имеет ли это какой-то смысл?
Хорхе Санз
1
Не могли бы вы предоставить геометрию WKT для данного автобусного маршрута?
kttii

Ответы:

1

Предполагая, что маршрут автобуса перекрывает себя не более 2-х раз в любой заданной точке, тогда это можно решить, изменив линию для точки определения местоположения второй линии, найдя ближайшую точку, ближайшую к концу линии. Вам нужно будет вычесть это из 1, чтобы использовать в запросе ST_LineSubstring. Например

ST_LineSubstring(ln.the_geom,
  ST_LineLocatePoint(ln.the_geom, pt1.the_geom),
  1 - ST_LineLocatePoint(ST_Reverse(ln.the_geom), pt2.the_geom))
Натан Лоуренс
источник