Gibt es eine PostGIS-Funktion, mit der festgestellt werden kann, ob sich eine Linienfolge selbst schneidet?

16

Ich habe nach einer Funktion gesucht, die mir sagt, ob sich ein LineString selbst schneidet. Ich habe st_intersectszweimal versucht, mit demselben LineString zu telefonieren, aber offensichtlich werden sich identische Linienfolgen überschneiden. Mein Plan, wenn es keine Funktion gibt, wäre, alle Punkte in der Linienfolge abzurufen, einzelne Linienfolgen zu erstellen und dann jede neue Linienfolge mit st_intersects gegeneinander zu prüfen. Ich möchte nicht, dass es dazu kommt, aber ich fürchte, es wird so sein.

Gibt es also PostGIS-Funktionen, mit denen überprüft werden kann, ob sich eine Linienfolge selbst schneidet? Es sollte ungefähr so ​​aussehen, als würde man herausfinden, ob ein Polygon komplex ist

Jeff
quelle
Hier gab es eine zweite Antwort, die mir in Bezug auf PostGIS nicht ganz weitergeholfen hat, die jedoch einen Link zu einigen hilfreichen Informationen zum gesamten Problem enthielt. Es scheint, dass es gelöscht wurde. Hat jemand diesen Link?
Jeff

Antworten:

14

Sie können eine sich selbst schneidende Linienfolge testen mit ST_IsSimple(geom):

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

Selbstüberschneidung am PUNKT (100.0 100.0)

Das Bild oben und die Beschriftung unten stammen von JTS TestBuilder (klicken Sie auf "Einfach?").

Selbstüberschneidung bei POINT ( 100.0 100.0 )

Dies kann mit ST_UnaryUnion(geom)(seit PostGIS 2.0) behoben werden , das eine gültige / einfache dreiteilige Multilinienfolge zurückgibt:

MULTILINESTRING((50 50, 100 100), 
  (100 100, 150 150, 50 150, 100 100), 
  (100 100, 150 50))
Mike T
quelle
Dies ist perfekt! Ich wusste, dass die Antwort so einfach sein musste. Sie sagten, Sie haben das Image mit JTS Testbuilder erstellt. Gibt es in Postgis eine Möglichkeit, den Punkt / die Schnittpunkte zu ermitteln?
Jeff
Das ist das herausfordernde Detail. JTS TestBuilder verfügt über CheckNoding, findet jedoch nur eine Knotenkoordinate pro Aufruf und keinen MULTIPOINT. Ich bin mir nicht sicher, wie ich die Knotenpunkte mit PostGIS erhalten soll.
Mike T