Несмотря на то, что я не знаю операционной системы 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
По крайней мере, длямне проблема решена.