ST_Split — Returnerar en samling geometrier som skapats genom att dela en geometri med en annan geometri.
geometry ST_Split(
geometry input, geometry blade)
;
Funktionen stöder delning av en LineString med en (Multi)Point-, (Multi)LineString- eller (Multi)Polygon-gräns, eller en (Multi)Polygon med en LineString. När en (Multi)Polygon används som blad, används dess linjära komponenter (gränsen) för att dela upp indata. Den resulterande geometrin är alltid en samling.
Denna funktion är på sätt och vis motsatsen till ST_Union. Genom att tillämpa ST_Union på den returnerade samlingen bör man teoretiskt sett få fram den ursprungliga geometrin (även om detta kanske inte är exakt fallet på grund av numerisk avrundning).
![]() |
|
Om inmatningen och bladet inte korsar varandra på grund av problem med numerisk precision kanske inmatningen inte delas som förväntat. För att undvika denna situation kan det vara nödvändigt att först fästa inmatningen på bladet med hjälp av ST_Snap med en liten tolerans. |
Tillgänglighet: 2.0.0 kräver GEOS
Förbättrad: 2.2.0 stöd för att dela en linje med en multilinje, en multipunkt eller (multi)polygongräns infördes.
Förbättrad: 2.5.0 stöd för att dela en polygon med en multilinje infördes.
Dela en polygon med en linje.
![]() Före delning
|
![]() Efter split
|
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(..)) )
Dela en MultiLineString genom en punkt, där punkten ligger exakt på båda LineStrings element.
![]() Före delning
|
![]() Efter split
|
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) )
Dela en LineString med en punkt, där punkten inte ligger exakt på linjen. Visar hur man använder ST_Snap för att snäppa linjen till punkten så att den kan delas.
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))