首页 > 其他分享 >(数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复

(数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复

时间:2022-10-30 19:35:47浏览次数:84  
标签: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 对拓扑问题进行修复

  既然发现了拓扑非法问题,通常情况下我们肯定是希望可以尽可能地修复数据,而不是粗暴地予以删除,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,拓扑,手札,孔洞
From: https://www.cnblogs.com/feffery/p/16841979.html

相关文章

  • HDU 1465(错排公式)
    不容易系列之一TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):9829    AcceptedSubmission(s):......
  • ProgrammingError at /admin/mes_app/book/ (1146, "Table 'mes.mes_app_book' doesn'
     发生上述这个问题的时候,可以把CSRF直接在settings中直接屏蔽掉。 ......
  • (数据科学学习手札145)在Python中利用yarl轻松操作url
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1简介大家好我是费老师,在诸如网络爬虫、web应用开发等场景中,我们需要利......
  • P1464 function
    Function题目描述对于一个递归函数w(a,b,c)如果a<=0或b<=0或c<=0就返回值。如果a>20a>20或b>20b>20或c>20c>20就返回w(20,20,20)w(20,20,20)如果a<ba<b......
  • DOTCPP_1468_蓝桥杯基础练习VIP-报时助手
    1.题目链接题目1468:蓝桥杯基础练习VIP-报时助手2.解题思路2.1题意解析本题的目的是要完成报时功能,即根据输入的小时数h和分钟数m的值,按照报时规则输出对应的英文输......
  • NC14602 xinjun与阴阳师
    链接:https://ac.nowcoder.com/acm/problem/14602来源:牛客网**题目描述**xinjun是各类手游的狂热粉丝,因随手一氪、一氪上千而威震工大,现在他迷上了阴阳师。xinjun玩手游......
  • 【LeetCode】1464. 数组中两元素的最大乘积(C++)
    1464.数组中两元素的最大乘积(C++)​​1题目描述​​​​2示例描述​​​​2.1示例1​​​​2.2示例2​​​​2.3示例3​​​​3解题思路​​​​4源码详解(C++)​​......
  • CF1468H
    首先判掉\((n-m)\bmod(k-1)\ne0\)的情况,显然是无解的。考虑消去的最后一步,必然是以\(b\)中的某一元素为中位数进行的。于是得到了一个必要条件:存在一个\(b_i\),满足......
  • CF1468A
    设\(f_i\)表示以第\(i\)个结尾,强制选第\(i\)个所能得到的最长几乎上升序列的长度。则\(f_i=\max\limits_{j\lti,a_j\lea_i}\left\{f_j+1+w(i,j)\right\}\)。其......
  • CF1468M
    首先先将所有元素离散化。设\(m=\sumk_i\),因为\(n,m\)同阶,所以下文均用\(n\)来表示。考虑根号分治。对于元素个数超过\(\sqrtn\)的序列,不难发现这样的序列至......