Nom

ST_Intersection — Calcule une géométrie représentant la partie partagée des géométries A et B.

Synopsis

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

geography ST_Intersection( geography geogA , geography geogB );

Description

Renvoie une géométrie représentant l'intersection des points de deux géométries. En d'autres termes, la partie de la géométrie A et de la géométrie B qui est partagée entre les deux géométries.

Si les géométries n'ont aucun point commun (c'est-à-dire qu'elles sont disjointes), une géométrie atomique vide du type approprié est renvoyée.

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 en conjonction avec ST_Intersects est utile pour découper les géométries, comme dans les requêtes sur les boîtes de délimitation, les tampons ou les régions, lorsque vous n'avez besoin que de la partie d'une géométrie qui se trouve à l'intérieur d'un pays ou d'une région d'intérêt.

[Note]

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.

[Note]

Pour le type geography, il s'agit d'un fin wrapper autour de l'implémentation de la géométrie. Il détermine d'abord le meilleur SRID qui correspond à la boîte de délimitation des 2 objets géographiques (si les objets géographiques sont dans une demi-zone UTM mais pas le même UTM choisira l'un d'eux) (en favorisant UTM ou Lambert Azimuthal Equal Area (LAEA) pôle nord/sud, et en se rabattant sur mercator dans le pire des cas) et ensuite l'intersection dans ce ref spatial planaire le mieux adapté et retransforme à nouveau à la géographie WGS84.

[Avertissement]

Cette fonction abandonne les valeurs de coordonnées M si elles sont présentes.

[Avertissement]

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.

Effectué par le module GEOS

Amélioration : 3.1.0 accepte un paramètre gridSize

Nécessite GEOS >= 3.9.0 pour utiliser le paramètre gridSize

Modifié : 3.0.0 ne dépend pas de SFCGAL.

Disponibilité : La version 1.5 a introduit la prise en charge du type de données geography.

Cette méthode implémente la spécification OGC Simple Features Implementation Specification for SQL 1.1. s2.1.1.3

Cette méthode implémente la spécification SQL/MM. SQL-MM 3: 5.1.18

Cette fonction prend en charge la 3D et ne supprime pas l'indice z. Cependant, le résultat est calculé en utilisant uniquement XY. Les valeurs Z résultantes sont copiées, moyennées ou interpolées.

Exemples

Code
SELECT ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 2 0,0 2 )'::geometry);
Export de raster
POINT EMPTY
Code
SELECT ST_Intersection('POINT(0 0)'::geometry, 'LINESTRING ( 0 0,0 2 )'::geometry);
Export de raster
POINT(0 0)
Figure
Geometry figure for visual-st-intersection-02

Découper toutes les lignes (pistes) par pays. Nous supposons ici que les géométries des pays sont des POLYGONES ou des MULTIPOLYGONES. NOTE : nous ne gardons que les intersections qui résultent en un LINESTRING ou MULTILINESTRING car nous ne nous soucions pas des tracés qui partagent juste un point. Le dump est nécessaire pour étendre une collection géométrique en parties individuelles MULT*. La méthode ci-dessous est assez générique et fonctionnera pour les polys, etc. en changeant simplement la clause where.

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;

Pour les polys, par exemple les repères polygonaux, vous pouvez également utiliser la méthode parfois plus rapide qui consiste à mettre en mémoire tampon tout ce qui a une valeur de 0,0, à l'exception d'un polygone, afin d'obtenir une collection géométrique vide. (Ainsi, une collection géométrique contenant des polygones, des lignes et des points mis en mémoire tampon par 0.0 ne laisserait que les polygones et dissoudrait l'enveloppe de la collection.)

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;
Export de raster
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