ST_Split — Renvoie une collection de géométries créées en divisant une géométrie par une autre géométrie.
geometry ST_Split(geometry input, geometry blade);
Cette fonction permet de diviser une ligne par un (Multi)Point, une (Multi)Ligne ou un (Multi)Polygone, ou un (Multi)Polygone par une ligne. Lorsqu'un (Multi)Polygone est utilisé, ses composantes linéaires (la frontière) sont utilisées pour diviser l'entrée. La géométrie résultante est toujours une collection.
Cette fonction est en quelque sorte l'inverse de ST_Union. L'application de ST_Union à la collection retournée devrait théoriquement donner la géométrie originale (bien qu'en raison de l'arrondi numérique, cela puisse ne pas être exactement le cas).
|
|
|
Si l'entrée et la "lame" ne se croisent pas en raison de problèmes de précision numérique, l'entrée peut ne pas être divisée comme prévu. Pour éviter cette situation, il peut être nécessaire d'accrocher d'abord l'entrée à la "lame", en utilisant ST_Snap avec une petite tolérance. |
Disponibilité : 2.0.0 nécessite GEOS
Amélioration : la version 2.2.0 prend en charge la division d'une ligne par une limite multiligne, multipoint ou (multi)polygone.
Amélioration : la prise en charge de la division d'un polygone par une ligne multiple a été introduite dans la version 2.5.0.
Split a circular polygon by a diagonal line.
SELECT
ST_Split(
ST_Buffer('POINT(100 90)'::geometry, 50),
'LINESTRING(10 10,190 190)'::geometry
);
GEOMETRYCOLLECTION(POLYGON((150 90,149 80.2,146.2 70.9,141.6 62.2,135.4 54.6,127.8 48.4,119.1 43.8,109.8 41,100 40,90.2 41,80.9 43.8,72.2 48.4,64.6 54.6,60.1 60.1,129.9 129.9,135.4 125.4,141.6 117.8,146.2 109.1,149 99.8,150 90)), POLYGON((60.1 60.1,58.4 62.2,53.8 70.9,51 80.2,50 90,51 99.8,53.8 109.1,58.4 117.8,64.6 125.4,72.2 131.6,80.9 136.2,90.2 139,100 140,109.8 139,119.1 136.2,127.8 131.6,129.9 129.9,60.1 60.1)))
Divise une MultiLineString par un point, où le point se trouve exactement sur les deux éléments de la LineString.
SELECT ST_Split('MULTILINESTRING((10 10,190 190),(15 15,30 30,100 90))',
ST_Point(30, 30));
GEOMETRYCOLLECTION(
LINESTRING(10 10,30 30),
LINESTRING(30 30,190 190),
LINESTRING(15 15,30 30),
LINESTRING(30 30,100 90)
)
Diviser une ligne par un point, lorsque le point ne se trouve pas exactement sur la ligne. Montre l'utilisation de ST_Snap pour accrocher la ligne au point afin de permettre son découpage.
WITH data AS (SELECT
'LINESTRING(0 0,100 100)'::geometry AS line,
'POINT(51 50)':: geometry AS point
)
SELECT ST_Split(ST_Snap(line, point, 1), point) AS snapped_split,
ST_Split(line, point) AS not_snapped_not_split
FROM data;
-[ RECORD 1 ]--------- snapped_split | GEOMETRYCOLLECTION(LINESTRING(0 0,51 50), LINESTRING(51 50,100 100)) not_snapped_not_split | GEOMETRYCOLLECTION(LINESTRING(0 0,100 100))