ArcMap में पायथन लिपि के भीतर क्षेत्र की गणना करें


14

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

मैंने सोचा होगा कि यह एक बहुत ही सामान्य और सरल कार्य है, लेकिन बहुत सारे Googleing के बावजूद मैं अभी तक एक कार्य समाधान खोजने में असमर्थ रहा हूं।

मैं arcpy.updateCursorएक बार गणना करने के बाद मूल्य डालने का उपयोग करने की योजना बना रहा था (इस स्तर पर एफसी में केवल एक ही सुविधा है), इसलिए सबसे आसान है यदि इसे एक चर के रूप में वापस किया जा सकता है। कोई भी वैकल्पिक समाधान जो एक ही कार्य को पूरा करता है (क्षेत्र मान को सही क्षेत्र में प्राप्त करना) भी काम करेगा।

मैंने पायथन से फील्ड कैलकुलेटर की भी कोशिश की है। मदद पृष्ठों से संशोधित मुझे लगा कि निम्नलिखित काम करेगा, लेकिन अभी तक कोई भाग्य नहीं है।

arcpy.AddField_management(tempPgs, "Shape_area", 'DOUBLE')
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)

विंडोज 7 पर पायथन 2.7 के साथ आर्कगिस बेसिक 10.1 SP1 चला रहा है।

मेरे वर्तमान कोड के प्रासंगिक भाग इस प्रकार हैं:

#/.../
arcpy.Copy_management(inpgs, outpgs)
arcpy.AddField_management(outpgs, 'Shape_area', 'LONG')
fields = AM.FieldLst(outpgs)

#/.../

# Identify and search for shapes smaller than minimum area
where1 = '"' + 'Shape_Area' + '" < ' + str(msz)
polyrows = arcpy.SearchCursor(inpgs, where1)

for prow in polyrows:
    grd1 = prow.GridID   # GridID on the current polygon
    grd2 = nDD.get(grd1) # GridID on the polygon downstream

    # Update features
    if grd2
        geometry1 = prow.Shape
        geometry2 = geometryDictionary[grd2]

        # Update temporary features
        arcpy.Merge_management([geometry1, geometry2], tempMerged)
        arcpy.Dissolve_management(tempMerged, tempPgs)

        fds = AM.FieldLst(tempPgs)

        for field in fields[2:]:
            arcpy.AddField_management(tempPgs, field, 'DOUBLE')

        for fd in fds[2:]:
            arcpy.DeleteField_management(tempPgs, fd)

        exp = "float(!SHAPE.AREA!.split())"
        arcpy.CalculateField_management(tempPgs, "Shape_area", exp)

        # Append them to output FC
        try:
            arcpy.Append_management(tempPgs, outpgs, "TEST")
        except arcgisscripting.ExecuteError:
            arcpy.Append_management(tempPgs, outpgs, "NO_TEST")

    elif ...

    else ...

आपका आउटपुट प्रकार क्या है? शेपफाइल, फाइल जियोडेटाबेस, कुछ और? क्या आपकी आउटपुट फ़ाइल अनुमानित या असुरक्षित है?
ब्लॉर्ड-कास्टिलो

इसके अलावा, क्या आप कोड के नमूने के कुछ और पोस्ट कर सकते हैं, विशेष रूप से कर्सर जिसे आप अपडेट करने के लिए उपयोग कर रहे हैं? सबसे अधिक संभावना है कि आप SHAPE@AREAअपने कर्सर के हिस्से के रूप में उस क्षेत्र को पढ़ने के लिए जो चाहें प्राप्त कर सकते हैं; लेकिन कोड की संरचना इस बात पर निर्भर करती है कि क्या आपका क्षेत्र उसी इकाइयों में है जो आप लिखना चाहते हैं।
ब्लॉर्ड-कास्टिलो

जवाबों:


29

बहुभुज क्षेत्र को आर्कपी: 1) फ़ील्ड कैलकुलेटर, 2) "क्लासिक" आर्कपी कर्सर और 3) arcpy.daकर्सर के साथ बहुभुज क्षेत्र को खोजने और संग्रहीत करने के तीन अलग-अलग तरीके हैं । यह कुछ SearchCursor का उपयोग करने के बारे में मेरे पिछले उत्तर से उधार लिया गया है ।


1. फील्ड कैलकुलेटर

  • फ़ील्ड कैलकुलेटर का उपयोग करते समय, तीन अलग-अलग अभिव्यक्ति प्रकार होते हैं जो विभिन्न अभिव्यक्ति पार्सर का उपयोग करते हैं। यह परिकलित फ़ील्ड जियोप्रोसेसिंग टूल के तीसरे पैरामीटर में निर्दिष्ट है । जैसे ज्यामिति ऑब्जेक्ट के गुणों को एक्सेस करते समय !shape.area!, आपको पायथन 9.3 पार्सर का उपयोग करना चाहिए।

  • आपके द्वारा पहले की गई अभिव्यक्ति split()के परिणाम पर एक कमांड किया गया था !SHAPE.AREA!। यह एक पायथन listऑब्जेक्ट देता है , जिसे ऑब्जेक्ट में नहीं डाला जा सकता है float

  • अपनी अभिव्यक्ति में, आप गणना फ़ील्ड सहायता पृष्ठ पर इकाइयों के साथ @SQUAREKILOMETERSप्रतिस्थापित करके, झंडे का उपयोग करके लौटे क्षेत्र की इकाई को निर्दिष्ट कर सकते हैं ।SQUAREKILOMETERS

