Name

ST_Split — Renvoie une collection de géométries créées en divisant une géométrie par une autre géométrie.

Synopsis

geometry ST_Split(geometry input, geometry blade);

Description

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

[Note]

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.

Exemples

Diviser un polygone par une ligne.

Avant la division

Après la division

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

Split a MultiLineString by a Point, where the point lies exactly on both LineStrings elements.

Avant la division

Après la division

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

Voir aussi

ST_Snap, ST_Union