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
相关推荐
Nontee1 小时前
MySQL 插入冲突了怎么办?两种处理方式入门笔记
数据库·笔记·mysql
ltl1 小时前
Parquet 文件格式:row group、编码与谓词下推索引
数据库
ltl1 小时前
PostgreSQL Join 路径:优化器如何选中 Nested Loop
数据库
ltl2 小时前
RocksDB 生产嵌入:Flink、TiKV 与 Kafka Streams 怎么用
数据库
devilnumber3 小时前
MySQL 性能优化・诗意化记忆
数据库·mysql·性能优化
瀚高PG实验室3 小时前
PostgreSQL pg_basebackup 和 pg_rewind 可覆盖源端超级用户选择的无关文件HGVE-2026-E010
数据库·postgresql·瀚高数据库
OceanBase数据库官方博客6 小时前
亮相“十五五”公积金高质量发展大会“AI 数据库”助力智慧公积金升级
数据库·人工智能
龙虾PRO6 小时前
高并发场景数据库调优实操:目标定位、监控方法与优化维度全解析
数据库·oracle
达梦产品与服务6 小时前
SQLark 实战 | 高频 SQL 脚本的导入、管理与复用
数据库·sql·数据库开发·数据库运维·脚本管理·sqlark百灵连接·sql脚本
InfinitePlus7 小时前
redis数据持久化
数据库·redis·缓存