ST_MakeValid — 嘗試在不遺失頂點的情況下,使無效的幾何圖形有效。
geometry ST_MakeValid(
geometry input)
;
geometry ST_MakeValid(
geometry input, text params)
;
此函數嘗試建立給定無效幾何圖形的有效表示法,且不會遺失任何輸入頂點。有效的幾何圖形會保持不變回傳。
支援的輸入類型為:POINTS、MULTIPOINTS、LINESTRINGS、MULTILINESTRINGS、POLYGONS、MULTIPOLYGONS 和包含任何混合的 GEOMETRYCOLLECTIONS。
在發生全部或部分維度崩潰的情況下,輸出幾何圖形可能是較低或相同維度幾何圖形的集合,也可能是較低維度的幾何圖形。
單一多邊形在發生自我相交的情況下可能會變成多重幾何圖形。
params
引數可用於提供選項字串,以選擇用於建立有效幾何圖形的方法。選項字串的格式為 "method=linework|structure keepcollapsed=true|false"。如果未提供 "params" 引數,則預設會使用 "linework" 演算法。
"method" 鍵有兩個值。
"linework" 是原始演算法,它會先提取所有線條、將線條節點化,然後從線條建構數值輸出,藉此建立有效的幾何圖形。
"structure" 是一種演算法,可區分內部和外部環,藉由聯集外部環,然後對所有內部環執行差集運算,來建立新的幾何圖形。
"keepcollapsed" 鍵僅對 "structure" 演算法有效,且接受 "true" 或 "false" 值。當設定為 "false" 時,會捨棄崩潰為較低維度的幾何圖形元件,例如單點線條。
由 GEOS 模組執行。
可用性:2.0.0
增強功能:2.0.1,速度提升
增強功能:2.1.0,新增了對 GEOMETRYCOLLECTION 和 MULTIPOINT 的支援。
增強功能:3.1.0,新增了刪除具有 NaN 值的座標。
增強功能:3.2.0,新增了演算法選項 'linework' 和 'structure',這需要 GEOS >= 3.10.0。
此函數支援 3D,且不會捨棄 Z 索引。
![]() before_geom:由 2 個重疊多邊形組成的 MULTIPOLYGON
![]() after_geom:由 4 個不重疊多邊形組成的 MULTIPOLYGON
![]() after_geom_structure:由 1 個不重疊多邊形組成的 MULTIPOLYGON
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;
|
![]() before_geom:由 6 個重疊多邊形組成的 MULTIPOLYGON
![]() after_geom:由 14 個不重疊多邊形組成的 MULTIPOLYGON
![]() after_geom_structure:由 1 個不重疊多邊形組成的 MULTIPOLYGON
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