PostGIS进行几何有效性验证

什么是有效性?

对于多边形来说,有效性是最重要的,因为多边形定义了有界区域,需要很好的结构。线串非常简单,不会无效,点也不会无效。

多边形有效性的一些规则很明显,而另一些规则是任意的。

  • 多边形的环必须闭合
  • 内环必须位于外环的内部
  • 环不能自相交(它们不能相互接触,也不能交叉)
  • 除了在某个点接触,环不能与其他环接触

最后两条规则属于任意类别。定义多边形的其他规则也是自洽合理的,但是上面的规则是PostGIS所遵循的OGC SFSQL标准所定义的多边形有效性的规则。

PostGIS中的一些函数可以根据OGC SFC标准验证几何数据是否有效,还可以提供有关无效性质和位置的详细信息,还可以将无效几何数据转为有效几何数据。

ST_IsValid(geometry g)

ST_IsValid(geometry g, integer flags)

这个函数用于验证给定几何对象是否有效。如果几何对象有效,它将返回 TRUE;如果无效,它将返回 FALSE。无效的几何对象可能包括重叠的多边形、自交的线、无效的坐标等。

ST_IsValidDetail(geometry geom, integer flags)

与 ST_IsValid 类似,这个函数也用于验证几何对象的有效性,但它提供了更详细的信息,包括无效性的原因和位置。如果几何对象有效,它将返回 {valid, 'Valid Geometry'};如果无效,它将返回 {not valid, 'Reason why it is not valid'}

ST_IsValidReason(geometry geomA)

ST_IsValidReason(geometry geomA, integer flags)

这个函数返回几何对象无效的原因,如果几何对象有效,则返回 "Valid Geometry"。它通常与 ST_IsValid 配合使用,以便获得无效性的原因。

ST_MakeValid(geometry input) ST_MakeValid(geometry input, text params)

如果给定的几何对象无效,ST_MakeValid 函数会尝试修复它,以便使其成为有效几何对象。这可以包括修复重叠的多边形、去除自交的线、修复无效的坐标等。如果几何对象已经有效,则函数将返回原始几何对象。

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

"method"键有两个值。

  • "linework"是原始算法,它通过首先提取所有线条、将线条节点在一起、然后从线条构建值输出来构建有效的几何图形。
  • "structure"是一种区分内环和外环的算法,通过合并外环来构建新的几何形状,然后区分所有内环。

"keepcollapsed"键仅对"结构"算法有效。 以"真"或"假"为例。 如果指定了"false",则将显示已折叠为较低维度的几何元素,例如单个 LINESTRING。

scss 复制代码
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;

由六个重叠多边形组成的多多边形(无效)

由 14 个不重叠多边形组成的多多边形(未加参数)

由单个非重叠多边形组成的多多边形(method=structure)

sql 复制代码
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
相关推荐
2301_783848653 小时前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实战指南
jvm·数据库·python
TE-茶叶蛋3 小时前
DBeaver 的Explain 执行计划,分析sql的性能
数据库·sql
CLX05054 小时前
如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署
jvm·数据库·python
m0_617493944 小时前
PySide6 网络请求深度实测:从基础 API 调用到数据解析实战指南
数据库
知识汲取者4 小时前
每日一篇高频面试题系列之【MySQL 锁】
数据库·mysql
老纪4 小时前
SQL中如何查找特定的空值行:WHERE IS NULL深度解析
jvm·数据库·python
麦聪聊数据4 小时前
数据 API 平台选型:深度解读数据服务的四大关键技术与架构底座
数据库·sql
IT研究所5 小时前
AI 时代下的知识管理:从 Claude 的“复盘”能力看生成式 AI价值
大数据·运维·数据库·人工智能·科技·低代码·自然语言处理
2301_781571425 小时前
mysql数据库响应缓慢如何排查_使用EXPLAIN分析执行计划
jvm·数据库·python
彳亍1015 小时前
实现倒计时数字在到达1后自动隐藏(2为最后可见数字),同时继续运行至-1再终止
jvm·数据库·python