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
相关推荐
观远数据5 分钟前
在线数据分析网站有哪些?7款自助平台选型指南
大数据·数据库·数据分析
不想写bug呀8 分钟前
Redis集群介绍
数据库·redis·缓存
派大鑫wink12 分钟前
【Day47】MyBatis 进阶:动态 SQL、关联查询(一对一 / 一对多)
数据库·sql·mybatis
biter008812 分钟前
Ubuntu 上搜狗输入法突然“消失 / 只能英文”的排查与修复教程
linux·数据库·ubuntu
何以不说话14 分钟前
MyCat实现 MySQL 读写分离
数据库·mysql
齐 飞19 分钟前
SQL server使用MybatisPlus查询SQL加上WITH (NOLOCK)
数据库·mysql·sqlserver
_F_y20 分钟前
MySQL表的增删查改
android·数据库·mysql
yangSnowy20 分钟前
Redis数据类型
数据库·redis·wpf
@我不是大鹏25 分钟前
3、Spring AI Alibaba(SAA)零基础速通实战之Ollama私有化部署和对接本地大模型
数据库·人工智能·spring
Linging_2430 分钟前
PGSQL与Mysql对比学习
数据库·学习·mysql·postgresql