本文範例程式碼已上傳至我的
Github
倉庫https://github.com/CNFeffery/DataScienceStudyNotes
大家好我是費老師,geopandas
作為在Python
中開展GIS
分析的利器,可以幫助我們快捷地解決很多日常GIS
操作需求。而我們平時工作研究中使用到的各種向量資料,由於原始資料加工過程的不規範等問題,偶爾會導致某些要素自身的向量資料資訊非法。
這樣的非法要素讀到geopandas
或是PostGIS
等常用GIS
工具中,在進行一些向量計算操作時會觸發拓撲錯誤問題,而今天的文章中,我們就來學習一下在geopandas
中如何有效地解決此類的要素拓撲非法問題。
在geopandas
中,要素的合法性(validity)是針對面要素、多部件面要素而言的,同其底層依賴的shapely
庫一樣,遵守著OGC(開放地理空間聯盟)標準,在shapely
高度完備的功能封裝下,我們在日常建立面要素向量時只需要注意別出現下面幾種常見的情況就行:
值得一提的是,除了檢視要素的is_valid
屬性是否為True
外,在jupyter
中非法的shapely
要素還會像上面各圖那樣以紅色顯示(合法是綠色)。
上面列舉的是我們自行構建面要素、多部件面要素時常見的拓撲錯誤,但若我們的資料來自從外部讀取的向量檔案:
檢視is_valid
屬性僅能知曉各個向量是否合法:
而配合shapely
中的explain_validity()
則可以具體診斷出各自具體的拓撲非法原因:
通過這些資訊,我們就可以更有的放矢地決定對各個要素進行刪除還是修復操作。
既然發現了拓撲非法問題,通常情況下我們肯定是希望可以儘可能地修復資料,而不是粗暴地予以刪除,geopandas
從0.12.0
版本開始提供了基於shapely.validation.make_valid()
的快捷拓撲修復方法make_valid()
,對於小於0.12.0
版本的geopandas
,我們則可以配合map()
快捷實現同樣的效果:
下面我們來瞅瞅針對每種情況具體是如何進行修復的:
可以看到,通過make_valid()
針對座標串自交叉進行修復的方式是將其拆分為多個合法多邊形構成的多部件要素:
如果你希望最後的結果為一個完整的多邊形,這裡給大家推薦一種奇淫巧技,在不影響原始資料精度的情況下,對結果做一個非常小的快取區即可:
類似的,對於邊界線存在重疊的情況,修復後的結果是將重疊部分作為線要素,剩餘部分保留面要素:
這時配合shapely.ops.unary_union()
過濾掉非面要素的要素構件即可:
針對內部孔洞之間存在共邊的情況,修復的結果中包含了被剔除的孔洞公共邊及剩餘的合法面要素,非常舒服:
針對內部孔洞與外邊界共邊情況下的修復結果,畢竟這種情況下涉及到的孔洞是不可能被保留的:
這種情況下的修復策略顯而易見,如果你希望修復後的結果仍然是多部件要素,那麼將公共部分移除是唯一的方案:
至此我們就掌握了geopandas
中常見的各種拓撲非法問題的解決之道~
以上就是本文的全部內容,歡迎在評論區與我進行討論~