名称

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

大纲

geometry ST_MakeValid(geometry input);

geometry ST_MakeValid(geometry input, text params);

描述

该函数尝试创建给定无效几何体的有效表示,而不丢失任何输入顶点。 有效几何图形原封不动地返回。

相应的输入是点、多点、线串、多线串、多边形、多多边形、几何集合及其混合。

在完全或部分尺寸折叠的情况下,输出几何是相同或较低维度的几何集合,或者是较低维度几何的集合。

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

params参数可用于提供选项字符串来选择用于构建有效几何图形的方法。 选项字符串的格式为“method=linework|struct keepcollapsed=true|false”。 如果未提供“params”参数,则将使用“linework”算法作为默认值。

“method”键有两个值。

  • “linework” 是默认算法,其处理流程是:先提取所有线,再对这些线进行节点化(noding),然后基于这些线生成有效的几何输出。为了保证不丢失任何顶点,输出结果可能会形成复杂的几何集合。

  • “structure” 是一种算法,它会区分内环和外环:先对外环做并集构建新几何,再用所有内环做差。结果通常更直观,折叠的线会在输出中被丢弃。

“keepcollapsed” 选项仅对 structure 算法有效,取值为 true 或 false。

  • “keepcollapsed” 默认为 false,表示当几何组件被折叠为低维度时(例如只有一个点的 LineString),该组件会被丢弃。

  • “keepcollapsed” 设置为 true 表示即使几何组件被折叠为低维度,也会被保留。

这个函数是由 GEOS 模块执行的。

可用性: 2.0.0

增强:2.0.1 速度提升

增强:2.1.0添加了对几何集合和多点的支持。

增强:3.1.0删除了具有NaN值的坐标。

增强:在 3.2.0 中,添加了可选的算法参数“linework”和“structure”。 需要 GEOS>= 3.10.0 或更高版本。

该函数支持 3d 并且不会丢失 z-index。

示例

Make valid a MultiPolygon of two overlapping polygons using the linework and structure methods.

Code
SELECT ST_MakeValid(before_geom) AS linework,
  ST_MakeValid(before_geom, 'method=structure') AS 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 before_geom) AS f;
栅格输出
MULTIPOLYGON(((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,56.769 64.769,58 62,64 56,14 6,13 6,12 5,11 5)),((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,125.231 133.231,56.769 64.769,54 71)),((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,134 126,128 132,125.231 133.231,186 194)),((135 125,142 118,146 109,149 100,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,64 56,134 126,135 125))) | MULTIPOLYGON(((149 80,146 71,142 62,135 55,128 48,119 44,110 41,100 40,90 41,81 44,72 48,65 55,64 56,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,56.769 64.769,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,125.231 133.231,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,134 126,135 125,142 118,146 109,149 100,150 90,149 80)))
Figure
Geometry figure for visual-st-makevalid-01

Make valid a MultiPolygon of six overlapping polygons using the linework and structure methods.

Code
SELECT ST_MakeValid(before_geom) AS linework,
  ST_MakeValid(before_geom, 'method=structure') AS 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 before_geom) AS c;
栅格输出
MULTIPOLYGON(((51 110,68.5 117.5,61 100,68.5 82.5,51 90,23 78,21.714 75,11 100,21.714 125,23 122,51 110)),((51 190,76 179.286,73 178,61 150,68.5 132.5,51 140,23 128,21.714 125,11 150,23 178,51 190)),((141 150,130.286 125,129 128,101 140,83.5 132.5,91 150,79 178,76 179.286,101 190,129 178,141 150)),((129 78,101 90,83.5 82.5,91 100,83.5 117.5,101 110,129 122,130.286 125,141 100,130.286 75,129 78)),((101 10,76 20.714,79 22,91 50,83.5 67.5,101 60,129 72,130.286 75,141 50,129 22,101 10)),((11 50,21.714 75,23 72,51 60,68.5 67.5,61 50,73 22,76 20.714,51 10,23 22,11 50)),((83.5 82.5,80.286 75,79 78,76 79.286,83.5 82.5)),((83.5 67.5,76 70.714,79 72,80.286 75,83.5 67.5)),((68.5 67.5,71.714 75,73 72,76 70.714,68.5 67.5)),((68.5 82.5,76 79.286,73 78,71.714 75,68.5 82.5)),((83.5 132.5,80.286 125,79 128,76 129.286,83.5 132.5)),((83.5 117.5,76 120.714,79 122,80.286 125,83.5 117.5)),((68.5 117.5,71.714 125,73 122,76 120.714,68.5 117.5)),((68.5 132.5,76 129.286,73 128,71.714 125,68.5 132.5))) | MULTIPOLYGON(((23 22,11 50,21.714 75,11 100,21.714 125,11 150,23 178,51 190,76 179.286,101 190,129 178,141 150,130.286 125,141 100,130.286 75,141 50,129 22,101 10,76 20.714,51 10,23 22)))
Figure
Geometry figure for visual-st-makevalid-02

Collapsed Geometry Examples

Code
SELECT ST_MakeValid(
'LINESTRING(0 0,0 0)',
'method=structure keepcollapsed=true'
);
栅格输出
POINT(0 0)
Figure
Geometry figure for visual-st-makevalid-03
Code
SELECT ST_MakeValid(
'LINESTRING(0 0,0 0)',
'method=structure keepcollapsed=false'
);
栅格输出
LINESTRING EMPTY