Як витягнути підрядну лінію з рядкової лінії з перекриваються сегментами


15

Постановка проблеми: З огляду на маршрут автобуса (визначений як рядок ln.the_geom) та набір місць зупинки автобуса (pt1.the_geom, pt2.the_geom, ... ptn.the_geom), розділіть маршрут автобуса на сегменти між автобусними зупинками . Я використовую дві функції постгіс

    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 '(у зворотному напрямку). У цьому випадку сегмент вилучається неправильно (куди входять додаткові сегменти).

Як вирішити подібні проблеми? Автобусні маршрути, що перекриваються, можуть статися на будь-якій ділянці маршруту ... ПРИКЛАД


Чи є спосіб визначити терміни автобусних маршрутів і розділити закриту лінію рядка на лінію в будь-якому напрямку? Тоді у вас більше не буде сегментів, що перекриваються. Наприклад, ви могли знайти найдальшу точку на лінії від початку та розділити лінію на два напрямки, використовуючи цю точку.
raphael

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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.