名称

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