Name

ST_Intersection — Berechnet eine Geometrie, die den gemeinsamen Teil der Geometrien A und B darstellt.

Übersicht

geometry ST_Intersection( geometry geomA , geometry geomB , float8 gridSize = -1 );

geography ST_Intersection( geography geogA , geography geogB );

Beschreibung

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.

If the optional gridSize parameter is given (GEOS-3.9.0 or higher required), all result vertices are guaranteed to fall on a snap-rounded grid of the specified size. Note that operations performed on a grid may contain small artifacts produced during grid alignment, see ST_ReducePrecision.

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.

[Anmerkung]

Spatial predicates such as ST_Intersects and overlay functions such as ST_Intersection are computed by different algorithms. For very close or nearly coincident coordinates, floating-point precision and geometric robustness may make a predicate return true while the computed intersection is empty, or place an intersection point slightly away from the input line. For repeatable overlay results, snap inputs to a suitable grid first, for example with ST_ReducePrecision, or use the gridSize parameter when all input vertices already lie on the grid.

[Anmerkung]

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.

[Warnung]

Mit dieser Funktion werden die M-Koordinatenwerte, falls vorhanden, gelöscht.

[Warnung]

If working with 3D geometries, you may want to use SFCGAL based CG_3DIntersection which does a proper 3D intersection for 3D geometries. Although this function works with Z-coordinate, it does an averaging of Z-Coordinate.

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.

Beispiele

Code
SELECT ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0,0 2 )'::geometry);
Ausgabe von Rastern
PUNKT LEER
Code
SELECT ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0,0 2 )'::geometry);
Ausgabe von Rastern
POINT(0 0)
Figure
Geometry figure for visual-st-intersection-02

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.

Code
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).

Code
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));

Note this is not a true 3D intersection. It uses 2.5D geometries (geometries with Z ordinates, but where calculations are performed in 2D). The same input is compared with CG_3DIntersection, which performs a true 3D intersection.

Code
WITH data AS (
  SELECT 'LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)'::geometry AS input_linestring,
         'POLYGON Z ((0 0 8,0 1 8,1 1 8,1 0 8,0 0 8))'::geometry AS input_polygon
)
SELECT input_linestring AS input_linestring,
       input_polygon AS input_polygon,
       ST_Intersection(input_linestring, input_polygon) AS intersection_2d,
       CG_3DIntersection(input_linestring, input_polygon) AS intersection_3d
FROM data;
Ausgabe von Rastern
LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10) | POLYGON Z ((0 0 8,0 1 8,1 1 8,1 0 8,0 0 8)) | LINESTRING Z (1 1 8,0.5 0.5 8,0 0 10) | LINESTRING Z (1 1 8,0.5 0.5 8)
Figure
Geometry figure for visual-st-intersection-03