Name

ST_Split — Gibt eine Sammlung von Geometrien zurück, die durch Aufteilung einer Geometrie durch eine andere Geometrie entstanden sind.

Synopsis

geometry ST_Split(geometry input, geometry blade);

Beschreibung

Die Funktion unterstützt die Aufteilung eines LineStrings durch eine (Multi)Point-, (Multi)LineString- oder (Multi)Polygon-Grenze, oder eines (Multi)Polygons durch einen LineString. Wenn ein (Multi)Polygon als Klinge verwendet wird, werden seine linearen Komponenten (die Begrenzung) für die Aufteilung der Eingabe verwendet. Die Ergebnisgeometrie ist immer eine Sammlung.

Diese Funktion ist in gewisser Weise das Gegenteil von ST_Union. Die Anwendung von ST_Union auf die zurückgegebene Sammlung sollte theoretisch die ursprüngliche Geometrie ergeben (obwohl dies aufgrund numerischer Rundungen nicht unbedingt der Fall ist).

[Note]

Wenn sich Eingabe und Schaufel aufgrund von Problemen mit der numerischen Präzision nicht überschneiden, wird die Eingabe möglicherweise nicht wie erwartet geteilt. Um dies zu vermeiden, kann es notwendig sein, die Eingabe zuerst an der Klinge zu fangen, indem Sie ST_Snap mit einer kleinen Toleranz verwenden.

Verfügbarkeit: 2.0.0 erfordert GEOS

Verbessert: In Version 2.2.0 wurde die Unterstützung für die Aufteilung einer Linie durch eine Mehrlinien-, eine Mehrpunkt- oder eine (Mehr-)Polygonbegrenzung eingeführt.

Verbessert: In Version 2.5.0 wurde die Unterstützung für die Aufteilung eines Polygons durch eine Mehrlinie eingeführt.

Beispiele

Ein Polygon durch eine Linie teilen.

Vor dem Split

Nach der Trennung

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

Teilt einen MultiLineString durch einen Punkt, wobei der Punkt genau auf beiden LineString-Elementen liegt.

Vor dem Split

Nach der Trennung

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

Aufteilung eines LineString durch einen Punkt, wobei der Punkt nicht genau auf der Linie liegt. Zeigt die Verwendung von ST_Snap, um die Linie an dem Punkt zu fangen, damit sie geteilt werden kann.

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

Siehe auch

ST_Snap, ST_AsBinary