zoukankan      html  css  js  c++  java
  • 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 函数实际使用中发现的问题,简单介绍了问题的分析和查找过程,并给出了解决方案。其实所有问题都是这样,只要发现了问题,一步步耐心去探寻,总会找到解决方案,就怕连问题都发现不了。

  • 相关阅读:
    Nodejs express框架 浅析
    Nodejs 基础知识 浅析
    Angular1 基础知识 浅析(含锚点)
    canvas2D 基础知识 浅析
    1018 内置对象
    1017 内置对象
    1016 Repeater-重复器
    1014 简单控件和复合控件
    1013 认识WebForm
    0929 MDI窗体容器 权限设置
  • 原文地址:https://www.cnblogs.com/shoufengwei/p/10162334.html
Copyright © 2011-2022 走看看