Czy istnieje funkcja PostGIS do określania, czy znak linii przecina się?

16

Szukałem funkcji, która może mi powiedzieć, czy LineString się przecina. Próbowałem dzwonić st_intersectsz tym samym LineString dwa razy, ale oczywiście identyczne linie łączą się. Mój plan, jeśli nie ma żadnej funkcji, polegałby na zebraniu wszystkich punktów w ciągu linii i utworzeniu pojedynczych linii, a następnie sprawdzeniu każdego nowego linii przy pomocy st_intersects. Nie chcę, żeby do tego doszło, ale obawiam się, że tak się stanie.

Czy są więc jakieś funkcje PostGIS do sprawdzania, czy linia łącząca się przecina? Zakładam, że powinno to być podobne do stwierdzenia, czy wielokąt jest złożony

Jeff
źródło
Była tu druga odpowiedź, która nie całkiem mi pomogła w PostGIS, ale zawierała link do kilku przydatnych informacji na temat problemu jako całości. Wygląda na to, że został usunięty. Czy ktoś ma ten link?
Jeff

Odpowiedzi:

14

Możesz przetestować pod kątem samoistnie przecinającego się linesta za pomocą ST_IsSimple(geom):

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

Skrzyżowanie na POINT (100,0 100,0)

Powyższy obraz i poniżej podpis pochodzą z JTS TestBuilder (kliknij „Prosty?”)

Własne skrzyżowanie o POINT ( 100.0 100.0 )

Można to naprawić za pomocą ST_UnaryUnion(geom)(od PostGIS 2.0), która zwraca prawidłowy / prosty trzyczęściowy multilinestring:

MULTILINESTRING((50 50, 100 100), 
  (100 100, 150 150, 50 150, 100 100), 
  (100 100, 150 50))
Mike T.
źródło
To jest doskonałe! Wiedziałem, że odpowiedź musi być taka prosta. Powiedziałeś, że użyłeś JTS Testbuilder do stworzenia obrazu. Czy w Postgis jest jakiś sposób na zdobycie punktu / punktów przecięcia?
Jeff
To trudny szczegół. JTS TestBuilder ma CheckNoding, ale odnajduje tylko jedną współrzędną węzła na połączenie, a nie MULTIPOINT. Nie jestem pewien, jak uzyskać punkty węzłowe za pomocą PostGIS.
Mike T