(資料科學學習手札146)geopandas中拓撲非法問題的發現、診斷與修復

2022-10-30 21:01:16

本文範例程式碼已上傳至我的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中常見的各種拓撲非法問題的解決之道~


  以上就是本文的全部內容,歡迎在評論區與我進行討論~