Ich verwende den folgenden Code, um ein Land (und manchmal einen Bundesstaat) für Millionen von GPS-Punkten zu finden. Der Code benötigt derzeit ungefähr eine Sekunde pro Punkt, was unglaublich langsam ist. Das Shapefile ist 6 MB groß.
Ich habe gelesen, dass Geopandas rtrees für räumliche Verknüpfungen verwenden, was sie unglaublich effizient macht, aber das scheint hier nicht zu funktionieren. Was mache ich falsch? Ich habe auf tausend Punkte pro Sekunde gehofft.
Das Shapefile und die CSV können hier heruntergeladen werden (5 MB): 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
within
es im Allgemeinen irgendwie schneller ist. Lesen Sie dazu die Antwort von nick_g weiter unten.