आर्कपी में लोग पायथन डेटा संरचनाओं और कक्षाओं का उपयोग कैसे कर रहे हैं?


16

यह प्रश्न प्रोग्रामिंग पर मेरी अज्ञानता को उजागर कर सकता है, लेकिन मुझे इस बात की उत्सुकता है कि लोग आर्कपी के भीतर विभिन्न अजगर डेटा संरचनाओं का उपयोग कैसे कर रहे हैं।

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

इसके अलावा, कोई संदेह नहीं है, लोग आर्कपी में कस्टम कक्षाएं बना रहे हैं। आपको किन परिस्थितियों और परिस्थितियों में इनकी आवश्यकता होती है? क्या आप उदाहरण प्रदान कर सकते हैं? क्या कोई भी कस्टम वर्ग बना रहा है जो अंतर्निर्मित आर्कपी कक्षाओं से विरासत में मिला है?

मुझे इन सभी सवालों के जवाब की आवश्यकता नहीं है, मैं बस उत्सुक हूं कि लोग जीआईएस में पायथन का उपयोग कैसे कर रहे हैं और वर्कफ़्लो को इन अनुकूलन की आवश्यकता है।


4
दिलचस्प सवाल लेकिन इसका कोई निश्चित जवाब नहीं है। सामुदायिक विकि होना चाहिए।
RK

जवाबों:


14

कई आर्कषक कार्य जो कई इनपुट लेते हैं वे पायथन सूची वस्तुओं को स्वीकार करते हैं।

उदाहरण के लिए Dissolve_managementफ़ंक्शन फ़ील्ड नामों की एक सूची को स्वीकार करता है:

arcpy.Dissolve_management("taxlots", "C:/output/output.gdb/taxlots_dissolved",
    ["LANDUSE", "TAXCODE"], "", "SINGLE_PART", "DISSOLVE_LINES")

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

एक डिक्शनरी को तेज लुकअप टेबल के रूप में इस्तेमाल किया जा सकता है, जो कि मेमोरी में की-वैल्यू पेयर के अपेक्षाकृत छोटे लेकिन अक्सर उपयोग किए जाने वाले सेट को कैश करने के लिए है। मैंने आर्कजीआईएस मंचों पर इसका एक दिलचस्प उदाहरण देखा: http://forums.arcgis.com/threads/55099-Update-cursor-with-joined-tables-work-around-w-dokes

शामिल होने के बजाय एक शब्दकोष के उपयोग ने उनकी गणना 3.5 घंटे से 15 मिनट तक की।

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

मुझे अपने आप को आर्कपी में उपयोग के लिए पायथन में एक क्लास लिखने की आवश्यकता नहीं है, लेकिन यह कहना नहीं है कि ऐसा उपयोग मामला नहीं है। जब आप कुछ इनपुट (डेटा) पर काम करते हैं, तो आप निकट-संबंधी कार्यों (व्यवहारों) का एक सेट होने पर एक वर्ग उपयोगी हो सकते हैं, और आप उन डेटा और व्यवहारों को ऑब्जेक्ट-ओरिएंटेड तरीके से उपयोग करने में सक्षम होना चाहते हैं, लेकिन यह अधिक है संभावना व्यापार-तर्क विशिष्ट होने वाली है और आर्कपी से संबंधित नहीं है।


7

