Tôi đang sử dụng mã dưới đây để tìm một quốc gia (và đôi khi là tiểu bang) cho hàng triệu điểm GPS. Mã hiện mất khoảng một giây mỗi điểm, rất chậm. Shapefile là 6 MB.
Tôi đọc được rằng geopandas sử dụng rtrees cho các phép nối không gian, làm cho chúng hiệu quả đến không ngờ, nhưng điều này dường như không hoạt động ở đây. Tôi đang làm gì sai? Tôi đã hy vọng cho một ngàn điểm mỗi giây hoặc lâu hơn.
Có thể tải xuống shapefile và csv tại đây (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
là nói chung nhanh hơn, hãy đọc câu trả lời của nick_g bên dưới.