Mehr

Wie erhalte ich die Punkte, an denen eine Linie ein Polygon kreuzt?

Wie erhalte ich die Punkte, an denen eine Linie ein Polygon kreuzt?


Ich habe eine Linie und brauche eine Liste von Koordinaten, an denen die Linie ein Polygon kreuzt. Eine Linie könnte mehrere Polygone kreuzen. Eine Linie könnte auch nur eine Polygonkante kreuzen, wenn die Linie innerhalb des Polygons beginnt.

ST_CROSSESgibt einen bool zurück, der angibt, ob sich die Linie kreuzt, aber ich brauche die tatsächlichen Koordinaten, wo die Linie die Polygonkante schneidet.

Das grundlegende SQL, das ich habe, bringt mir keine Punkte:

SELECT Trails.oid FROM Trails, Gebiete WHERE ST_Crosses(trails.geom, Gebiete.geom);

Sie müssen ST_Intersection verwenden, um den Schnittpunkt der Geometrien zu erhalten.

Wenn Sie jedoch eine Linie mit einem Polygon schneiden, ist das wahrscheinlichste Ergebnis eine andere Linie (das Stück innerhalb des Polygons). Bevor Sie es verwenden, müssen Sie Ihre Polygongeometrien in Linien umwandeln. Dazu können Sie ST_Boundary() verwenden.

Bei Linien, die dasselbe Polygon mehr als einmal schneiden, gibt der Schnittpunkt eine Mehrpunkt-Geometrie zurück, die Sie wahrscheinlich trennen möchten, daher müssen Sie am Ende ST_Dump() verwenden.

Das heißt, versuche es so:

SELECT Trails.oid, (ST_Dump(st_intersection(ST_Boundary(areas.geom),trails.geom))).geom AS Punkte FROM Gebiete, Trails WO ST_Intersects(areas.geom,trails.geom);

Das letzte ST_Intersects in der WHERE-Klausel stellt sicher, dass Sie nicht versuchen, den Schnittpunkt zweier Geometrien zu erhalten, die sich nicht einmal berühren, und verhindert, dass Sie am Ende leere Geometrien erhalten.


Eine Möglichkeit, dies zu erreichen, besteht darin, das folgende Skript auszuführen:

SELECT (st_dumppoints(st_intersection(areas.geom,trails.geom))).geom AS Punkte FROM Gebiete, Trails WHERE st_intersects(areas.geom,trails.geom) = true;

Schau das Video: Hvordan får jeg underpunkter til menu i wordpress?