J'essaye de faire une jointure spatiale avec deux ensembles de données open source. Je rencontre un AttributeError: 'NoneType' object has no attribute 'intersection'
Erreur. Des erreurs similaires semblent avoir été résolues en s'assurant que la géométrie vide est supprimée, mais cela ne semble pas aider. J'ai également installé spatialindex-1.9.3 et rtree-0.9.3. J'utilise 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')
L'erreur que j'obtiens:
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'
Ran dans ce même problème, comme mentionné par stratophile, j'ai dû installer Rtree. Ce qui peut être accompli comme suit:
J'utilise python 3.8 sous Windows. J'ai installé le package Rtree dans un environnement virtuel créé pour mon projet, en utilisant pip pour installer les packages.
Téléchargez le fichier .whl pour le droit python version & système à partir de: https://www.lfd.uci.edu/~gohlke/pythonlibs/#rtree
Avec l'environnement virtuel du projet activé, exécutez pip install avec le chemin d'accès approprié au fichier .whl téléchargé à l'étape 1:
pip install C:\Users\...\Rtree-0.9.4-cp38-cp38-win_AMD64.whl