J'utilise le code ci-dessous pour trouver un pays (et parfois un état) pour des millions de points GPS. Le code prend actuellement environ une seconde par point, ce qui est incroyablement lent. Le fichier de formes fait 6 Mo.
J'ai lu que les géopandas utilisent rtrees pour les jointures spatiales, ce qui les rend incroyablement efficaces, mais cela ne semble pas fonctionner ici. Qu'est-ce que je fais mal? J'espérais mille points par seconde environ.
Le shapefile et le csv peuvent être téléchargés ici (5 Mo): https://www.dropbox.com/s/gdkxtpqupj0sidm/SpatialJoin.zip?dl=0
import pandas as pd
import geopandas as gpd
from geopandas import GeoDataFrame, read_file
from geopandas.tools import sjoin
from shapely.geometry import Point, mapping,shape
import time
#parameters
shapefile="K:/.../Shapefiles/Used/World.shp"
df=pd.read_csv("K:/.../output2.csv",index_col=None,nrows=20)# Limit to 20 rows for testing
if __name__=="__main__":
start=time.time()
df['geometry'] = df.apply(lambda z: Point(z.Longitude, z.Latitude), axis=1)
PointsGeodataframe = gpd.GeoDataFrame(df)
PolygonsGeodataframe = gpd.GeoDataFrame.from_file(shapefile)
PointsGeodataframe.crs = PolygonsGeodataframe.crs
print time.time()-start
merged=sjoin(PointsGeodataframe, PolygonsGeodataframe, how='left')
print time.time()-start
merged.to_csv("K:/01. Personal/04. Models/10. Location/output.csv",index=None)
print time.time()-start