ST_MakeValid — Försöker göra en ogiltig geometri giltig utan att förlora toppar.
geometry ST_MakeValid(geometry input);
geometry ST_MakeValid(geometry input, text params);
Funktionen försöker skapa en giltig representation av en given ogiltig geometri utan att förlora någon av de ingående hörnen. Giltiga geometrier returneras oförändrade.
Ingångar som stöds är: POINTS, MULTIPOINTS, LINESTRINGS, MULTILINESTRINGS, POLYGONS, MULTIPOLYGONS och GEOMETRYCOLLECTIONS som innehåller alla blandningar av dem.
Vid fullständig eller partiell dimensionell kollaps kan utdatageometrin vara en samling geometrier med lägre till lika stor dimension, eller en geometri med lägre dimension.
Enstaka polygoner kan bli multigeometrier vid självskärningar.
Argumentet params kan användas för att ange en alternativsträng för att välja vilken metod som ska användas för att bygga giltig geometri. Alternativsträngen är i formatet "method=linework|structure keepcollapsed=true|false". Om inget "params"-argument anges kommer "linework"-algoritmen att användas som standard.
"Method"-nyckeln har två värden.
"linework" is the default algorithm, and builds valid geometries by first extracting all lines, noding that linework together, then building a value output from the linework. The requirement that no vertices are lost can generate complex collections as outputs.
"structure" is an algorithm that distinguishes between interior and exterior rings, building new geometry by unioning exterior rings, and then differencing all interior rings. The results tend to be more intuitive, where collapsed lines are discarded in the output.
The "keepcollapsed" key is only valid for the "structure" algorithm, and takes a value of "true" or "false".
Keep collapsed of "false" is the default, and means that geometry components that collapse to a lower dimensionality, for example a one-point linestring will be dropped.
Keep collapsed of "true" means geometry components that collapse to a lower dimensionality will be retained.
Utförs av GEOS-modulen.
Tillgänglighet: 2.0.0
Förbättrad: 2.0.1, hastighetsförbättringar
Förbättrad: 2.1.0, stöd för GEOMETRYCOLLECTION och MULTIPOINT har lagts till.
Förbättrad: 3.1.0, har lagt till borttagning av koordinater med NaN-värden.
Förbättrad: 3.2.0, algoritmalternativen "linework" och "structure" har lagts till, vilket kräver GEOS >= 3.10.0.
Denna funktion stöder 3d och kommer inte att tappa z-index.
![]() före_geom: MULTIPOLYGON av 2 överlappande polygoner
![]() efter_geom: MULTIPOLYGON av 4 icke överlappande polygoner
![]() after_geom_strukture: MULTIPOLYGON av 1 icke överlappande polygon
SELECT f.geom AS before_geom, ST_MakeValid(f.geom) AS after_geom, ST_MakeValid(f.geom, 'method=structure') AS after_geom_structure FROM (SELECT 'MULTIPOLYGON(((186 194,187 194,188 195,189 195,190 195, 191 195,192 195,193 194,194 194,194 193,195 192,195 191, 195 190,195 189,195 188,194 187,194 186,14 6,13 6,12 5,11 5, 10 5,9 5,8 5,7 6,6 6,6 7,5 8,5 9,5 10,5 11,5 12,6 13,6 14,186 194)), ((150 90,149 80,146 71,142 62,135 55,128 48,119 44,110 41,100 40, 90 41,81 44,72 48,65 55,58 62,54 71,51 80,50 90,51 100, 54 109,58 118,65 125,72 132,81 136,90 139,100 140,110 139, 119 136,128 132,135 125,142 118,146 109,149 100,150 90)))'::geometry AS geom) AS f;
|
|
före_geom: MULTIPOLYGON av 6 överlappande polygoner
efter_geom: MULTIPOLYGON med 14 icke överlappande polygoner
after_geom_structure: MULTIPOLYGON av 1 icke överlappande polygon
SELECT c.geom AS before_geom,
ST_MakeValid(c.geom) AS after_geom,
ST_MakeValid(c.geom, 'method=structure') AS after_geom_structure
FROM (SELECT 'MULTIPOLYGON(((91 50,79 22,51 10,23 22,11 50,23 78,51 90,79 78,91 50)),
((91 100,79 72,51 60,23 72,11 100,23 128,51 140,79 128,91 100)),
((91 150,79 122,51 110,23 122,11 150,23 178,51 190,79 178,91 150)),
((141 50,129 22,101 10,73 22,61 50,73 78,101 90,129 78,141 50)),
((141 100,129 72,101 60,73 72,61 100,73 128,101 140,129 128,141 100)),
((141 150,129 122,101 110,73 122,61 150,73 178,101 190,129 178,141 150)))'::geometry AS geom) AS c;
|
SELECT ST_AsText(ST_MakeValid(
'LINESTRING(0 0, 0 0)',
'method=structure keepcollapsed=true'
));
st_astext
------------
POINT(0 0)
SELECT ST_AsText(ST_MakeValid(
'LINESTRING(0 0, 0 0)',
'method=structure keepcollapsed=false'
));
st_astext
------------------
LINESTRING EMPTY