名称

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

另请参阅

ST_IsValidST_CollectST_CollectionExtract