1. 程式人生 > >geopandas overlay 函式報錯問題解決方案

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 函式實際使用中發現的問題,簡單介紹了問題的分析和查詢過程,並給出瞭解決方案。其實所有問題都是這樣,只要發現了問題,一步步耐心去探尋,總會找到解決方案,就怕連問題都發現不了。