Чи є функція PostGIS для визначення того, чи перетинається лінія рядків?


16

Я шукав функцію, яка може сказати мені, чи перетинається LineString. Я st_intersectsдва рази намагався дзвонити з тією ж LineString, але очевидно однакові рядки рядків будуть перетинатися. У моєму плані, якщо немає функції, було б отримати всі точки в рядку рядка та створити окремі рядки рядків, а потім перевірити кожну нову рядкову рядок одна проти одної з st_intersects. Я не хочу, щоб це дійшло до цього, але боюся, що це станеться.

Чи існують функції PostGIS для перевірки того, що рядкова лінія є самопересічною? Це має бути подібним до з'ясування того, чи є багатокутник складним, я вважаю


Тут з’явилася друга відповідь, яка не дуже допомогла мені подумати PostGIS, але вона містила посилання на корисну інформацію про проблему в цілому. Здається, його видалено. Хтось має це посилання?
Джефф

Відповіді:


14

Ви можете перевірити наявність самопересічного рядка за допомогою ST_IsSimple(geom):

SELECT ST_IsSimple('LINESTRING (50 50, 150 150, 50 150, 150 50)');
 st_issimple
-------------
 f
(1 row)

Самоперехрестя на POINT (100,0 100,0)

Нагорі зображення та підписи надсилаються від JTS TestBuilder (натисніть "Простий?")

Самоперехрестя при POINT ( 100.0 100.0 )

Це можна виправити за допомогою ST_UnaryUnion(geom)(починаючи з PostGIS 2.0), який повертає дійсну / просту трирядну багаторядкову рядок:

MULTILINESTRING((50 50, 100 100), 
  (100 100, 150 150, 50 150, 100 100), 
  (100 100, 150 50))

Це прекрасно! Я знав, що відповідь повинна бути такою простою. Ви сказали, що використовували JTS Testbuilder для створення зображення. Чи є у вас шлях у Постгісі, щоб дістати точку / точки перетину?
Джефф

Це складна деталь. JTS TestBuilder має CheckNoding, але це знаходить лише одну координату вузла на виклик, а не MULTIPOINT. Я не впевнений, що точно впевнений, як отримати точки (а) вузлів за допомогою PostGIS.
Майк T
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.