本文示例代码已上传至我的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 对拓扑问题进行修复

  既然发现了拓扑非法问题,通常情况下我们肯定是希望可以尽可能地修复数据,而不是粗暴地予以删除,geopandas0.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中拓扑非法问题的发现、诊断与修复的更多相关文章

  1. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  2. (数据科学学习手札42)folium进阶内容介绍

    一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...

  3. (数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇

    本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的数据结 ...

  4. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  5. (数据科学学习手札44)在Keras中训练多层感知机

    一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...

  6. (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

    *从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...

  7. (数据科学学习手札80)用Python编写小工具下载OSM路网数据

    本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...

  8. (数据科学学习手札55)利用ggthemr来美化ggplot2图像

    一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...

  9. (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)

    一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...

随机推荐

  1. bbs项目解读

    1.注册功能 具体的效果图如下: 注册功能涉及到的逻辑步骤: 1.搭建前端html页面 2.向后端提交用户输入数据 3.对用户输入的数据格式进行校验 4.页面输入数据格式错误,及时向用户进行提示/正确 ...

  2. HCIA-datacom 4.3 实验三:网络地址转换配置实验

    实验介绍: 网络地址转换NAT(Network Address Translation)是将IP数据报文头中的IP地址转换为另一个IP地址的过程.作为减缓IP地址枯竭的一种过渡方案,NAT通过地址重用 ...

  3. RabbitMQ 入门系列:2、基础含义理解:链接、通道、队列、交换机

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  4. NOI2021 同步赛游记

    写在前面的话 为什么叫游记呢?因为我第一天是在划水中度过的,错过了对原题的发现. O n e I n D a r k \tt OneInDark OneInDark 无比风光地去了浙江,却倒霉地遇上了 ...

  5. 在cmd中使用doskey来实现alias别名功能

            作为一枚网络工程师,经常就是面对一堆黑框框,也是就是终端.不同操作系统.不同厂家的目录,功能相同但是键入的命令又大不相同,这些差异化容易让脑子混乱.比如华为.思科.H3C.锐捷的设备, ...

  6. Python图像处理丨认识图像锐化和边缘提取的4个算子

    摘要:图像锐化和边缘提取技术可以消除图像中的噪声,提取图像信息中用来表征图像的一些变量,为图像识别提供基础. 本文分享自华为云社区<[Python图像处理] 十七.图像锐化与边缘检测之Rober ...

  7. Java String Pool--String s = new String("a") 到底创建了几个对象?

    本篇重点(tips): 1. String Pool 是以Java 中 String 对象是不可变的这一特性为基础的 2. String Pool是Heap(堆)中的一块特殊空间(JDK 1.7 之前 ...

  8. 五、frp内网穿透客户端frpc.ini各配置参数详解

    [必须]标识头[common]是不可或缺的部分 [必须]frps服务端IPserver_addr = 0.0.0.00.0.0.0为FRP服务端IP,客户端要填写为服务端已配置的对应的IP,或者是服务 ...

  9. 一条命令查看docker容器的ip地址

    docker inspect --format='{{.NetworkSettings.IPAddress}}' ID/container_name

  10. 安装ceph (快速) 步骤三: Ceph 客户端

    大多数 Ceph 用户不会直接往 Ceph 存储集群里存储对象,他们通常会使用 Ceph 块设备. Ceph 文件系统.或 Ceph 对象存储这三大功能中的一个或多个. 前提条件 先完成存储集群快速入 ...