Name

ST_MakeValid — 尝试在不丢失顶点的情况下使无效几何体有效。

Synopsis

geometry ST_MakeValid(geometry input);

geometry ST_MakeValid(geometry input, text params);

描述

该函数尝试在不丢失任何输入顶点的情况下创建给定无效几何体的有效表示。返回有效的几何图形时不会更改。

支持的输入包括:POINTS、MULTIPOINTS、LINESTRINGS、MULTILINESTRINGS、POLGON、MULTIPOLYGONS和GEOMETRYCOLLECTIONS,其中包含它们的任意组合。

在完全或部分维度收拢的情况下,输出几何图形可以是较低维度的几何图形的集合,也可以是较低维度的几何图形的集合。

在自交的情况下,单个多边形可能会变成多个几何图形。

这个 params 参数可用于提供选项字符串,以选择用于生成有效几何图形的方法。选项字符串的格式为“METHOD=LINEWORK|Structure Keep Caved=TRUE|FALSE”。

“方法”键有两个值。

  • “线条”是原始算法,它通过首先提取所有线条,将线条连接在一起,然后从线条生成输出值来构建有效的几何图形。

  • “结构”是一种区分内环和外环的算法,通过联合外环,然后区分所有内环来构建新的几何体。

该键仅对“Structure”算法有效,取值为“True”或“False”。当设置为“False”时,折叠到较低维度的几何图形组件将被丢弃,例如一点线串。

由GEOS模块执行。

可用性:2.0.0

增强版:2.0.1,速度提升

增强:2.1.0,添加了对GEOMETRYCOLLECTION和多点的支持。

增强:3.1.0,添加了移除带有NaN值的坐标。

增强:3.2.0,增加了算法选项,‘线条’和‘结构’。

This function supports 3d and will not drop the z-index.

示例

BEFORE_GEOM:两个重叠多边形的多重投影

After_geom:4个非重叠多边形的多重聚

AFTER_GEOM_STRUCTURE:1个非重叠多边形的多重组合

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个重叠多边形的多重聚

After_geom:由14个不重叠的多边形组成的多重多边形

AFTER_GEOM_STRUCTURE:1个非重叠多边形的多重组合

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_IsValid, ST_Collect, ST_CollectionExtract