web-dev-qa-db-fra.com

geopandas: sjoin l'objet 'NoneType' n'a pas d'attribut 'intersection'

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'
7
camnesia

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.

  1. Téléchargez le fichier .whl pour le droit python version & système à partir de: https://www.lfd.uci.edu/~gohlke/pythonlibs/#rtree

  2. 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
  1. J'ai dû redémarrer mon interpréteur après l'installation (en utilisant JupyterLab)
0
Frank