Blah238 इस विषय को अच्छी तरह से कवर करता है, इसलिए मैं सिर्फ अपने काम से कुछ उदाहरण जोड़ूंगा। मैं बहुत सारे हवाई अड्डे के डेटा को विकसित करता हूं, और मुझे जो कुछ भी नियमित रूप से करना है उनमें से एक क्रम में रनवे के बीच के रनवे सेंटरलाइन बिंदुओं के साथ पढ़ा जाता है। आपको लगता है कि ये बिंदु पहले से ही (जीआईएस डेटाबेस में) क्रम में होंगे, लेकिन वे शायद ही कभी हों। सेंटरलाइन पॉइंट्स हर 10 फीट की दूरी पर सेंटरलाइन के साथ होते हैं और दोनों ओर 10 फीट अलग-अलग सर्वे पॉइंट्स की दूसरी पंक्तियों के साथ फ्लैंक किए जाते हैं। आपको चित्र मिलता है: अंकों का ढेर ... और आमतौर पर सभी को डेटाबेस-वार एक साथ मिलाया जाता है। अपनी लिपियों में मैं क्या कर रहा हूँ, आमतौर पर यह आसान है कि आप विशेषताओं द्वारा (या स्थानिक रूप से ज़रूरत पड़ने पर) केंद्र बिंदुओं का चयन करें, प्रत्येक के लिए निर्देशांक पढ़ें, और परिणामों को पायथन सूची में डंप करें। फिर मैं छाँट सकता हूँ, पॉप, रिवर्स, आदि।

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

जहां तक ​​कक्षाएं चलती हैं, जैसे ब्लाह 238, मुझे कोई भी बनाने की आवश्यकता नहीं मिली। संभवत: कुछ मामले हैं जहां मेरी स्क्रिप्ट्स में एक वर्ग को प्राथमिकता दी जाएगी, लेकिन मैं वास्तव में उन जगहों की पहचान नहीं कर पाया हूं। अधिक प्रोग्रामिंग अनुभव वाला कोई व्यक्ति शायद उन्हें जल्दी से खोज लेगा।


5

मैं भी प्यार शब्दकोशों - उपयोग उन्हें हर समय। यह विधि कुछ स्थानिक संदर्भ गुण प्राप्त करती है और इसे सभी को एक तानाशाही में संग्रहीत करती है:

def get_coord_sys(self, in_dataset):
    """Get and return info on dataset coord sys/projection"""
    spatial_ref = arcpy.Describe(in_dataset).spatialReference
    # Get spatial ref props and put in dictionary
    spat_ref_dict = {}
    spat_ref_dict["name"] = spatial_ref.name
    spat_ref_dict["type"] = spatial_ref.type
    spat_ref_dict["gcs_code"] = spatial_ref.GCSCode
    spat_ref_dict["gcs_name"] = spatial_ref.GCSName
    spat_ref_dict["pcs_code"] = spatial_ref.PCSCode
    spat_ref_dict["pcs_name"] = spatial_ref.PCSName
    return spat_ref_dict

यह विधि दो फीचरक्लासेस से स्निपेट अर्क ज्योमेट्रीज निकालती है, मैं बाद में कुछ ट्रिगर करने के लिए जियोमेट्री का उपयोग करता हूं:

def build_fields_of_view(self):
        """For all KOPs in a study area, build left, right, center FoV triangles"""
        try:    
            fcs = {os.path.join(self.gdb, "WindFarmArray"):[], os.path.join(self.gdb, "KOPs"):[]}
            # Build a dict of WTG and KOP array geometries, looks like:
            #  {'KOPs': [[1, -10049.2697098718, 10856.699451165374], 
            #            [2, 6690.4377855260946, 15602.12386816188]], 
            #   'WindFarmArray': [[1, 5834.9321158060666, 7909.3822339441513], 
            #                     [2, 6111.1759513214511, 7316.9684107396561]]}
            for k, v in fcs.iteritems():
                rows = arcpy.SearchCursor(k, "", self.sr)
                for row in rows:
                    geom = row.shape
                    point = geom.getPart()
                    id = row.getValue("OBJECTID")
                    v.append([id, point.X, point.Y])   

            kops = fcs[os.path.join(self.gdb, "KOPs")] # KOP array
            wtgs = fcs[os.path.join(self.gdb, "WindFarmArray")] # WTG array

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


जवाब के लिए धन्यवाद। इन मामलों में एक शब्दकोश एक अन्य डेटा संरचना की तुलना में बेहतर विकल्प क्यों है?
Fezter

