以下のコードを使用して、数百万のGPSポイントの国(および場合によっては州)を見つけています。現在、コードは1ポイントあたり約1秒かかりますが、これは非常に遅いです。シェープファイルは6 MBです。
ジオパンダは空間結合にrtreeを使用しており、信じられないほど効率的であると読みましたが、これはここでは機能しないようです。私は何を間違えていますか?私は毎秒1000ポイントかそこらを望んでいました。
シェープファイルとcsvはここからダウンロードできます(5MB):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
は一般的に何らかの形で高速であることを意味するものではありません。以下のnick_gの答えを読んでください。