PostGIS学习教程十五:几何图形的有效性

PostGIS学习教程十五:几何图形的有效性

在90%的情况下,“为什么我的查询给了我一个’TopologyException’错误"的问题的答案是"一个或多个输入的几何图形是无效的”,这就引出了这样一个问题:几何图形"无效"是什么意思?我们为什么要关注它?


文章目录

  • PostGIS学习教程十五:几何图形的有效性
  • 一、什么是有效性?
  • 二、检测有效性
  • 三、修复无效的图形
    • 3.1、ST_MakeValid函数
    • 3.2、ST_Buffer


一、什么是有效性?

对于多边形来说,有效性是最重要的,因为多边形定义了有界区域,需要很好的结构。线串非常简单,不会无效,点也不会无效。

多边形有效性的一些规则很明显,而另一些规则是任意的。

多边形的环必须闭合
内环必须位于外环的内部
环不能自相交(它们不能相互接触,也不能交叉)
除了在某个点接触,环不能与其他环接触
最后两条规则属于任意类别。定义多边形的其他规则也是自洽合理的,但是上面的规则是PostGIS所遵循的OGC SFSQL标准所定义的多边形有效性的规则。

规则之所以重要,是因为几何图形的计算依赖于输入的几何图形的结构。可以构建没有结构假设的算法,但这些程序往往非常慢,因为任何无结构程序的第一步都是分析输入并在其中构建结构。

这里有一个解释为什么几何图形的结构重要的例子。首先这个多边形是无效的:

POLYGON((0 0, 0 1, 2 1, 2 2, 1 2, 1 0, 0 0));

在此图中,你可以更清楚地看到无效的原因:
在这里插入图片描述
这个多边形的外环实际上是一个数字8的形状,中间有一个自交点(也就是这个多边形的环自相交了)。图形程序成功地渲染了多边形填充,使其在视觉上看起来是一个"区域":两个一个单位的正方形,因此多边形总面积为两个单位的面积。

让我们看看PostGIS数据库认为多边形的面积是多少:

SELECT ST_Area(ST_GeometryFromText('POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))'
));

在这里插入图片描述
这里发生了什么?计算面积的算法假设环不自相交。程序始终计算位于边界线的一侧的区域的面积。

然而,在我们的(表现不佳)的形似数字8的多边形中,对于其中一个部分,图形区域位于边界线的右侧,而对于另一个部分,图形区域在边界线的左侧。这将导致为每个部分计算的面积互相抵消(一个为1,另一个为-1),因此结果为"0面积"。

二、检测有效性

在前面的示例中,我们可以轻易发现一个多边形是无效的。然而我们如何在一个包含数百万个几何图形的表中检测无效?答案是使用ST_IsValid(geometry)函数:

SELECT ST_IsValid(ST_GeometryFromText('POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))'
));

在这里插入图片描述
现在我们知道这个图形是无效的,但是我们不知道为什么无效。我们可以使用ST_IsValidReason(geometry)函数来查找无效的原因:

SELECT ST_IsValidReason(ST_GeometryFromText('POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))'
));

在这里插入图片描述
请注意,除了原因(自相交),图形自相交的坐标(coordinate(1 1))也被返回了。

我们也可以使用ST_IsValid(geometry)函数来测试数据表:

SELECT name, boroname, ST_IsValidReason(geom)
FROM nyc_neighborhoods
WHERE NOT ST_IsValid(geom);

在这里插入图片描述

三、修复无效的图形

首先,坏消息是:没有100%确定的方法来修复无效的几何图形。最坏的情况是使用ST_IsValid(geometry)函数识别它们,然后将单独它们移动到另一张表,导出该表,然后在外部(比如说桌面端GIS软件)修复它们。

下面是SQL的一个示例,它将无效的几何图形从原表转移到另一张表中。

CREATE TABLE nyc_neighborhoods_invalid AS
SELECT * FROM nyc_neighborhoods
WHERE NOT ST_IsValid(geom);DELETE FROM nyc_neighborhoods
WHERE NOT ST_IsValid(geom);

在这里插入图片描述
在视觉上修复无效几何图形的一个好工具是OpenJump,它在Tools->QA->Validate Selected Layers.下包含一个验证程序。

现在好消息是:可以使用以下任何一种方法在数据库中修复很大一部分的缺陷:

ST_MakeValid函数
ST_Buffer函数

3.1、ST_MakeValid函数

ST_MakeValid函数尝试在不对输入几何图形进行更改的情况下修复缺陷。不会删除或移动任何顶点,只需重新排列对象的结构即可。对于清晰但无效的数据来说,这个函数非常适用,对于杂乱无章且无效的数据来说,这个函数可能并不适用。

