geo pandas: объект sjoin 'NoneType' не имеет атрибута 'пересечение' - PullRequest
4 голосов
/ 30 января 2020

Я пытаюсь выполнить пространственное соединение с двумя наборами данных с открытым исходным кодом. Я сталкиваюсь с ошибкой AttributeError: 'NoneType' object has no attribute 'intersection'. Подобные ошибки, по-видимому, были устранены путем удаления пустой геометрии, но это, похоже, не помогает. У меня также есть spatialindex-1.9.3 и rtree-0.9.3. Я использую Python 3,8

import geopandas as gpd
import pandas as pd
from shapely.geometry import Point

# Import LSOA polygon data
LSOA_polygons = gpd.read_file('https://raw.githubusercontent.com/gausie/LSOA- 2011-GeoJSON/master/lsoa.geojson')

# Remove any empty geometry
LSOA_polygons = LSOA_polygons[LSOA_polygons.geometry.type == 'Polygon']

# UK charge point data
url_charge_points = 'http://chargepoints.dft.gov.uk/api/retrieve/registry/format/csv'
charge_points = pd.read_csv(url_charge_points, lineterminator='\n', low_memory=False, usecols=[0,3,4])

# Create a geometry column 
geometry = [Point(xy) for xy in zip(charge_points['longitude'], charge_points['latitude'])]

# Coordinate reference system : WGS84
crs = {'init': 'epsg:4326'}

# Create a Geographic data frame 
charge_points = gpd.GeoDataFrame(charge_points, crs=crs, geometry=geometry)

# Remove any empty geometry
charge_points = charge_points[charge_points.geometry.type == 'Point']

# Execute spatial join
charge_points_LSOA = gpd.sjoin(charge_points, LSOA_polygons, how="inner", op='intersects')

Я получаю ошибку:


AttributeError                            Traceback (most recent call last)

<ipython-input-13-d724e30179d7> in <module>
     12 
     13 # Execute spatial join
---> 14 charge_points_LSOA = gpd.sjoin(charge_points, LSOA_polygons, how="inner", op='intersects')
     15 
     16 charge_points_LSOA = (charge_points_LSOA >>

~/PycharmProjects/Desirability/venv/lib/python3.8/site-packages/geopandas/tools/sjoin.py in sjoin(left_df, right_df, how, op, lsuffix, rsuffix)
    106     # get rtree spatial index
    107     if tree_idx_right:
--> 108         idxmatch = left_df.geometry.apply(lambda x: x.bounds).apply(
    109             lambda x: list(tree_idx.intersection(x)) if not x == () else []
    110         )

~/PycharmProjects/Desirability/venv/lib/python3.8/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   4043             else:
   4044                 values = self.astype(object).values
-> 4045                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   4046 
   4047         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

~/PycharmProjects/Desirability/venv/lib/python3.8/site-packages/geopandas/tools/sjoin.py in <lambda>(x)
    107     if tree_idx_right:
    108         idxmatch = left_df.geometry.apply(lambda x: x.bounds).apply(
--> 109             lambda x: list(tree_idx.intersection(x)) if not x == () else []
    110         )
    111         idxmatch = idxmatch[idxmatch.apply(len) > 0]

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

Ответы [ 2 ]

4 голосов
/ 01 февраля 2020

У меня было идентичное сообщение об ошибке. Проследив код sjoin, я заметил, что у меня не установлено rtree ... :-( После его установки ошибка исчезла.

Однако я не смог самостоятельно протестировать ваш код - URL для данных полигона возвращает 404.

0 голосов
/ 09 мая 2020

столкнулся с этой же проблемой.

Я использую python 3.8 на windows в виртуальной среде и использую pip для управления своими пакетами.

Это сработало для меня:

  1. Загрузите правильный файл .whl для вашего python интерпретатора и системы из: https://www.lfd.uci.edu/~gohlke/pythonlibs/#rtree

  2. В соответствующей среде запустите pip install с соответствующей путь к файлу .whl:

pip install C:\Users\..\Rtree-0.9.4-cp38-cp38-win_amd64.whl
Мне пришлось перезапустить мой интерпретатор после установки (используя JupyterLab)

Также я перезапустил P C для хорошей меры (не уверен, если необходимо), прежде чем пытаться код, вызвавший ошибку изначально .

...