tham gia không gian geopandas rất chậm


12

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

Câu trả lời:


16

thêm đối số op = 'bên trong' trong hàm sjoin sẽ tăng tốc đáng kể cho hoạt động đa giác điểm.

Giá trị mặc định là op = 'giao nhau', mà tôi đoán cũng sẽ dẫn đến kết quả chính xác, nhưng chậm hơn 100 đến 1000 lần.


Đối với bất kỳ ai đọc nó, điều này không có nghĩa withinnói chung nhanh hơn, hãy đọc câu trả lời của nick_g bên dưới.
inc42

7

Câu hỏi hỏi làm thế nào để tận dụng lợi thế của cây r trong các liên kết không gian của geopandas và một câu trả lời khác chỉ ra một cách chính xác rằng bạn nên sử dụng 'trong' thay vì 'giao nhau'. Tuy nhiên, bạn cũng có thể tận dụng chỉ số không gian của cây r trong geopandas trong khi sử dụng intersects/ intersection, như được minh họa trong hướng dẫn r-cây geopandas này :

spatial_index = gdf.sindex
possible_matches_index = list(spatial_index.intersection(polygon.bounds))
possible_matches = gdf.iloc[possible_matches_index]
precise_matches = possible_matches[possible_matches.intersects(polygon)]

5

Điều có thể xảy ra ở đây là chỉ có khung dữ liệu ở bên phải được đưa vào chỉ mục rtree: https://github.com/geopandas/geopandas/blob/master/geopandas/tools/sjoin.py#L48-L55 Dành cho op="intersects"chạy có nghĩa là Đa giác được đưa vào chỉ mục, vì vậy với mỗi điểm, đa giác tương ứng được tìm thấy thông qua chỉ số rtree.

Nhưng đối với op="within", geodataframes bị lật do hoạt động thực sự là nghịch đảo của contains: https://github.com/geopandas/geopandas/blob/master/geopandas/tools/sjoin.py#L41-L43

Vì vậy, điều đã xảy ra khi bạn chuyển optừ op="intersects"sang op="within"là cho mọi đa giác, các điểm tương ứng được tìm thấy thông qua chỉ số rtree, trong trường hợp của bạn đã tăng tốc truy vấn.


1
Bạn đã sử dụng URL không cố định, bạn có thể cập nhật chúng lên một bản sửa đổi cụ thể không?
inc42
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.