geopandas overlay 函數報錯問題解決方案

前言

這篇文章依舊是基於上一篇文章(使用Python實現子區域數據分類統計)而寫,此文章中介紹了使用 geopandas 的 overlay 函數對兩個 GeoDataFrame 對象取相交或相異的部分,即進行空間壓蓋分析。

此函數封裝的非常好,解決了我們的主要問題,在我自己的 Windows 系統上運行也正常,但是部署到 Ubuntu 16.04 後就出了問題,經過層層分析,最終發現是 Rtree 的問題。

本文介紹問題的來龍去脈和解決方案。

問題重現

創建兩個 GeoDataframe 對象,假定爲 data1 和 data2,兩個對象均包含一個 Polygon 的 GeoSeries 列,對這兩個對象執行 overlay 函數,如下:

intersection_data = geopandas.overlay(data1, data2, how='intersection')

首先需要在 Ubuntu 系統上安裝 geopandas 類庫,可以使用 pip 直接安裝,不明所以的請自行搜索。裝完 geopandas 後需要安裝 Rtree 類庫,執行如下命令:

pip install Rtree

安裝完畢後執行上面的 overlay 語句,Windows 下能夠正常運行,在 Ubuntu 上卻得不到結果,一直以爲是我寫的有問題,但多次切換系統和測試之後依然如故,最終檢查系統日誌,發現報錯如下:

'NoneType' object has no attribute 'intersection'

難道 data1 或者 data2 爲空了,反覆檢查不存在這個問題,那應該是 overlay 函數裏面出問題了吧,再詳細的跟蹤、查看日誌發現另一個錯誤:

TypeError: incompatible types, LP_c_double instance instead of LP_c_double instance

在 Google 中反覆搜索此問題,倒是 Rtree 的 github 中就有此問題的記錄,但已經是 2016 年的問題了,難道依然沒有解決,實在令人難以相信。

解決方案

發現了問題之後,就反覆的使用 pip 卸載、安裝 Rtree,但問題依舊存在,朋友提示我可以對比一下 Rtree 對此問題修復的代碼和系統中安裝的代碼,看一下代碼中是否包含解決問題的更新。檢查之後,果然是問題解決之前的代碼,看樣子 Rtree 已經有兩年沒有人維護了,那麼問題的解決方案就變成了如何安裝最新的 Rtree。

使用 pip install Rtree 安裝無法得到最新版本,只能通過源碼安裝了,於是首先將 Rtree 代碼 clone 到本地,接着使用 pip 安裝,成功解決了此問題,如下:

git clone https://github.com/Toblerity/rtree.git
cd rtree
pip install .

結尾

本文針對 overlay 函數實際使用中發現的問題,簡單介紹了問題的分析和查找過程,並給出瞭解決方案。其實所有問題都是這樣,只要發現了問題,一步步耐心去探尋,總會找到解決方案,就怕連問題都發現不了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章