(数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复
本文示例代码已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
大家好我是费老师,geopandas
作为在Python
中开展GIS
分析的利器,可以帮助我们快捷地解决很多日常GIS
操作需求。而我们平时工作研究中使用到的各种矢量数据,由于原始数据加工过程的不规范等问题,偶尔会导致某些要素自身的矢量数据信息非法。
这样的非法要素读到geopandas
或是PostGIS
等常用GIS
工具中,在进行一些矢量计算操作时会触发拓扑错误问题,而今天的文章中,我们就来学习一下在geopandas
中如何有效地解决此类的要素拓扑非法问题。
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191907688-433071993.png)
2 在geopandas解决拓扑错误问题
2.1 geopandas中常见的要素拓扑错误情况
在geopandas
中,要素的合法性(validity)是针对面要素、多部件面要素而言的,同其底层依赖的shapely
库一样,遵守着OGC(开放地理空间联盟)标准,在shapely
高度完备的功能封装下,我们在日常创建面要素矢量时只需要注意别出现下面几种常见的情况就行:
- 错误情况1:坐标串自交叉
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191910249-1830064811.png)
- 错误情况2:边界线存在重叠
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191912383-1888497520.png)
- 错误情况3:内部孔洞之间存在共边
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191914827-529897191.png)
- 错误情况4:内部孔洞与外边界共边
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191916770-1458514046.png)
- 错误情况5:多部件面要素之间存在重叠
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191918681-1078625825.png)
值得一提的是,除了查看要素的is_valid
属性是否为True
外,在jupyter
中非法的shapely
要素还会像上面各图那样以红色显示(合法是绿色)。
2.2 对拓扑错误要素进行诊断
上面列举的是我们自行构建面要素、多部件面要素时常见的拓扑错误,但若我们的数据来自从外部读取的矢量文件:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191920473-859404491.png)
查看is_valid
属性仅能知晓各个矢量是否合法:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191922315-844484048.png)
而配合shapely
中的explain_validity()
则可以具体诊断出各自具体的拓扑非法原因:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191924368-1597986163.png)
通过这些信息,我们就可以更有的放矢地决定对各个要素进行删除还是修复操作。
2.3 对拓扑问题进行修复
既然发现了拓扑非法问题,通常情况下我们肯定是希望可以尽可能地修复数据,而不是粗暴地予以删除,geopandas
从0.12.0
版本开始提供了基于shapely.validation.make_valid()
的快捷拓扑修复方法make_valid()
,对于小于0.12.0
版本的geopandas
,我们则可以配合map()
快捷实现同样的效果:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191926123-1763950590.png)
下面我们来瞅瞅针对每种情况具体是如何进行修复的:
- 修复错误情况1:坐标串自交叉
可以看到,通过make_valid()
针对坐标串自交叉进行修复的方式是将其拆分为多个合法多边形构成的多部件要素:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191928188-303727625.png)
如果你希望最后的结果为一个完整的多边形,这里给大家推荐一种奇淫巧技,在不影响原始数据精度的情况下,对结果做一个非常小的缓存区即可:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191930049-1725768521.png)
- 修复错误情况2:边界线存在重叠
类似的,对于边界线存在重叠的情况,修复后的结果是将重叠部分作为线要素,剩余部分保留面要素:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191932821-1218425643.png)
这时配合shapely.ops.unary_union()
过滤掉非面要素的要素构件即可:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191934950-1614632114.png)
- 修复错误情况3:内部孔洞之间存在共边
针对内部孔洞之间存在共边的情况,修复的结果中包含了被剔除的孔洞公共边及剩余的合法面要素,非常舒服:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191936696-80424003.png)
- 修复错误情况4:内部孔洞与外边界共边
针对内部孔洞与外边界共边情况下的修复结果,毕竟这种情况下涉及到的孔洞是不可能被保留的:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191938898-313203962.png)
- 修复错误情况5:多部件面要素之间存在重叠
这种情况下的修复策略显而易见,如果你希望修复后的结果仍然是多部件要素,那么将公共部分移除是唯一的方案:
![](https://img2022.cnblogs.com/blog/1344061/202210/1344061-20221030191941098-131816075.png)
至此我们就掌握了geopandas
中常见的各种拓扑非法问题的解决之道~
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
相关文章
- CSS学习(九)-CSS背景
- 多线程编程学习笔记——异步调用WCF服务
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
- JavaScript 刚開始学习的人应知的 24 条最佳实践
- (《机器学习》完整版系列)第5章 神经网络——5.3 SOW网络(“灯阵”面板)、Elman网络(将训练集转化时序数据)、Boltzmann机(达到Boltzmann分布)
- jQuery学习笔记
- stm32之PWM学习
- 机器学习笔记之流形模型——标准流模型基本介绍
- SpringMvc学习-3-Spring MVC 数据绑定
- 《机器学习与数据科学(基于R的统计学习方法)》——1.10 在生产中使用R
- 《机器学习与数据科学(基于R的统计学习方法)》——2.8 读取JSON文件
- 零基础如何快速入门python(2023学习路线)
- (数据科学学习手札54)Python中retry的简单用法
- (数据科学学习手札42)folium进阶内容介绍
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
- (数据科学学习手札23)决策树分类原理详解&Python与R实现
- 大数据学习——sparkSql
- 大数据学习——hive基本操作
- 大数据学习——linux常用命令(三)
- SQLite学习笔记之 SQLite的缺点与限制
- 学习如何看懂SQL Server执行计划(一)——数据查询篇
- 大数据与机器学习:实践方法与行业案例.2.3 ETL
- 知识图谱入门学习笔记(五)-知识抽取之数据采集&命名实体识别
- Java学习---RMI 技术分析[Hessian]
- PyTorch 深度学习实战 | 知识图谱嵌入结合图路径的推荐 RippleNet
- 如何解决机器学习中数据不平衡问题(转)
- 学习软件测试(五)搭建测试环境 phpStudy,TPshop,熟悉项目,项目测试流程,mysql基础语句
- SQL server USE GO语句学习总结
- 机器学习——SVM之python实现数据样本标准化和归一化