मुझे RTree के साथ स्थानिक इंडेक्स के उपयोग को समझने में परेशानी हो रही है।
उदाहरण: मेरे पास 300 बफ़र पॉइंट हैं, और मुझे प्रत्येक बफ़र के चौराहे के क्षेत्र को बहुभुज के आकार के साथ जानना होगा। बहुभुज आकार की आकृति में> 20,000 बहुभुज होते हैं। यह सुझाव दिया गया था कि मैं प्रक्रिया में तेजी लाने के लिए स्थानिक सूचकांकों का उपयोग करता हूं।
SO ... यदि मैं अपने बहुभुज आकार के लिए एक स्थानिक सूचकांक बनाता हूं, तो क्या यह किसी तरह से फ़ाइल में "संलग्न" होगा, या क्या सूचकांक अकेले खड़ा होगा? यही है, इसे बनाने के बाद क्या मैं सिर्फ बहुभुज फ़ाइल पर अपना चौराहा फ़ंक्शन चला सकता हूं और तेजी से परिणाम प्राप्त कर सकता हूं? चौराहे "देखना" होगा कि स्थानिक सूचकांक हैं और जानते हैं कि क्या करना है? या, क्या मुझे इसे सूचकांक पर चलाने की आवश्यकता है, फिर उन परिणामों को मेरे मूल बहुभुज फ़ाइल पर वापस FID या कुछ इस तरह से संबंधित करें?
RTree प्रलेखन मुझे बहुत मदद नहीं कर रहा है (शायद इसलिए कि मैं सिर्फ प्रोग्रामिंग सीख रहा हूं)। वे मैन्युअल रूप से बनाए गए बिंदुओं में पढ़कर एक इंडेक्स बनाने का तरीका बताते हैं, और फिर इसे अन्य मैन्युअल रूप से बनाए गए पॉइंट्स के विरुद्ध क्वेरी करते हैं, जो विंडो के भीतर निहित आईडी देता है। समझ में आता है। लेकिन, वे यह नहीं समझाते हैं कि यह कैसे कुछ मूल फ़ाइल से संबंधित होगा जो सूचकांक से आया होगा।
मैं सोच रहा हूँ कि यह कुछ इस तरह से जाना चाहिए:
- मेरे बहुभुज आकार से प्रत्येक बहुभुज के लिए बॉक्स खींचो और उन्हें एक स्थानिक सूचकांक में रखें, जिससे उन्हें एक आईडी दी जाए जो आकृति में उनकी आईडी के समान है।
- उस इंडेक्स को प्राप्त करने के लिए उस इंडेक्स को क्वेरी करें जो प्रतिच्छेद करता है।
- फिर मेरे मूल आकृति में केवल उन विशेषताओं पर अपने अंतरक्षेत्र को फिर से चलाएं जिन्हें मेरे सूचकांक को क्वेरी करके पहचाना गया था (यह निश्चित नहीं कि मैं यह अंतिम भाग कैसे करूंगा)।
क्या मेरे पास सही विचार है? क्या मुझे कुछ याद आ रहा है?
अभी मैं इस कोड को एक पॉइंट शेपफाइल पर काम करने की कोशिश कर रहा हूं जिसमें केवल एक पॉइंट फीचर है, और एक पॉलीगॉन शेपफाइल जिसमें> 20,000 पॉलीगॉन फीचर हैं।
मैं Fiona का उपयोग करके शेपफाइल्स आयात कर रहा हूं, RTree का उपयोग करके स्थानिक सूचकांक जोड़ रहा हूं, और Shapely का उपयोग करके चौराहे को करने की कोशिश कर रहा हूं।
मेरा परीक्षण कोड इस तरह दिखता है:
#point shapefile representing location of desired focal statistic
traps = fiona.open('single_pt_speed_test.shp', 'r')
#polygon shapefile representing land cover of interest
gl = MultiPolygon([shape(pol['geometry']) for pol in fiona.open('class3_aa.shp', 'r')])
#search area
areaKM2 = 20
#create empty spatial index
idx = index.Index()
#set initial search radius for buffer
areaM2 = areaKM2 * 1000000
r = (math.sqrt(areaM2/math.pi))
#create spatial index from gl
for i, shape in enumerate(gl):
idx.insert(i, shape.bounds)
#query index for ids that intersect with buffer (will eventually have multiple points)
for point in traps:
pt_buffer = shape(point['geometry']).buffer(r)
intersect_ids = pt_buffer.intersection(idx)
लेकिन मुझे टाइपर्रर मिलता रहता है: 'बहुभुज' ऑब्जेक्ट कॉल करने योग्य नहीं है
TypeError: 'Polygon' object is not callable
अपने अद्यतन उदाहरण के साथ प्राप्त कर रहे हैं क्योंकि आप shape
इस पंक्ति के साथ आपके द्वारा बनाई गई बहुभुज वस्तु के साथ सुडौल से आयातित फ़ंक्शन को ओवरराइट करते हैं :for i, shape in enumerate(gl):