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
[2]PostGIS教程十五:几何图形的有效性 - 知乎 (zhihu.com)
PostGIS之几何有效性的更多相关文章
- PostgreSQL+PostGIS的使用 函数清单
一. PostgreSQL与PostGIS的关系 PostgreSQL 是世界上技术最先进的开源数据库,其前身是1977年一个源于Berkeley名为Ingres的非关系型数据库,其项目领导人为Mic ...
- PostgreSQL+PostGIS 的使用
一.PostGIS中的几何类型 PostGIS支持所有OGC规范的“Simple Features”类型,同时在此基础上扩展了对3DZ.3DM.4D坐标的支持. 1. OGC的WKB和WKT格式 OG ...
- 【PostgreSQL】资料索引(来源:德哥)
PostgreSQL 多应用场景实践 - 沙箱实验 https://github.com/digoal/blog/blob/master/201805/20180524_02.md 一.GIS < ...
- postgis几何操作函数集
管理操作函数 AddGeometryColumn - Adds a geometry column to an existing table of attributes. By default use ...
- PostGIS解析Geometry几何对象
一.Geometry转WKT select st_astext(geom) where tableName; 二.PostGIS常用函数 wkt转geometry st_geomfromtext(wk ...
- Arcgis 几何网络分析
ArcGIS:网络分析(转) 由于之前对网络分析的理解有很多问题,所以在网上找了一些资料,这是其中一篇我觉得比较好的,所以就整理了一下,发到网上来,留个底吧,呵呵 注:关于几何网络的建立见前面的& ...
- PostGis常用函数中文介绍
记录常用PostGis常用函数: 1.OGC标准函数 管理函数: 添加几何字段 AddGeometryColumn(, , , , , ) 删除几何字段 DropGeometryColumn(, , ...
- PostgreSQL(PostGIS)安装和入门的若干问题
1. 装完PostgreSQL后记得打开pgAdmin4启动一下服务器和启动一下数据库,否则PostGIS装不上. 2. pgAdmin4是网页,而3是客户端,当然都可以在File - Prefere ...
- (转)postgresql+postgis空间数据库使用总结
转载地址:https://blog.csdn.net/qq_36588972/article/details/78902195 参考资料: pgrouting路径导航 https://www.cnbl ...
- 学习笔记之PostgreSQL / pgAdmin / Psycopg / PostGIS
PostgreSQL: The world's most advanced open source database https://www.postgresql.org/ POSTGRESQL: T ...
随机推荐
- 【每日一题】【暴力、动态规划、动规优化、贪心】2022年1月21日-NC19 连续子数组的最大和/最大子序和
同:最大子序和 https://www.cnblogs.com/liujinhui/p/15574312.html 描述输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组. ...
- day05-功能实现04
家居网购项目实现04 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 10.功能09-后台管理 删除家居 10.1需求分析/图解 ...
- k3s安装kubernetes环境
官方文档:https://docs.rancher.cn/k3s/ 官方文档:https://rancher.com/docs/k3s/latest/en/installation/install-o ...
- java计算器༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽,又是掉发的一天
题目: 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值. 注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() . 示例 1: 输入:s = " ...
- CH9434-MCU代码移植,芯片使用详细说明(附Linux开发资料链接)
简介 CH9434是一款SPI转四串口转接芯片,提供四组全双工的9线异步串口,用于单片机/嵌入式/安卓系统扩展异步串口.提供25路GPIO,以及支持RS485收发控制引脚TNOW.本篇基于STM32F ...
- python进阶之路20 正则表达式 re模块
正则表达式前情 案例:京东注册手机号校验 基本需求:手机号必须是11位.手机号必须以13.15.17.18.19开头.必须是纯数字 '''纯python代码实现''' # while True: # ...
- P8701 [蓝桥杯 2019 国 B] 第八大奇迹
简要题意 你需要维护一个长度为 \(L\) 的序列 \(a\),初始时全部都是 \(0\),有 \(N\) 个操作,支持: C p x,将 \(a_p\) 修改为 \(x\). Q a b,输出 \( ...
- 通过Google Cloud Storage(GCS)管理Terraform的状态State
管理Terraform状态文件的最佳方式是通过云端的统一的存储,如谷歌云就用GCS. 首先要创建一个Bucket: $ gsutil mb -p pkslow -l us-west1 -b on gs ...
- 轻松解决 CSS 代码都在一行的问题
前言 最近在做博客园的界面美化,用的是博客园[guangzan]的开源项目,配置超级简单,只需要复制粘贴代码就好啦. 但在粘贴 CSS 代码时遇到一个问题,那就是所有代码都挤在了一行,没有一点排板的样 ...
- 基于 .NET7.0 开发Telegram 机器人(入门)
简介 Telegram(非正式简称TG.电报)是跨平台的即时通信软件,其客户端是自由及开放源代码软件,但服务端是专有软件.用户可以相互交换加密与自毁消息,发送照片.视频等所有类型文件.官方提供手机版( ...