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.
Diviser un polygone par une ligne.
|
|
SELECT ST_AsText( ST_Split( ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50), -- circle ST_MakeLine(ST_Point(10, 10),ST_Point(190, 190)) -- line )); -- result -- GEOMETRYCOLLECTION( POLYGON((150 90,149.039264020162 80.2454838991936,146.193976625564 70.8658283817455,..), POLYGON(..)) )
Divise une MultiLineString par un point, où le point se trouve exactement sur les deux éléments de la LineString.
|
|
SELECT ST_AsText(ST_Split( 'MULTILINESTRING((10 10, 190 190), (15 15, 30 30, 100 90))', ST_Point(30,30))) As split; split ------ 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_AsText( ST_Split( ST_Snap(line, point, 1), point)) AS snapped_split, ST_AsText( ST_Split(line, point)) AS not_snapped_not_split FROM data; snapped_split | not_snapped_not_split ---------------------------------------------------------------------+--------------------------------------------- GEOMETRYCOLLECTION(LINESTRING(0 0,51 50),LINESTRING(51 50,100 100)) | GEOMETRYCOLLECTION(LINESTRING(0 0,100 100))