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 ...
随机推荐
- python中函数教程
函数的基本概念 1.什么是函数? 函数相当于一种工具,就是把一串代码装到一起,我们下次需要用的这个功能的时候可以直接使用 函数相当于是工具(具有一定功能) 不用函数 修理工需要修理器件要用锤子 原地打 ...
- ubuntu1804搭建FTP服务器的方法
搭建FTP服务器 FTP的工作原理: FTP:File Transfer Protocol ,文件传输协议.属于NAS存储的一种协议,基于CS结构. ftp采用的是双端口模式,分为命令端口和数据端口, ...
- python 异步写入文件
# -*- coding:utf-8 -*-import asyncioimport aiofilesimport time#异步操作时,函数名前必须加上asyncasync def func1(): ...
- java的基本数据类型自动转换
本文主要内容阐明java的自动数据类型转换 首先明确,数据总是由精度低到精度高方向转换 public class AutoConvert { public static void main(Strin ...
- 在生产中部署 ES2015+ 代码
大多数 Web 开发人员都喜欢编写具有所有最新语言特性的 JavaScript--async/await.类.箭头函数等.然而,尽管事实上所有现代浏览器都可以运行 ES2015+ 代码并原生支持我刚才 ...
- [常用工具] 深度学习Caffe处理工具
目录 1 Caffe数据集txt文本制作 2 jpg图像完整性检测 3 图像随机移动复制 4 图像尺寸统计 5 图像名字后缀重命名 6 两文件夹文件比对 7 绘制caffe模型的ROC曲线(二分类) ...
- Redis-01 常用命令
创建和获取 key 命令 说明 例子 set 创建一个名为 key 值为 value 键值对 set views 10 get 获取名为 key 的值,存在返回值,不存在返回 nil get view ...
- 焦距的物理尺度、像素尺度之间的转换关系以及35mm等效焦距
已知: 物理焦距:F=35.56,单位:mm 图片大小:width*height=6000*4000,单位:pixel CCD尺寸:ccdw*ccdh=23.5*15.6,单位:mm 求: 像素焦距: ...
- python之路41 前端页面尝试 丑出新高度
边框 p {/* 左边 */ font-size: 48px; border-left-width: 5px; border-left-style: dotted; /*点点边框*/ border-l ...
- 解决angular11打包报错Type 'Event' is missing the following properties from type 'any[]': ...Type 'Event' is not assignable to type 'string'
出现这种情况,需要检查一下以下事项 1.ts类型声明和html里写的是否一致 1.1举例如下,子组件代码需要注意事项,子组件调用父组件方法,点击传参给父组件,在父组件触发一些时间,当前this指向是父 ...