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
相关推荐
薛定谔的算法4 小时前
phoneGPT:构建专业领域的检索增强型智能问答系统
前端·数据库·后端
Databend5 小时前
Databend 亮相 RustChinaConf 2025,分享基于 Rust 构建商业化数仓平台的探索
数据库
得物技术6 小时前
破解gh-ost变更导致MySQL表膨胀之谜|得物技术
数据库·后端·mysql
Raymond运维10 小时前
MariaDB源码编译安装(二)
运维·数据库·mariadb
沢田纲吉11 小时前
🗄️ MySQL 表操作全面指南
数据库·后端·mysql
RestCloud1 天前
SQL Server到Hive:批处理ETL性能提升30%的实战经验
数据库·api
RestCloud1 天前
为什么说零代码 ETL 是未来趋势?
数据库·api
ClouGence1 天前
CloudCanal + Paimon + SelectDB 从 0 到 1 构建实时湖仓
数据库
DemonAvenger1 天前
NoSQL与MySQL混合架构设计:从入门到实战的最佳实践
数据库·mysql·性能优化
AAA修煤气灶刘哥2 天前
后端人速藏!数据库PD建模避坑指南
数据库·后端·mysql