Suite

Intersection de 2 lignes (non interpolées)


J'ai du mal avec une requête dans POSTGIS

Je veux trouver des géométries de chaîne de lignes où les géométries contiennent le même point.

Je ne veux pas calculer les points d'intersection. Je veux seulement obtenir un point, si le point est un membre réel des deux géométries.

Exemple

SELECT ST_AsText(ST_Function(ST_GeomFromText('LINESTRING(1 2, 2 2, 0 0)'), ST_GeomFromText('LINESTRING(0 1, 2 2, 3 0)') ) )

devrait revenir

POINT(2 2)

et

SELECT ST_AsText(ST_Function(ST_GeomFromText('LINESTRING(1 2, 10 10)'), ST_GeomFromText('LINESTRING(1 1, 2 2, 3 3)') ) )

devrait revenir

VIDER

ou quelque chose de similaire à vide.

Comment puis-je y parvenir en une seule requête ?

J'ai essayé d'utiliser ST_Intersection(), mais celui-ci calcule le point (ce qui ne correspond pas à mes besoins).


Voici une requête qui renvoie les sommets communs à vos chaînes de ligne d'entrée :

sélectionnez ST_AsText(ST_Intersection(subq.g1,subq.g2)) à partir de (sélectionnez ST_Collect(dump1.geom) comme g1, ST_Collect(dump2.geom) comme g2 à partir de ST_DumpPoints(ST_GeomFromText('LINESTRING(1 2, 2 2, 0 0 )')) en tant que dump1, ST_DumpPoints(ST_GeomFromText('LINESTRING(0 1, 2 2, 3 0)')) en tant que dump2) en tant que subq ;

Résultat:

"POINT(2 2)"

La requête vide les sommets des chaînes de lignes en points et les collecte en multipoints, et trouve enfin les intersections des multipoints.


Celui-ci vous donne tous les points qui se produisent plus d'une fois dans les chaînes de lignes.

COMMENCER; CREATE TEMPORARY TABLE test ( id serial, wkb_geometry geometry(LINESTRING, 4326) ) ON COMMIT DROP; INSERT INTO test(wkb_geometry) VALUES (ST_GeomFromText('LINESTRING(1 2, 2 2, 0 0)', 4326)), (ST_GeomFromText('LINESTRING(0 1, 2 2, 3 0)', 4326)); SELECT ST_AsText((dp).geom), COUNT(1) FROM ( SELECT (ST_DumpPoints(wkb_geometry)) dp FROM test ) un GROUP BY ST_AsText((dp).geom) HAVING COUNT(1) > 1 ; S'ENGAGER;

Avec l'aide de user30184, j'ai pu créer ma requête. C'est ici:

AVEC Données AS(

SELECTIONNER a.id comme ID1, b.id comme ID2, a.way comme Geom1, b.way comme Geom2 FROM manières AS a JOIN manières AS b ON not(ST_Equals(a.way, b.way))

)

SELECT ID1, ID2, ST_ASTEXT(ST_Intersection(subq.g1,subq.g2)) AS Intersection, ST_LineLocatePoint(Geom1, ST_Intersection(subq.g1,subq.g2)) AS Geom1Percent, ST_LineLocatePoint(Geom2, ST_Intersection(subq.g1,subq) .g2)) AS Geom2Percent, ST_GEOMETRYTYPE(Geom1) FROM Data,

(

SELECT ST_Collect(dump1.geom) AS g1, ST_Collect(dump2.geom) AS g2 FROM Data, ST_DumpPoints(Geom1) comme dump1, ST_DumpPoints(Geom2) comme dump2

) AS subq

O ST_INTERSECTES(subq.g1, subq.g2)

ET

Concat(ST_GEOMETRYTYPE(Geom1), ST_GEOMETRYTYPE(Geom2)) = 'ST_LineStringST_LineString'

Cette requête n'est peut-être pas très performante, mais donne le résultat attendu.