Не работает чрезмерная функция от GeoPandas - PullRequest
0 голосов
/ 29 ноября 2018

Я просто хочу использовать geopandas, чтобы получить объединение и пересечение двух многоугольных областей.Я определяю:

import geopandas as gpd
from shapely.geometry import Polygon
polys1 = gpd.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),
                                  Polygon([(2,2), (4,2), (4,4), (2,4)])])
polys2 = gpd.GeoSeries([Polygon([(1,1), (3,1), (3,3), (1,3)]),
                                  Polygon([(3,3), (5,3), (5,5), (3,5)])])

df1 = gpd.GeoDataFrame({'geometry': polys1, 'df1':[1,2]})
df2 = gpd.GeoDataFrame({'geometry': polys2, 'df2':[1,2]})

Я пытаюсь получить следующее значение: union:

res_union = gpd.overlay(df1, df2, how='union')

, и оно завершается ошибкой со следующей ОШИБКОЙ:

AttributeError: 'NoneType' object has no attribute 'intersection'

IЯ следую инструкциям здесь .

1 Ответ

0 голосов
/ 13 января 2019

Несмотря на то, что я не знаю операционной системы OP, я думаю, что я понял, как решить проблему, по крайней мере, для систем GNU / Linux (я не могу тестировать в других системах).

Прямое объяснение

Чтобы использовать функцию overlay, вам нужно больше, чем просто установить geopandas, вам нужно установить rtree, но rtree - это оболочка длябиблиотека C libspatialindex .Поэтому, чтобы использовать библиотеку rtree, вам необходимо установить библиотеку libspatialindex C.

Чтобы установить libspatialindex, откройте конец терминала:

sudo apt-get update && apt-get install -y libspatialindex-dev

Примечание: на самом деле вам нужен только sudo apt-get install libspatialindex-dev, но рекомендуется обновлять систему, и флаг -y просто не останавливает процесс установки, запрашивая продолжение установки или нет.

Теперь это должно решить вашу проблему.Примечание: убедитесь, что в вашей системе установлено rtree, вы можете сделать это с помощью pip3 freeze (я полагаю, вы используете python3).

Длинное объяснение

Я столкнулся с той же ошибкой и потратил много времени, чтобы выяснить, в чем проблема.Ответ на этот вопрос libspatialindex и Rtree на python дает мне совет о том, как решить проблему.

Рассмотрите приведенный ниже код (пример кода ОП) и сохраните имя под именем script.py:

import geopandas as gpd
from shapely.geometry import Polygon


polys1 = gpd.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),
                        Polygon([(2,2), (4,2), (4,4), (2,4)])])

polys2 = gpd.GeoSeries([Polygon([(1,1), (3,1), (3,3), (1,3)]),
                        Polygon([(3,3), (5,3), (5,5), (3,5)])])

df1 = gpd.GeoDataFrame({'geometry': polys1, 'df1':[1,2]})

df2 = gpd.GeoDataFrame({'geometry': polys2, 'df2':[1,2]})

res_union = gpd.overlay(df1, df2, how='union')

Рассмотрим следующее requirements.txt:

Shapely==1.6.4.post2
descartes==1.1.0
geopandas==0.4.0
matplotlib==3.0.2

Если вы попытаетесь установить библиотеки только в requirements.txt и запустить scrip.py, а не установить rtree библиотека в соответствии с requirements.txt, будет отображаться следующее сообщение об ошибке:

/usr/local/lib/python3.6/site-packages/geopandas/base.py:76: UserWarning: Cannot generate spatial index: Missing package `rtree`.
  warn("Cannot generate spatial index: Missing package `rtree`.")
Traceback (most recent call last):
  File "script.py", line 17, in <module>
    res_union = gpd.overlay(df1, df2, how='union')
  File "/usr/local/lib/python3.6/site-packages/geopandas/tools/overlay.py", line 371, in overlay
    result = _overlay_union(df1, df2)
  File "/usr/local/lib/python3.6/site-packages/geopandas/tools/overlay.py", line 298, in _overlay_union
    dfinter = _overlay_intersection(df1, df2)
  File "/usr/local/lib/python3.6/site-packages/geopandas/tools/overlay.py", line 212, in _overlay_intersection
    sidx = bbox.apply(lambda x: list(spatial_index.intersection(x)))
  File "/usr/local/lib/python3.6/site-packages/pandas/core/series.py", line 3194, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas/_libs/src/inference.pyx", line 1472, in pandas._libs.lib.map_infer
  File "/usr/local/lib/python3.6/site-packages/geopandas/tools/overlay.py", line 212, in <lambda>
    sidx = bbox.apply(lambda x: list(spatial_index.intersection(x)))
AttributeError: 'NoneType' object has no attribute 'intersection'

Последняя строка сообщения об ошибке

AttributeError: 'NoneType' object has no attribute 'intersection'

не так полезен.Но если вы посмотрите на первую строку:

/usr/local/lib/python3.6/site-packages/geopandas/base.py:76: UserWarning: Cannot generate spatial index: Missing package rtree .

, вы пожалуетесь на библиотеку rtree.

Итак, давайте установим rtree и посмотрим, что произойдет.requirements.txt теперь обновляется до:

Shapely==1.6.4.post2
descartes==1.1.0
geopandas==0.4.0
matplotlib==3.0.2
rtree==0.8.3

При повторном запуске script.py я получаю следующую ошибку:

Traceback (most recent call last):
  File "script.py", line 3, in <module>
    import geopandas as gpd
  File "/usr/local/lib/python3.6/site-packages/geopandas/__init__.py", line 1, in <module>
    from geopandas.geoseries import GeoSeries
  File "/usr/local/lib/python3.6/site-packages/geopandas/geoseries.py", line 12, in <module>
    from geopandas.base import GeoPandasBase, _series_unary_op, _CoordinateIndexer
  File "/usr/local/lib/python3.6/site-packages/geopandas/base.py", line 14, in <module>
    from rtree.core import RTreeError
  File "/usr/local/lib/python3.6/site-packages/rtree/__init__.py", line 1, in <module>
    from .index import Rtree
  File "/usr/local/lib/python3.6/site-packages/rtree/index.py", line 5, in <module>
    from . import core
  File "/usr/local/lib/python3.6/site-packages/rtree/core.py", line 125, in <module>
    raise OSError("Could not find libspatialindex_c library file")
OSError: Could not find libspatialindex_c library file

Последняя строка жалуется на libspatialindex_c, как объясненов первой части моего ответа, «Прямое объяснение», просто запустите приведенный ниже код, чтобы установить libspatialindex, и script.py должен работать.

sudo apt-get update && apt-get install -y libspatialindex-dev

По крайней мере, длямне проблема решена.

...