क्या आर्कपी के पास ज्यामिति के लिए स्थानिक खोज कार्य है?


10

मेरी समस्या: आर्कपी के उपयोग से मैं बफ़र्स पर लूप करना चाहता हूं और प्रत्येक बफ़र के अंदर ज्योमेट्री_फ्रीचर का चयन करता हूं और उस विशिष्ट बफ़र के भीतर पाई जाने वाली वस्तुओं के बारे में केवल कुछ (अपडेट) करता हूं। नीचे दिया गया कोड बताता है कि मैं क्या करना चाहता हूं (कम या ज्यादा):

def _update_connections_inside_buffers(self):
    buffers = arcpy.SearchCursor(self.__buffer_class_name)
    in_layer = "connections"
    for i_buffer in buffers:
        shape = i_buffer.shape
        # can not use a geometry to do a selection.. very inconvenient!!
        connections = arcpy.SelectLayerByLocation_management(in_layer, "WITHIN", shape) 
        self._update_connections(connections)

हालाँकि: यह काम नहीं करेगा क्योंकि SelectLayerByLocation_management () एक ज्यामिति, "आकृति" को एक तर्क के रूप में स्वीकार नहीं करता है, लेकिन एक feature_class_name (परत नाम) की अपेक्षा करता है। क्या एक चापलूसी विधि है जो एक स्थानिक विधेय का उपयोग करके खोज कर सकती है। मुझे पता नहीं है कि ईएसआरआई मैनुअल से यह कैसे किया जा सकता है।

जवाबों:


13

मुझे विश्वास है कि ऐसा कुछ किया जा सकता है क्योंकि हम अपने एक प्रशिक्षण पाठ्यक्रम में नीचे दिए गए कोड का उपयोग करते हैं। यदि यह काम नहीं करता प्रतीत होता है, तो मुझे संदेह है कि आपने या तो परत को ऑब्जेक्ट को परिभाषित नहीं किया है आर्कबोर्ड के सामग्री तालिका में एक परत का उपयोग करके, या आर्केप के बाहर MakeFeatureLayer का उपयोग करके।

या, अधिक संभावना है कि मुझे लगता है कि SelectLayerByLocation के बगल में यह "कनेक्शन =" है जो आपको आपकी समस्या दे रहा है क्योंकि आप इसे किसी परिणाम ऑब्जेक्ट पर सेट कर रहे हैं और इसे वापस पारित करने से पहले इसमें से कुछ भी नहीं निकाल रहे हैं।

import arcpy
schoolsLayer = "Schools"
suburbsLayer = "Suburbs"
# get an update cursor as we will be changing values
rows = arcpy.UpdateCursor(suburbsLayer)
# loop through each suburb in the layer
for row in rows:
    polygon = row.SHAPE
    arcpy.SelectLayerByLocation_management(schoolsLayer,"INTERSECT",polygon)

2

यह किया जा सकता है, लेकिन जहां तक ​​मुझे पता है, केवल फ़ीचर लेयर्स w / arcpy के उपयोग के माध्यम से। अनिवार्य रूप से आप एक क्लॉज बनाएंगे और इसे OID (या अन्य विशिष्ट पहचान वाले क्षेत्र) और SelectLayerByLocation के माध्यम से लूप के साथ अपडेट करेंगे।

पीएसयू मास्टर के कार्यक्रम से इस ट्यूटोरियल की जाँच करें - यह बहुत सटीक रूप से कवर करता है कि आप क्या कर रहे हैं अगर मैं गलत नहीं हूँ।

ज्यामिति के संदर्भ की आवश्यकता नहीं है; स्थानिक क्वेरी ज्यामिति का उपयोग इस आधार पर करती है कि आप किस प्रकार की क्वेरी को परिभाषित करते हैं (अर्थात पूरी तरह से, एक सीमा, आदि साझा करता है)। यदि आपको इन बिंदुओं की ज्यामिति को संदर्भित करने की आवश्यकता है, तो एक बार जब वे बफ़र के भीतर निर्धारित हो जाते हैं तो उन्हें (OID) एक अजगर सूची में जोड़ दें और जहां एक क्लॉज का उपयोग करके मूल डेटा सेट के साथ काम करें।


मैंने समस्या का हल ढूंढ लिया। मुझे class_layer को संदर्भित करने वाले स्ट्रिंग के बजाय पहले तर्क के रूप में एक feature_layer देना था।
user8175

1

मैंने समस्या का हल ढूंढ लिया। मुझे class_layer को संदर्भित करने के बजाय पहले तर्क के रूप में एक feature_layer प्रदान करना था। "

    # Make a feature layer from the feature class
    class_layer = arcpy.env.workspace + "." + "connections"
    arcpy.MakeFeatureLayer_management(class_layer, "feature_layer")

    # Do selection using feature_layer 
    arcpy.SelectLayerByLocation_management("feature_layer", "WITHIN", p_polygon)

    # get result
    connections_found_in_polygon = arcpy.SearchCursor("feature_layer")
    self._update_connections(connections_found_in_polygon)

3
मुझे पूरा यकीन है कि PolyGeo के उत्तर ने इसे कवर किया है। आपको एक फीचर क्लास और एक फीचर लेयर के बीच के अंतर पर ध्यान देना चाहिए ।
ब्लाह 238
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.