geopandas mekansal katılmak son derece yavaş


14

Milyonlarca GPS noktası için bir ülke (ve bazen devlet) bulmak için aşağıdaki kodu kullanıyorum. Kod şu anda nokta başına yaklaşık bir saniye sürüyor, bu inanılmaz derecede yavaş. Şekil dosyası 6 MB'dir.

Geopandaların uzaysal birleşimler için rtrees kullandıklarını ve onları inanılmaz derecede verimli hale getirdiğini okudum, ancak bu burada işe yaramıyor gibi görünüyor. Neyi yanlış yapıyorum? Saniyede bin puan bekliyordum.

Şekil dosyası ve csv buradan indirilebilir (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

Veri bağlantınız 404
Aaron

Yanıtlar:


17

sjoin işlevinde op = 'inside' argümanının eklenmesi, çokgen noktasında nokta işlemini önemli ölçüde hızlandırır.

Varsayılan değer op = 'kesişiyor', ki bu da doğru sonuca yol açacaktır, ancak 100 ila 1000 kat daha yavaştır.


Bunu okuyan herkes için bu, genellikle bir şekilde daha hızlı withinolduğu anlamına gelmez, aşağıdaki nick_g'nin cevabını okuyun.
19:42 de inc42

7

Soru, geopandas uzamsal birleşimlerinde r ağacından nasıl yararlanacağını soruyor ve başka bir cevaplayıcı, 'kesişmeler' yerine 'içeride' kullanmanız gerektiğini doğru bir şekilde gösteriyor. Bununla birlikte, bu geopandas r-tree eğitiminde gösterildiği gibi intersects/ kullanırken jeopandalardaki bir r-ağacı uzamsal dizininden de yararlanabilirsiniz :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)]

6

Burada olup bitenler sadece sağdaki veri çerçevesinin rtree dizinine beslenmesidir: https://github.com/geopandas/geopandas/blob/master/geopandas/tools/sjoin.py#L48-L55 Hangi için op="intersects"run, Çokgenin dizine beslendiği anlamına gelir, bu nedenle her nokta için karşılık gelen çokgen, rtree dizini aracılığıyla bulunur.

Ancak op="within", işlem aslında tersi olduğu için coğrafi veri çerçeveleri ters çevrilir contains: https://github.com/geopandas/geopandas/blob/master/geopandas/tools/sjoin.py#L41-L43

Bu nedenle, ' opden' op="intersects"e geçiş op="within"yaptığınızda, her poligon için karşılık gelen noktalar, durumunuzda sorguyu hızlandıran rtree dizini aracılığıyla bulunur.


1
Kalıcı olmayan URL'ler kullandınız, bunları belirli bir düzeltmeye güncelleyebilir misiniz?
inc42
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.