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
相关推荐
栀夏61317 分钟前
MongoDB 索引
数据库
米饭是菜qy22 分钟前
MySql 事务
数据库·mysql
qq_2518364571 小时前
基于springboot vue3 在线考试系统设计与实现 源码数据库 文档
数据库·spring boot·后端
lllsure1 小时前
MySQL总结
数据库·mysql
weixin_531804242 小时前
SQL优化技巧(如查询优化、索引优化)。分布式系统的基本概念及挑战(如数据一致性、服务发现、负载均衡)
数据库·sql·服务发现
一 乐2 小时前
考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
java·数据库·学习·考研·微信·小程序·源码
一 乐2 小时前
租拼车平台|小区租拼车管理|基于java的小区租拼车管理信息系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·微信·notepad++·拼车
BillDev3 小时前
Oracle创建用户报错-ORA-65096: invalid common user or role name
数据库·oracle
szial3 小时前
深入理解SQL模糊查询中的特殊字符处理——以DB2为例
数据库·sql