PostGIS之几何有效性
1. 概述
PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询
PostGIS官网:About PostGIS | PostGIS
PostGIS官方教程:PostGIS 简介 — Introduction to PostGIS
PostGIS相关教程:文章目录汇总 - 知乎 (zhihu.com)
本文基于官方教程描述PostGIS中的几何有效性
数据准备可参考:
数据介绍可参考:
2. 几何有效性
2.1 几何有效性的定义
几何图形可能是无效的,比如下面这种:
SELECT ST_GeometryFromText( 'POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))' );
这种几何图形能显示,但是查询其面积,面积为0:
这显然是不合理的,因为这个几何图形是无效的,它存在自相交,对于无效的几何图形,PostGIS将无法正确进行运算
PostGIS所遵循的OGC SFSQL标准所定义的多边形有效性的规则有:
- 多边形的环必须闭合
- 内环必须位于外环的内部
- 环不能自相交(它们不能相互接触,也不能交叉)
- 除了在某个点接触,环不能与其他环接触
2.2 检测有效性
PostGIS提供了几何有效性检测函数:
- ST_IsValid(g) Tests if a geometry is well-formed in 2D
- ST_IsValidDetail (geom, flags) Returns a valid_detail row stating if a geometry is valid or if not a reason and a location
- ST_IsValidReason(geomA) Returns text stating if a geometry is valid, or a reason for invalidity
检测是否有效:
SELECT ST_IsValid(ST_GeometryFromText( 'POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))' ));
结果为:false
检测无效原因:
SELECT ST_IsValidReason(ST_GeometryFromText( 'POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))' ));
可以看到(1,1)点自相交
检测纽约社区表的有效性:
SELECT name, ST_IsValidReason(geom) FROM nyc_neighborhoods WHERE NOT ST_IsValid(geom);
2.3 修复无效几何图形
PostGIS提供了自动修复函数:
- ST_MakeValid(input) Attempts to make an invalid geometry valid without losing vertices
尝试修复无效上面提到的无效图形:
SELECT ST_AsText(ST_MakeValid(ST_GeometryFromText( 'POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))' )));
可以看到PostGIS将这个无效的几何图形拆为了两个Polygon并合成了一个MultiPolygon
尝试修复纽约社区表中无效的图形:
SELECT name, ST_AsText(ST_MakeValid(geom)) FROM nyc_neighborhoods WHERE NOT ST_IsValid(geom);
使用ST_Buffer(geometry, 0.0)也有时也可达到修复的效果:
自动修复函数有时并不能起作用,需要手动将无效的几何图形导入临时表,然后使用GIS软件进行修改:
-- Side table of invalids CREATE TABLE nyc_neighborhoods_invalid AS SELECT * FROM nyc_neighborhoods WHERE NOT ST_IsValid(geom); -- Remove them from the main table DELETE FROM nyc_neighborhoods WHERE NOT ST_IsValid(geom);
3. 参考资料
[1]23. Validity — Introduction to PostGIS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具