Существует ли функция 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)

Самопересечение в ТОЧКЕ (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 для создания образа. Есть ли какой-нибудь способ, которым вы знаете в Postgis, чтобы получить точку / точки пересечения?
Джефф
Это сложная деталь. JTS TestBuilder имеет CheckNoding, но он находит только одну координату узла на вызов, а не MULTIPOINT. Я не уверен, точно уверен, как получить точку (ы) кодирования с PostGIS.
Майк Т