Esiste una funzione PostGIS per determinare se una stringa lineare si interseca da sola?


16

Ho cercato una funzione che possa dirmi se un LineString si interseca da solo. Ho provato a chiamare st_intersectsdue volte con lo stesso LineString, ma ovviamente le stringhe di linea identiche si intersecano. Il mio piano se non ci fosse alcuna funzione sarebbe quello di ottenere tutti i punti nella stringa di linea e creare singole stringhe di linea e quindi controllare ogni nuova stringa di linea una contro l'altra con st_intersects. Non voglio che arrivi a questo, ma temo che lo farà.

Quindi ci sono delle funzioni PostGIS per verificare se una stringa di linea è autointersecante? Dovrebbe essere simile a scoprire se un poligono è complesso, suppongo


C'è stata una seconda risposta qui che non mi ha aiutato abbastanza PostGIS, ma conteneva un link ad alcune informazioni utili sul problema nel suo insieme. Sembra che sia stato cancellato. Qualcuno ha quel link?
Jeff,

Risposte:


14

Puoi testare una stringa di linea che si interseca con ST_IsSimple(geom):

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

Autointersezione su POINT (100.0 100.0)

L'immagine sopra e la didascalia inferiore provengono da JTS TestBuilder (fare clic su "Semplice?")

Autointersezione a POINT ( 100.0 100.0 )

Questo può essere risolto con ST_UnaryUnion(geom)(da PostGIS 2.0), che restituisce una multistringa valida / semplice in tre pezzi:

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

Questo è perfetto! Sapevo che la risposta doveva essere così semplice. Hai detto di aver usato JTS Testbuilder per creare l'immagine. C'è qualche modo che conosci in Postgis per ottenere il punto / i punti di intersezione?
Jeff,

Questo è il dettaglio impegnativo. JTS TestBuilder ha CheckNoding, ma trova solo una coordinata di nodo per chiamata, anziché un MULTIPOINT. Non sono sicuro di come ottenere i punti di nodo con PostGIS.
Mike T,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.