मैं अपनी चाबी से अपने मूल्यों को कॉल करने में सक्षम होना पसंद करता हूं।
चाड कूपर

2
एक और कारण dicts बेहतर हो सकता है क्योंकि वे सूचियों की तुलना में बहुत तेजी से पढ़े जाते हैं क्योंकि वे क्रमबद्ध नहीं हैं। इसलिए, बहुत लंबी सूचियों को संसाधित करने में थोड़ा अधिक समय लग सकता है यदि उनके पास कई प्रविष्टियाँ हों।
ndimhypervol

@gotanuki True, और यदि आपको एक बड़ी सूची का उपयोग करने की आवश्यकता है, तो इसके बजाय एक tuple का उपयोग करें, क्योंकि वे सूचियों की तुलना में तेज़ हैं।
चाड कूपर

2

पढ़ें यह जबकि एक साथ एक जवाब डालने और कुछ संपादन करने के लिए था ..

मैं कोई पायथन विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि कक्षाओं का उपयोग करने के पीछे का विचार यह है कि आप किसी ऐसी वस्तु को तुरंत भेज सकते हैं जिसमें जाने के लिए तैयार विधियों का एक समूह है, जो डेटा संरचना से संबंधित होने के साथ-साथ आपके तरीकों को केंद्रीकृत करता है। वर्गों बनाम मॉड्यूल के साथ कुछ चर गुंजाइश लाभ भी हैं, उपरोक्त लिंक कुछ हद तक इस बिंदु पर मिलता है।

मेरे पास फीचरलेयर नामक एक वर्ग है (शायद पाइथोनिक-लिग नाम नहीं है ... अभी भी सीख रहा है)। मैं कर सकता हूँ

sys.path.append(r"\\Path\To\Scripts")
import gpFuncs as gpF
fc = arcpy.GetParameterAsText(0)
featureLayer = gpF.featureLayer(fc)
points = featureLayer.featureVerticesToPoints(featureid, "", first_and_last)

ऐसा करने की परिभाषा एक वर्ग विधि है जो सिर्फ सुविधाओं, भागों और कोने को पुनरावृत्त करती है। फिर मैं अपने पॉइंट ऑब्जेक्ट को फीचरलेयर इंस्टेंस में बदल सकता हूं और अन्य सामान कर सकता हूं जो मेरी कक्षा में है।

मुझे लगता है कि अगर सही तरीके से बनाई गई कक्षाएं कार्यक्षमता में वृद्धि करना चाहिए। उदाहरण के लिए, जल्द ही मैं रिफ्लेक्ट करना शुरू कर दूंगा ताकि मेरे पास एक फीचर लेयर क्लास हो जिसमें सभी फीचर लेयर्स की विधियां और विशेषताएं हों। फिर इसे एक फीचर लेयरस्ट्रीम श्रेणी उदाहरण बनाने के लिए इनहेरिट करें जो कि सभी फ़ीचर लाइटर विशेषताओं / विधियों को इनहेरिट करेगा लेकिन बहुभुज जैसे विशिष्ट ज्यामिति प्रकार के साथ त्वरित करेगा।


4
की जाँच करें अजगर शैली गाइड (उर्फ पीईपी 8) नामकरण परंपराओं के लिए।
blah238

0

मैं मुख्य रूप से VB .net में काम करता हूं, लेकिन अधिक से अधिक अजगर का उपयोग करके खुद को ढूंढता हूं। VB में मैं पसंद करता हूं और Enums का उपयोग करने की कोशिश करता हूं क्योंकि यह कोड को साफ करता है। अजगर के पहले के संस्करणों ने एनम को लागू नहीं किया था इसलिए एक हैक कुछ गुणों को उजागर करने वाला एक वर्ग बनाने के लिए था, उदाहरणों का एक गुच्छा स्टैक ओवरफ्लो पर चर्चा की जाती है । अब यह अजगर के नवीनतम संस्करण की तरह लग रहा है जो इन पर चर्चा करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.