Existe-t-il une fonction PostGIS pour déterminer si une chaîne de lignes se croise?

16

Je cherchais une fonction qui peut me dire si un LineString se croise. J'ai essayé d'appeler st_intersectsavec le même LineString deux fois, mais des chaînes de lignes identiques se croiseront évidemment. Mon plan s'il n'y a pas de fonction serait d'obtenir tous les points dans la chaîne de lignes, de créer des chaînes de lignes individuelles, puis de comparer chaque nouvelle chaîne de lignes les unes avec les autres avec st_intersects. Je ne veux pas qu'il en soit ainsi, mais je crains que ce ne soit le cas.

Existe-t-il donc des fonctions PostGIS pour vérifier si une chaîne de lignes s'auto-intersecte? Cela devrait être similaire à savoir si un polygone est complexe, je suppose

Jeff
la source
Il y avait une deuxième réponse ici qui ne m'a pas vraiment aidé PostGIS, mais elle contenait un lien vers des informations utiles sur le problème dans son ensemble. Il semble qu'il ait été supprimé. Quelqu'un at-il ce lien?
Jeff

Réponses:

14

Vous pouvez tester une chaîne de lignes auto-intersectée avec ST_IsSimple(geom):

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

Auto-intersection au POINT (100,0 100,0)

L'image ci-dessus et la légende ci-dessous proviennent de JTS TestBuilder (cliquez sur "Simple?")

Auto-intersection à POINT ( 100.0 100.0 )

Cela peut être corrigé avec ST_UnaryUnion(geom)(depuis PostGIS 2.0), qui renvoie une chaîne multiligne à trois parties valide / simple:

MULTILINESTRING((50 50, 100 100), 
  (100 100, 150 150, 50 150, 100 100), 
  (100 100, 150 50))
Mike T
la source
C'est parfait! Je savais que la réponse devait être si simple. Vous avez dit que vous avez utilisé JTS Testbuilder pour créer l'image. Existe-t-il un moyen à Postgis d'obtenir le ou les points d'intersection?
Jeff
Voilà le détail difficile. JTS TestBuilder a CheckNoding, mais cela ne trouve qu'une seule coordonnée de nœud par appel, plutôt qu'un MULTIPOINT. Je ne sais pas exactement comment obtenir les points nodaux avec PostGIS.
Mike T