Korzystam z poniższego kodu, aby znaleźć kraj (a czasem stan) dla milionów punktów GPS. Kod zajmuje obecnie około jednej sekundy na punkt, co jest niezwykle powolne. Plik shapefile ma 6 MB.
Czytałem, że geopandy wykorzystują rtree do połączeń przestrzennych, co czyni je niesamowicie wydajnymi, ale wydaje się, że to tutaj nie działa. Co ja robię źle? Miałem nadzieję na tysiąc punktów na sekundę.
Plik shapefile i csv można pobrać tutaj (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