SELECT ST_AsText(ST_MakeValid('POLYGON((0 0, 0 1, 1 1, 2 1, 2 2, 1 2, 1 1, 1 0, 0 0))'
));

在这里插入图片描述
ST_MakeValid函数成功地将几何图形"8"转换为表示相同面积的multi-polygon。

3.2、ST_Buffer

使用缓冲区技巧清理时,可以利用缓冲区的生成方式来达到修复几何图形的目的:缓冲区几何图形是全新的几何图形,由关于原始图形的偏移线构建。如果不偏移原始线(零),则新几何图形在结构上将与原始几何图形相同,但由于它是使用OGC拓扑规则构建的,因此它将是有效的。

例如,这里有一个典型的无效现象——“香蕉多边形” —— 一个环,它包围着一个区域,但弯曲着接触自己,留下一个"孔洞(hole)",实际上并不是一个孔洞(违背了上面所说的环不能自相交的规则)。

POLYGON((0 0, 2 0, 1 1, 2 2, 3 1, 2 0, 4 0, 4 4, 0 4, 0 0))

在这里插入图片描述
在多边形上计算零偏移缓冲区将返回有效的OGC多边形,该多边形由在一点接触的外环和内环组成。

SELECT ST_AsText(ST_Buffer(ST_GeometryFromText('POLYGON((0 0, 2 0, 1 1, 2 2, 3 1, 2 0, 4 0, 4 4, 0 4, 0 0))'),0.0)
);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S 搜集java应用pod重启前现场 —— 筑梦之路

JAVA技术广泛用于各行各业,而云原生的流行,越来越多的企业将java应用搬进K8S中进行部署管理,OOM是java应用比较常出现的故障问题,对于容器环境的java应用搜集OOM等现场比较有难度,为了持续对应用的优化,搜集…

Android 电话拨打界面按back键不结束通话活动

