ジオパンダの空間結合が非常に遅い


12

以下のコードを使用して、数百万の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

回答:


16

sjoin関数に引数op = 'within'を追加すると、point-in-polygon操作が劇的に高速化されます。

デフォルト値はop = 'intersects'です。これは正しい結果にもつながると思いますが、100〜1000倍遅くなります。


これを読んでいる人にとって、これwithin一般的に何らかの形で高速であることを意味するものではありません。以下のnick_gの答えを読んでください。
inc42

7

質問は、geopandasの空間結合でrツリーを利用する方法を尋ねます。別のレスポンダーは、「intersects」ではなく「within」を使用する必要があることを正しく指摘しています。ただし、このgeopandas r-treeチュートリアルで示されているように、intersects/ を使用しながら、gepandasのr-tree空間インデックスを利用することもできます。intersection

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

:どのような可能性がここに起こっているのは、右の唯一のデータフレームがRTREEインデックスに供給されていることである https://github.com/geopandas/geopandas/blob/master/geopandas/tools/sjoin.py#L48-L55 ため、どのop="intersects"runは、Polygonがインデックスに入力されたことを意味するため、すべてのポイントについて、rtreeインデックスから対応するポリゴンが見つかります。

ただしop="within"、操作は実際には次の逆であるため、ジオデータフレームは反転されますcontainshttps : //github.com/geopandas/geopandas/blob/master/geopandas/tools/sjoin.py#L41-L43

opからop="intersects"に切り替えたときに起こったのop="within"は、すべてのポリゴンについて、rtreeインデックスを介して対応するポイントが検出されることです。これにより、クエリが高速化されました。


1
非永続的なURLを使用しましたが、特定のリビジョンに更新できますか?
inc42
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.