ST_Intersection — Berechnet eine Geometrie, die den gemeinsamen Teil der Geometrien A und B darstellt.
geometry ST_Intersection(
geometry geomA , geometry geomB , float8 gridSize = -1 )
;
geography ST_Intersection(
geography geogA , geography geogB )
;
Gibt eine Geometrie zurück, die die Punktmengenüberschneidung zweier Geometrien darstellt. Mit anderen Worten: der Teil von Geometrie A und Geometrie B, der von den beiden Geometrien gemeinsam genutzt wird.
Wenn die Geometrien keine gemeinsamen Punkte haben (d. h. disjunkt sind), wird eine leere atomare Geometrie des entsprechenden Typs zurückgegeben.
Wenn das optionale Argument gridSize
angegeben wird, werden die Eingaben auf ein Gitter der angegebenen Größe gerastert, und die Ergebnispunkte werden auf demselben Gitter berechnet. (Benötigt GEOS-3.9.0 oder höher)
ST_Intersection in Verbindung mit ST_Intersects ist nützlich, um Geometrien zu beschneiden, z. B. in Bounding Box-, Puffer- oder Regionsabfragen, bei denen Sie nur den Teil einer Geometrie benötigen, der sich innerhalb eines Landes oder einer Region von Interesse befindet.
Für die Geografie ist dies eine dünne Hülle um die Geometrieimplementierung. Zunächst wird der beste SRID ermittelt, der in die Bounding Box der beiden geografischen Objekte passt (wenn die geografischen Objekte innerhalb einer halben UTM-Zone liegen, aber nicht in der gleichen UTM-Zone, wird eines davon ausgewählt) (wobei UTM oder der Nord-/Südpol von Lambert Azimuthal Equal Area (LAEA) bevorzugt werden und im schlimmsten Fall auf Mercator zurückgegriffen wird), und dann wird die Schnittmenge in diesem am besten passenden planaren Raumbezug ermittelt und zurück in WGS84-Geografie transformiert. |
Mit dieser Funktion werden die M-Koordinatenwerte, falls vorhanden, gelöscht. |
Wenn Sie mit 3D-Geometrien arbeiten, sollten Sie die auf SFGCAL basierende Funktion ST_3DIntersection verwenden, die für 3D-Geometrien eine korrekte 3D-Schnittmenge erstellt. Obwohl diese Funktion mit der Z-Koordinate arbeitet, führt sie eine Mittelung der Z-Koordinate durch. |
Wird durch das GEOS Modul ausgeführt
Verbessert: 3.1.0 akzeptiert einen gridSize Parameter
Erfordert GEOS >= 3.9.0 zur Verwendung des Parameters gridSize
Geändert: 3.0.0 ist nicht von SFCGAL abhängig.
Verfügbarkeit: Mit Version 1.5 wurde die Unterstützung für den Datentyp Geographie eingeführt.
Diese Methode implementiert die OGC Simple Features Implementation Specification for SQL 1.1. s2.1.1.3
Diese Methode setzt die SQL/MM-Spezifikation um. SQL-MM 3: 5.1.18
Diese Funktion unterstützt 3d und lässt den Z-Index nicht fallen. Das Ergebnis wird jedoch nur mit XY berechnet. Die Z-Werte des Ergebnisses werden kopiert, gemittelt oder interpoliert.
SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry)); st_astext --------------- GEOMETRYCOLLECTION EMPTY SELECT ST_AsText(ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry)); st_astext --------------- POINT(0 0)
Schneiden Sie alle Linien (Trails) nach Land. Hier nehmen wir an, dass die Ländergeometrien POLYGON oder MULTIPOLYGON sind. HINWEIS: Wir behalten nur Schnittpunkte, die zu einem LINESTRING oder MULTILINESTRING führen, da wir uns nicht um Wege kümmern, die nur einen Punkt teilen. Der Dump wird benötigt, um eine Geometriesammlung in einzelne MULT*-Teile zu zerlegen. Das folgende Beispiel ist recht allgemein gehalten und funktioniert auch für Polygone usw., indem einfach die Where-Klausel geändert wird.
select clipped.gid, clipped.f_name, clipped_geom from ( select trails.gid, trails.f_name, (ST_Dump(ST_Intersection(country.geom, trails.geom))).geom clipped_geom from country inner join trails on ST_Intersects(country.geom, trails.geom) ) as clipped where ST_Dimension(clipped.clipped_geom) = 1;
Für Polygone, z. B. Polygon-Landmarken, können Sie auch den manchmal schnelleren Hack verwenden, dass das Puffern von allem um 0,0 außer einem Polygon zu einer leeren Geometriesammlung führt. (Eine Geometriesammlung mit Polygonen, Linien und Punkten, die mit 0,0 gepuffert wird, würde also nur die Polygone übrig lassen und die Sammlungshülle auflösen).
select poly.gid, ST_Multi( ST_Buffer( ST_Intersection(country.geom, poly.geom), 0.0 ) ) clipped_geom from country inner join poly on ST_Intersects(country.geom, poly.geom) where not ST_IsEmpty(ST_Buffer(ST_Intersection(country.geom, poly.geom), 0.0));
Beachten Sie, dass es sich hierbei nicht um eine echte Schnittmenge handelt, vergleichen Sie das gleiche Beispiel mit ST_3DIntersection.
select ST_AsText(ST_Intersection(linestring, polygon)) As wkt from ST_GeomFromText('LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)') AS linestring CROSS JOIN ST_GeomFromText('POLYGON((0 0 8, 0 1 8, 1 1 8, 1 0 8, 0 0 8))') AS polygon; st_astext --------------------------------------- LINESTRING Z (1 1 8,0.5 0.5 8,0 0 10)