¿Existe una función PostGIS para determinar si una cadena lineal se intersecta?

16

He estado buscando una función que pueda decirme si LineString se cruza entre sí. He intentado llamar st_intersectscon la misma LineString dos veces, pero obviamente las cadenas lineales idénticas se cruzarán. Mi plan si no hay una función sería obtener todos los puntos en la cadena de línea, y crear cadenas de líneas individuales y luego verificar cada nueva cadena de líneas una contra la otra con st_intersects. No quiero que llegue a esto, pero me temo que lo hará.

Entonces, ¿hay alguna función de PostGIS para verificar si una cadena lineal se auto intersecta? Debería ser similar a descubrir si un polígono es complejo, supongo

Jeff
fuente
Hubo una segunda respuesta aquí que no me ayudó bastante con PostGIS, pero sí contenía un enlace a información útil sobre el problema en general. Parece que se ha eliminado. ¿Alguien tiene ese enlace?
Jeff

Respuestas:

14

Puede probar una cadena lineal auto intersectante con ST_IsSimple(geom):

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

Auto-intersección en POINT (100.0 100.0)

La imagen de arriba y el título de abajo son de JTS TestBuilder (haga clic en "¿Simple?")

Auto-intersección en POINT ( 100.0 100.0 )

Esto se puede solucionar con ST_UnaryUnion(geom)(desde PostGIS 2.0), que devuelve una cadena múltiple de tres piezas válida / simple:

MULTILINESTRING((50 50, 100 100), 
  (100 100, 150 150, 50 150, 100 100), 
  (100 100, 150 50))
Mike T
fuente
¡Esto es perfecto! Sabía que la respuesta tenía que ser muy simple. Dijiste que usaste JTS Testbuilder para crear la imagen. ¿Hay alguna manera que conozca en Postgis para obtener el punto / puntos de intersección?
Jeff el
Ese es el detalle desafiante. JTS TestBuilder tiene CheckNoding, pero esto solo encuentra una coordenada de nodo por llamada, en lugar de un MULTIPOINT. No estoy seguro de cómo obtener los puntos de nodo con PostGIS.
Mike T