ST_Snap — Fäst segment och vertikaler i indatageometrin till vertikaler i en referensgeometri.
geometry ST_Snap(
geometry input, geometry reference, float tolerance)
;
Snappar en geometris hörn och segment till en annan geometris hörn. En tolerans för snäppavstånd används för att styra var snäppningen utförs. Resultatgeometrin är indatageometrin med de snäppta topparna. Om ingen snäppning sker returneras indatageometrin oförändrad.
Att snäppa en geometri till en annan kan förbättra robustheten för överlagringsoperationer genom att eliminera nästan sammanfallande kanter (som orsakar problem under nodning och intersektionsberäkning).
För mycket snäppning kan leda till att en ogiltig topologi skapas, så antalet och placeringen av de snäppta topparna bestäms med hjälp av heuristik för att avgöra när det är säkert att snäppa. Detta kan dock leda till att vissa potentiella snäppningar utelämnas.
![]() |
|
Den återlämnade geometrin kan förlora sin enkelhet (se ST_IsSimple) och giltighet (se ST_IsValid). |
Utförs av GEOS-modulen.
Tillgänglighet: 2.0.0
![]() En multipolygon som visas med en linestrings (innan någon snapping) |
|
![]() En multipolygon knäpps till linestrings med tolerans: 1,01 av avståndet. Den nya multipolygonen visas med referenslinestrings
SELECT ST_AsText(ST_Snap(poly,line, ST_Distance(poly,line)*1.01)) AS polysnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( ((26 125, 26 200, 126 200, 126 125, 26 125 ), ( 51 150, 101 150, 76 175, 51 150 )), (( 151 100, 151 200, 176 175, 151 100 )))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; polysnapped --------------------------------------------------------------------- MULTIPOLYGON(((26 125,26 200,126 200,126 125,101 100,26 125), (51 150,101 150,76 175,51 150)),((151 100,151 200,176 175,151 100))) |
![]() En multipolygon knäpps till linestrings med toleransen: 1,25 av avståndet. Den nya multipolygonen visas med referenslinestrings
SELECT ST_AsText( ST_Snap(poly,line, ST_Distance(poly,line)*1.25) ) AS polysnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( (( 26 125, 26 200, 126 200, 126 125, 26 125 ), ( 51 150, 101 150, 76 175, 51 150 )), (( 151 100, 151 200, 176 175, 151 100 )))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; polysnapped --------------------------------------------------------------------- MULTIPOLYGON(((5 107,26 200,126 200,126 125,101 100,54 84,5 107), (51 150,101 150,76 175,51 150)),((151 100,151 200,176 175,151 100))) |
![]() Linjesträngen snäppte till den ursprungliga multipolygonen med toleransen 1,01 av avståndet. Den nya linjesträngen visas med referensmultipolygon
SELECT ST_AsText( ST_Snap(line, poly, ST_Distance(poly,line)*1.01) ) AS linesnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( ((26 125, 26 200, 126 200, 126 125, 26 125), (51 150, 101 150, 76 175, 51 150 )), ((151 100, 151 200, 176 175, 151 100)))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; linesnapped ---------------------------------------- LINESTRING(5 107,26 125,54 84,101 100)
|
![]() Linjesträngen knäpps till den ursprungliga multipolygonen med toleransen 1,25 av avståndet. Den nya linjesträngen visas med referensmultipolygonen
SELECT ST_AsText( ST_Snap(line, poly, ST_Distance(poly,line)*1.25) ) AS linesnapped FROM (SELECT ST_GeomFromText('MULTIPOLYGON( (( 26 125, 26 200, 126 200, 126 125, 26 125 ), (51 150, 101 150, 76 175, 51 150 )), ((151 100, 151 200, 176 175, 151 100 )))') As poly, ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line ) As foo; linesnapped --------------------------------------- LINESTRING(26 125,54 84,101 100) |