(数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复
本文示例代码已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
大家好我是费老师,geopandas
作为在Python
中开展GIS
分析的利器,可以帮助我们快捷地解决很多日常GIS
操作需求。而我们平时工作研究中使用到的各种矢量数据,由于原始数据加工过程的不规范等问题,偶尔会导致某些要素自身的矢量数据信息非法。
这样的非法要素读到geopandas
或是PostGIS
等常用GIS
工具中,在进行一些矢量计算操作时会触发拓扑错误问题,而今天的文章中,我们就来学习一下在geopandas
中如何有效地解决此类的要素拓扑非法问题。
2 在geopandas解决拓扑错误问题
2.1 geopandas中常见的要素拓扑错误情况
在geopandas
中,要素的合法性(validity)是针对面要素、多部件面要素而言的,同其底层依赖的shapely
库一样,遵守着OGC(开放地理空间联盟)标准,在shapely
高度完备的功能封装下,我们在日常创建面要素矢量时只需要注意别出现下面几种常见的情况就行:
- 错误情况1:坐标串自交叉
- 错误情况2:边界线存在重叠
- 错误情况3:内部孔洞之间存在共边
- 错误情况4:内部孔洞与外边界共边
- 错误情况5:多部件面要素之间存在重叠
值得一提的是,除了查看要素的is_valid
属性是否为True
外,在jupyter
中非法的shapely
要素还会像上面各图那样以红色显示(合法是绿色)。
2.2 对拓扑错误要素进行诊断
上面列举的是我们自行构建面要素、多部件面要素时常见的拓扑错误,但若我们的数据来自从外部读取的矢量文件:
查看is_valid
属性仅能知晓各个矢量是否合法:
而配合shapely
中的explain_validity()
则可以具体诊断出各自具体的拓扑非法原因:
通过这些信息,我们就可以更有的放矢地决定对各个要素进行删除还是修复操作。
2.3 对拓扑问题进行修复
既然发现了拓扑非法问题,通常情况下我们肯定是希望可以尽可能地修复数据,而不是粗暴地予以删除,geopandas
从0.12.0
版本开始提供了基于shapely.validation.make_valid()
的快捷拓扑修复方法make_valid()
,对于小于0.12.0
版本的geopandas
,我们则可以配合map()
快捷实现同样的效果:
下面我们来瞅瞅针对每种情况具体是如何进行修复的:
- 修复错误情况1:坐标串自交叉
可以看到,通过make_valid()
针对坐标串自交叉进行修复的方式是将其拆分为多个合法多边形构成的多部件要素:
如果你希望最后的结果为一个完整的多边形,这里给大家推荐一种奇淫巧技,在不影响原始数据精度的情况下,对结果做一个非常小的缓存区即可:
- 修复错误情况2:边界线存在重叠
类似的,对于边界线存在重叠的情况,修复后的结果是将重叠部分作为线要素,剩余部分保留面要素:
这时配合shapely.ops.unary_union()
过滤掉非面要素的要素构件即可:
- 修复错误情况3:内部孔洞之间存在共边
针对内部孔洞之间存在共边的情况,修复的结果中包含了被剔除的孔洞公共边及剩余的合法面要素,非常舒服:
- 修复错误情况4:内部孔洞与外边界共边
针对内部孔洞与外边界共边情况下的修复结果,毕竟这种情况下涉及到的孔洞是不可能被保留的:
- 修复错误情况5:多部件面要素之间存在重叠
这种情况下的修复策略显而易见,如果你希望修复后的结果仍然是多部件要素,那么将公共部分移除是唯一的方案:
至此我们就掌握了geopandas
中常见的各种拓扑非法问题的解决之道~
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
(数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复的更多相关文章
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札42)folium进阶内容介绍
一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...
- (数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇
本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的数据结 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- (数据科学学习手札44)在Keras中训练多层感知机
一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...
- (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg
*从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...
- (数据科学学习手札80)用Python编写小工具下载OSM路网数据
本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...
- (数据科学学习手札55)利用ggthemr来美化ggplot2图像
一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
随机推荐
- 计算机网络-DNS和HTTPDNS了解
DNS 和 HTTPDNS DNS 域名解析的过程 传统 DNS 存在的问题 1.域名缓存问题 2.域名转发问题 3.出口 NAT 问题 4.DNS 域名更新问题 5.解析延迟问题 6.运营商劫持 H ...
- CF1167F Scalar Queries (线段树/树状数组)
题意 题解 对于[l,r]中的一个数,不论[l,r]有多大,只有比它小的数可以影响到它的排名,那么就可以把ai从小到大排序,一个一个加入线段树中,线段树中下表为 i 的是ai(原来的位置,不是排序后的 ...
- windows如何禁止更新
注意!本方法针对windows专业版本 家庭版本可以直接下载一个windows update blocker软件 windows+r快捷键输入代码如下图 gpedit.msc 进入后需要的路径如下 第 ...
- 1.4_HTML的标签简介
HTML 标签 HTML 标记标签通常被称为 HTML 标签 (HTML tag). HTML 标签是由尖括号包围的关键词,比如 <html> HTML 标签通常是成对!出现的,比如 &l ...
- Javaweb—登录案例
案例:用户登录 用户登录案例需求: 编写login.html登录页面 username & password 两个输入框 使用Druid数据库连接池技术,操作mysql,day14数据库中us ...
- DS
树状数组 原始问题 \(a_x \overset+\gets y\) \(\sum\limits_{i=1}^{r} a_i\) 解决方法: 定义 \({\rm lb}(i) = i-i \wedge ...
- Homework5
问:什么是分而治之? 答:分而治之就是通过一系列的方法,将复杂的问题逐渐划分成若干份相对简单的问题的方法,对每个相对简单问题进行一一解决,若干个简单问题的解的集合就是一个复杂问题的解.分而治之的应用体 ...
- KingbaseES 如何实现Oracle pipelined 功能
管道函数即是可以返回行集合(可以使嵌套表nested table 或数组 varray)的函数,我们可以像查询物理表一样查询它或者将其赋值给集合变量.KingbaseES 数据库可以用 setof 实 ...
- The 19th Zhejiang Provincial Collegiate Programming Contest
目录 A.JB Loves Math B.JB Loves Comma C. JB Wants to Earn Big Money G. Easy Glide I. Barbecue L. Candy ...
- Containerd 知识点
1.查看安装Containerd的版本 # ctr --version ctr github.com/containerd/containerd v1.6.6 # ctr version Client ...