इस विधि के लिए मैं पायथन कोड का उपयोग करूंगा:

tempPgs = "LayerName"
arcpy.AddField_management(tempPgs, "Shape_area", "DOUBLE")
exp = "!SHAPE.AREA@SQUAREKILOMETERS!"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp, "PYTHON_9.3")

2. आर्क 10.0 - "क्लासिक" कर्सर

  • क्लासिक कर्सर (यानी arcpy.UpdateCursor) का उपयोग करते समय कर्सर ऑब्जेक्ट एक चलने योग्य rowऑब्जेक्ट होता है। आपको पंक्ति से ज्यामिति प्राप्त करने के लिए getValueऔर setValueविधियों का उपयोग करने की आवश्यकता है ( ज्यामिति ऑब्जेक्ट के rowरूप में और फ्लोट के रूप में क्षेत्र मान सेट करें ।

  • जब तक आप updateRowकर्सर पर विधि नहीं कहते तब तक आपकी आउटपुट पंक्ति एक अस्थायी स्क्रैच स्थान में संग्रहीत होती है। यह नए डेटा को वास्तविक डेटासेट में सहेजता है।

इस विधि के लिए मैं पायथन कोड का उपयोग करूंगा:

tempPgs = "LayerName"
arcpy.AddField_management(tempPgs, "Shape_area", "DOUBLE")
geometryField = arcpy.Describe(tempPgs).shapeFieldName #Get name of geometry field
cursor = arcpy.UpdateCursor(tempPgs)
for row in cursor:
    AreaValue = row.getValue(geometryField).area #Read area value as double
    row.setValue("Shape_area",AreaValue) #Write area value to field
    cursor.updateRow(row)
del row, cursor #Clean up cursor objects

3. चाप 10.1 - चापलूसी। श्राप देने वाले

  • डेटा एक्सेस मॉड्यूल (यानी arcpy.da.UpdateCursor) में नए कर्सर का उपयोग करते समय आपको कर्सर के कर्सर में दूसरे पैरामीटर के रूप में फ़ील्ड नामों की सूची में पास करने की आवश्यकता होती है। इसके लिए कुछ और काम करने की आवश्यकता होती है, लेकिन परिणामी rowवस्तुएं पायथन सूची हैं, जो कर्सर पंक्तियों के माध्यम से पुनरावृति करने पर डेटा को पढ़ना और लिखना आसान बनाता है। आंशिक रूप arcpy.da.UpdateCursorसे बेहतर प्रदर्शन भी है arcpy.UpdateCursor, क्योंकि यह महत्वहीन क्षेत्रों, विशेष रूप से ज्यामिति को छोड़ देता है।

  • जब ज्यामिति पढ़ते समय, आप ज्यामिति टोकन के एक नंबर से एक है, जैसे चुन सकते हैं SHAPE@TRUECENTROID, SHAPE@AREAया SHAPE@। "सरल" टोकन का उपयोग करने से तुलना में प्रदर्शन में काफी सुधार SHAPE@होता है, जिसमें सभी ज्यामिति की जानकारी होती है। टोकन की पूरी सूची arcpy.da.UpdateCursorसहायता पृष्ठ पर है।

  • पहले की तरह, जब तक आप updateRowकर्सर पर विधि नहीं कहते हैं, तब तक आपकी आउटपुट पंक्ति एक अस्थायी स्क्रैच स्थान में संग्रहीत होती है। यह नए डेटा को वास्तविक डेटासेट में सहेजता है।

इस विधि के लिए मैं पायथन कोड का उपयोग करूंगा:

tempPgs = "LayerName"
arcpy.AddField_management(tempPgs, "Shape_area", "DOUBLE")
CursorFieldNames = ["SHAPE@AREA","Shape_area"]
cursor = arcpy.da.UpdateCursor(tempPgs,CursorFieldNames)
for row in cursor:
    AreaValue = row[0].area #Read area value as double
    row[1] = AreaValue #Write area value to field
    cursor.updateRow(row)
del row, cursor #Clean up cursor objects

5
अद्भुत जवाब। बस यह कहना चाहता था कि 10.2 के रूप में, आप बस row[1] = row[0]करेंगे क्योंकि अब कोई areaविशेषता नहीं है। आप एक withबयान में संदर्भ प्रबंधक के रूप में भी कर्सर का उपयोग कर सकते हैं और कुछ भी हटाने के बारे में चिंता करने की ज़रूरत नहीं है।
पॉल एच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.