前言

这篇文章依旧是基于上一篇文章(使用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 函数实际使用中发现的问题,简单介绍了问题的分析和查找过程,并给出了解决方案。其实所有问题都是这样,只要发现了问题,一步步耐心去探寻,总会找到解决方案,就怕连问题都发现不了。

geopandas overlay 函数报错问题解决方案的更多相关文章

  1. 新手常见的python报错及解决方案

    此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题.希望帮助到刚入门的朋友们.后续会不断补充. 目录 1.NameErr ...

  2. Mysql only_full_group_by以及其他关于sql_mode原因报错详细解决方案

    Mysql only_full_group_by以及其他关于sql_mode原因报错详细解决方案 网上太多相关资料,但是抄袭严重,有的讲的也是之言片语的,根本不连贯(可能知道的人确实不想多说) 我总共 ...

  3. js执行函数报错Cannot set property 'value' of null怎么解决?

    js执行函数报错Cannot set property 'value' of null 的解决方案: 原因:dom还没有完全加载 第一步:所以js建议放在body下面执行, 第二步:window.on ...

  4. 光流法draw_flow()函数报错

    光流法draw_flow()函数报错 import cv2 from scipy import * def draw_flow(im, flow, step=16): ""&quo ...

  5. 关于Entity Framework中的Attached报错相关解决方案的总结

    关于Entity Framework中的Attached报错的问题,我这里分为以下几种类型,每种类型我都给出相应的解决方案,希望能给大家带来一些的帮助,当然作为读者的您如果觉得有不同的意见或更好的方法 ...

  6. python 3 直接使用reload函数报错

    reload()是python2 的内置函数可以直接使用,但是python3 直接使用此函数报错,需要导入importlib 模块 from importlib import reload

  7. Win7下nginx默认80端口被System占用,造成nginx启动报错的解决方案

    Win7下nginx默认80端口被System占用,造成nginx启动报错的解决方案   在win7 32位旗舰版下,启动1.0.8版本nginx,显示如下错误:  [plain] 2012/04/0 ...

  8. Linux 下使用C语言 gets()函数报错

    在Linux下,使用 gets(cmd) 函数报错:warning: the 'gets' function is dangerous and should not be used. 解决办法:采用 ...

  9. Mac上PyCharm运行多进程报错的解决方案

    Mac上PyCharm运行多进程报错的解决方案 运行时报错 may have been in progress in another thread when fork() was called. We ...

随机推荐

  1. JDBC(12)—DBUtils工具类

    DBUtils:commons-dbutils是Apache组织提供的一个开源JDBC工具库,它是对JDBC的简单封装,并且使用dbutils会极大的简化jdbc编码的工作量,同时不会影响到程序的性能 ...

  2. ssh-keygen 基本用法

    ssh-keygen命令用于为"ssh"生成.管理和转换认证密钥,它支持RSA和DSA两种认证密钥. ssh-keygen(选项) -b:指定密钥长度: -e:读取openssh的 ...

  3. JavaAes加密操作工具类

    package com.king.weixin.util;import java.io.UnsupportedEncodingException;import java.security.Algori ...

  4. Geek/Git中文怎么读

    Geek怎么读 英[gi:k] = gay客 = 给客 Git怎么读 英[gɪt] = gay 特 = 给特 Flux怎么读 英[flʌks] = 佛拉克斯 Redux怎么读 英[ri:'dʌks] ...

  5. idea 集成sonarLint检查代码bugs

    1.目标 idea集成sonar的代码检查,实现可以在提交代码前就检查你的代码,而不是将代码提交之后,之后再去检查. Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量 ...

  6. grid - 隐式网格

    当网格项目确认在显式网格之外时就会创建隐性网格,当没有足够的空间或者显式的网格轨道来设置网格项目,此时网格项目就会自动创建隐式网格. 隐式网格可以定义:grid-auto-rows.grid-auto ...

  7. iframe相关小结

    父页面调用子页面方法, 子页面加载父页面传送的数据记录了父子间的调用和数据加载. 以下是另一些关于iframe的小结: 1:document.getElementById("ii" ...

  8. MATLAB 画柱状图(/直方图)修改横坐标名称并使其横着显示

    使用MATLAB 画柱状图 ,即bar (x,y),其横坐标是默认 1.2.3.4.……的 % --v1 y1=[asum1,asum2,asum3,asum4,asum5,asum6,asum7,a ...

  9. 【C++】C++中assert和ENDEGU预处理语句

    assert 断言语句是C++中的一种预处理宏语句,它能在程序运行时根据否定条件中断程序. C++中的assert()函数可以实现断言功能,在使用assert函数之前应该先引入<cassert& ...

  10. 转 Java虚拟机5:Java垃圾回收(GC)机制详解

    转 Java虚拟机5:Java垃圾回收(GC)机制详解 Java虚拟机5:Java垃圾回收(GC)机制详解 哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无 ...