这篇文章依旧是基于上一篇文章(使用Python实现子区域数据分类统计)而写,此文章中介绍了使用 geopandas 的 overlay 函数对两个 GeoDataFrame 对象取相交或相异的部分,即进行空间压盖分析。html
此函数封装的很是好,解决了咱们的主要问题,在我本身的 Windows 系统上运行也正常,可是部署到 Ubuntu 16.04 后就出了问题,通过层层分析,最终发现是 Rtree 的问题。python
本文介绍问题的前因后果和解决方案。git
建立两个 GeoDataframe 对象,假定为 data1 和 data2,两个对象均包含一个 Polygon 的 GeoSeries 列,对这两个对象执行 overlay 函数,以下:github
intersection_data = geopandas.overlay(data1, data2, how='intersection')
首先须要在 Ubuntu 系统上安装 geopandas 类库,可使用 pip 直接安装,不明因此的请自行搜索。装完 geopandas 后须要安装 Rtree 类库,执行以下命令:bash
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 年的问题了,难道依然没有解决,实在使人难以相信。spa
发现了问题以后,就反复的使用 pip 卸载、安装 Rtree,但问题依旧存在,朋友提示我能够对比一下 Rtree 对此问题修复的代码和系统中安装的代码,看一下代码中是否包含解决问题的更新。检查以后,果真是问题解决以前的代码,看样子 Rtree 已经有两年没有人维护了,那么问题的解决方案就变成了如何安装最新的 Rtree。日志
使用 pip install Rtree
安装没法获得最新版本,只能经过源码安装了,因而首先将 Rtree 代码 clone 到本地,接着使用 pip 安装,成功解决了此问题,以下:code
git clone https://github.com/Toblerity/rtree.git cd rtree pip install .
本文针对 overlay 函数实际使用中发现的问题,简单介绍了问题的分析和查找过程,并给出了解决方案。其实全部问题都是这样,只要发现了问题,一步步耐心去探寻,总会找到解决方案,就怕连问题都发现不了。