按back键返回时,不结束当前的通话活动【生命周期】 /vendor/mediatek/proprietary/packages/apps/Dialer/java/com/android/incallui/InCallActivity.java Override public boolean onKeyUp(int keyCode, KeyEvent event) { DialpadFragment dialpadFragment…

Pandas教程(二)—— 不同格式的数据读取

前言:几种常用数据格式的介绍 csv文件 1. 逗号分隔值文件,以纯文本形式(记事本)存储表格数据 2. 它是一种平面文件:即只存储数据和文字,不能存储公式、图表等 3. 更适合存储大数据,一般用来批…

Codeforces Round 917 (Div. 2)更新中...

A.Least Product(思维) 题意: 给出一个数组 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1​,a2​,...,an​,你可以进行若干次以下操作: 选择数组中的一个元素 a i a_i ai​,将这个数字修改为 0 ∼ a i 0 \sim a_i 0∼ai​之…

Stream流的简单使用

stream流的三类方法 获取Stream流 ○ 创建一条流水线,并把数据放到流水线上准备进行操作中间方法 ○ 流水线上的操作 ○ 一次操作完毕之后,还可以继续进行其他操作终结方法 ○ 一个Stream流只能有一个终结方法 ○ 是流水线上的最后一个操作 其实Stream流非常简单,只…

Unity3D 安装和下载指南及汉化

Unity3D是一款强大的游戏开发引擎,为开发者提供了丰富的工具和资源,使得游戏制作变得更加简单和高效。本文将介绍Unity3D的安装和下载步骤,以帮助初学者迅速入门。 步骤一:访问Unity官网 首先,打开浏览器&#xff0c…

记录为 uni-app的扩展组件(uni-ui)和 微信小程序标签 添加行内样式的正确做法

如题&#xff0c;首先&#xff0c;正确为微信小程序标签添加行内样式&#xff0c;其做法是&#xff1a;&#xff08;以view为例&#xff09; <view style"width: 400rpx; height: 400rpx; background-color: green;">goods_list</view>也就是说&#xf…

Qt 中使用 MySQL 数据库保姆级教程(上)

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 在 Qt 中默认只搭载了 QSqlLite 数据库驱动&#xff0c;若要使用其他数据库需要自己下载数据库&#xff0c;并将数据库驱动加载到…

vite定制需求打包

技术栈&#xff1a;vue3vite 开发的管理系统需要应用在多个医院。产品提了一个需求&#xff0c;针对某一家医院&#xff0c;需要将登录页的logo去掉&#xff0c;其它的医院保留。由于未登录状态无法获取医院信息&#xff0c;因此采用定制打包的方案。 解决方案&#xff1a; 添…

虚拟机Windows Server 2012 与ubuntu的安装与布置

介绍虚拟机 虚拟机&#xff08;Virtual Machine&#xff0c;简称VM&#xff09;是一种通过软件模拟的计算机系统&#xff0c;可以在一台物理计算机上同时运行多个独立的操作系统和应用软件。虚拟机将物理计算机的硬件资源&#xff08;如处理器、内存、硬盘等&#xff09;虚拟化…

【git设置代理】

git设置代理 设置https代理全局设置&#xff08;不推荐&#xff09;只对GitHub代理&#xff08;推荐&#xff09;取消代理 配置ssh的代理配置ssh的configLinux、MacOSWindows config 内容测试是否设置成功 设置https代理 全局设置&#xff08;不推荐&#xff09; #使用http代…

2023年12月30日(星期六)骑行太平

2023年12月30日 (星期六) 骑行太平&#xff0c;早8:30到9:00&#xff0c; 大观公园门囗集合&#xff0c;9:30准时出发 【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:大观公园门囗集合 &#xff0c;家住东&#xff0c;南&#xff0c;北的骑友在…

Nginx快速入门:return、rewrite重定向、重写详解(六)

0. 引言 我们在日常的生产过程中&#xff0c;常常有需要重定向转发的需求&#xff0c;比如企业更换了域名&#xff0c;但又要保证之前的域名能访问&#xff0c;这就需要做重定向的跳转。 我们在之前的章节中学习了Nginx的负载均衡、各类转发代理配置&#xff0c;今天继续来补…

《LIO-SAM阅读笔记》2.ImageProjectionfeatureExtraction

前言&#xff1a; LIO-SAM中ImageProjection类和featureExtraction类的内容比较简单&#xff0c;这里就放在一起记录&#xff0c;这两部分属于点云的预处理前端&#xff0c;ImageProjection用来点云的运动去畸变和为每帧点云位姿进行粗略初始化&#xff0c;featureExtraction类…

Camtasia2024中文最新免授权版下载

TechSmith Camtasia2024免费版是一款非常专业且功能强大的屏幕录制工具&#xff01;使用集屏幕录像机、视频编辑器的功能于一身&#xff0c;能够轻松的录制和创建具有专业外观的视频。这套非常强大的专业录屏与视频创作大型软件套装包含捕获屏幕录制、视频剪辑和编辑、视频录音…

c++学习笔记-提高篇-STL标准模板库4(set容器、map容器)

set容器 一、set的基本概念 1.简介&#xff1a;所有元素都会在插入时自动被排序 2.本质&#xff1a;set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现 3.set和multiset区别 set不允许容器中有重复元素 multiset允许容器中有重复元素 二、set构造和赋值 1…

MySQL日期查询 今天、明天、本月、下月、星期、本周第一天、本周最后一天、本周七天日期

文章目录 今天日期明天日期本月第一天本月最后一天下个月第一天当前月已过几天当前月天数当前月所有日期获取星期本周第一天本周最后一天获取本周的七天日期 今天日期 select curdate()明天日期 select DATE_SUB(curdate(),INTERVAL -1 DAY) AS tomorrow本月第一天 select d…

嵌入式——RTC内置实时时钟

学习目标 理解原理图RTC设计部分掌握初始化RTC掌握设置时间掌握读取时间学习内容 RTC原理图 RTC结构框图 RTC时钟 开发流程 加载依赖。gd32f4xx_rtc.c,gd32f4xx_pmu.c初始化RTC。时钟配置。获取时钟。RTC初始化 // 电池管理加载 rcu_periph_clock_enable(RCU_PMU); pmu_back…

C#调用(python通过excel坐标生成的曲面地形图)案例

效果图: 文件图: 详解一:环境和python库问题 1.python 中只需要下载 matplotlib3.8.2和scipy1.11.4 2.我安装的python版本 详解二:解释器问题 python解释器这里有两种形式 第一种形式 1.调用 pycharm项目下的解释器,需要安装python必须的包(命令安装或者搜索安装)。 2.修改…

“一键批量翻译与重命名,轻松将西班牙文件名转换为中文名“

你是否遇到过需要将大量的西班牙文件名翻译成中文名&#xff0c;却无从下手的情况&#xff1f;现在&#xff0c;我们为你带来了一款强大的文件名批量翻译与重命名软件&#xff0c;让你能够轻松完成这项任务&#xff0c;提高工作效率。 首先&#xff0c;进入文件批量改名高手的主…