geopandas स्थानिक अत्यंत धीमी गति से जुड़ते हैं


14

मैं लाखों जीपीएस बिंदुओं के लिए एक देश (और कभी-कभी राज्य) खोजने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं। वर्तमान में कोड प्रति सेकंड एक सेकंड लगता है, जो अविश्वसनीय रूप से धीमा है। शेपफाइल 6 एमबी है।

मैंने पढ़ा कि जियोपैन्ड्स स्थानिक जुड़ावों के लिए rtrees का उपयोग करता है, जिससे वे अविश्वसनीय रूप से कुशल हो जाते हैं, लेकिन यह यहां काम नहीं करता है। मैं क्या गलत कर रहा हूं? मैं प्रति सेकंड एक हजार अंक की उम्मीद कर रहा था।

शेपफाइल और सीएसवी को यहां डाउनलोड किया जा सकता है (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

आपका डाटा लिंक 404 है
हारून

जवाबों:


17

sjoin फ़ंक्शन में तर्क op = 'भीतर' जोड़ने से बिंदु-इन-बहुभुज ऑपरेशन में नाटकीय रूप से गति होती है।

डिफ़ॉल्ट मान op = 'intersects' है, जो मुझे लगता है कि सही परिणाम भी देगा, लेकिन यह 100 से 1000 गुना धीमा है।


किसी को भी इस पढ़ने के लिए, इसका मतलब यह नहीं है कि withinहै आम तौर पर नीचे पढ़ने nick_g का जवाब, किसी भी तरह तेजी से।
४४२

7

यह सवाल पूछता है कि जियोपैन्डस स्थानिक जुड़ावों में आर-ट्री का लाभ कैसे उठाया जाए, और एक अन्य उत्तरदाता सही ढंग से बताता है कि आपको 'चौराहों' के बजाय 'भीतर' का उपयोग करना चाहिए। हालाँकि, आप geopandas में r-tree स्थानिक इंडेक्स का लाभ भी उठा सकते हैं, जबकि intersects/ intersectionइस geopandas r- ट्री ट्यूटोरियल में प्रदर्शित किया गया है :

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

यहाँ क्या होने की संभावना है कि केवल दाईं ओर डेटाफ़्रेम rtree इंडेक्स में फीड किया गया है: https://github.com/geopandas/geopandas/blob/master/geopandas/tools/sjoin.py-L48-L55 कौन सा op="intersects"रन का मतलब होगा कि बहुभुज को सूचकांक में खिलाया गया था, इसलिए प्रत्येक बिंदु के लिए, संबंधित बहुभुज rtree सूचकांक के माध्यम से पाया जाता है।

लेकिन op="within", ऑपरेशन के बाद से जियोडैटफ्रेम फ़्लिप किया जाता है क्योंकि वास्तव में इसका उलटा होता है contains: https://github.com/geopandas/geopandas/blob/master/geopandas/tools/sjoin.py#L41-L43

तो क्या हुआ जब आप बंद opसे op="intersects"करने के लिए op="within"है कि हर बहुभुज के लिए, इसी अंक rtree सूचकांक है, जो अपने मामले में क्वेरी तेज के माध्यम से पाए जाते हैं।


1
आपने गैर-स्थायी URL का उपयोग किया, क्या आप उन्हें किसी विशेष संशोधन में अपडेट कर सकते हैं?
४२४२ ३०'१
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.