ST_Split — Gibt eine Sammlung von Geometrien zurück, die durch Aufteilung einer Geometrie durch eine andere Geometrie entstanden sind.
geometry ST_Split(geometry input, geometry blade);
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).
|
|
|
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.
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)))
Teilt einen MultiLineString durch einen Punkt, wobei der Punkt genau auf beiden LineString-Elementen liegt.
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)
)
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_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))