আর্কম্যাপে পাইথন স্ক্রিপ্টের মধ্যে অঞ্চল গণনা করুন


14

আমি আমার পাইথন স্ক্রিপ্টের মধ্যে বহুভুজের ক্ষেত্রটি গণনা করার চেষ্টা করছি। আমি দুটি একসাথে একত্রীকরণ থেকে একটি নতুন বহুভুজ তৈরি করেছি এবং আমি ফলাফল বহুভুজের ক্ষেত্র আউটপুট ফাইলের একটি ক্ষেত্রের সাথে যুক্ত করতে চাই। বহুভুজ একটি নিয়মিত শেফফাইলে সংরক্ষণ করা হয় এবং এটি অনুমান করা হয়। মানচিত্র ইউনিটগুলিতে অগ্রাধিকারযোগ্য অঞ্চল।

আমি এটিকে একটি সাধারণ ও সাধারণ কাজ বলে মনে করতাম তবে অনেকগুলি গুগলিং সত্ত্বেও আমি এ পর্যন্ত একটি কার্যকরী সমাধান খুঁজে পেতে সক্ষম হয়েছি।

আমি 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 এসপি 1 চালানো হচ্ছে।

আমার বর্তমান কোডের প্রাসঙ্গিক অংশগুলি এর মতো দেখাচ্ছে:

#/.../
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 ...

আপনার আউটপুট ধরণ কি? শেফিল, ফাইল জিওডাটাবেস, অন্য কিছু? আপনার আউটপুট ফাইলটি কি প্রজেক্টড বা আনপ্রোজেক্টেড নয়?
blord-castillo

এছাড়াও, আপনি কোড নমুনার কিছুটা বেশি পোস্ট করতে পারেন, বিশেষত যে কার্সারটি আপনি আপডেটটি করতে ব্যবহার করছেন? সম্ভবত SHAPE@AREAঅঞ্চলটি পড়তে আপনি আপনার কার্সারের অংশ হিসাবে যা চান তা অর্জন করতে পারেন ; তবে কোডটির কাঠামোর উপর নির্ভর করে আপনার অঞ্চলটি আপনি কী লিখতে চান সেই একই ইউনিটে রয়েছে কিনা।
blord-castillo

উত্তর:


29

বহুভুজ অঞ্চল সজ্জিত ফিচার ক্লাসে সন্ধান এবং সংরক্ষণের জন্য আলাদা আলাদা তিনটি উপায় রয়েছে: 1) ক্ষেত্র ক্যালকুলেটর, 2) "ক্লাসিক" আরকি কসর এবং 3) arcpy.daকার্সার। এর মধ্যে কিছু অনুসন্ধানকার্সার ব্যবহার সম্পর্কে আমার পূর্ববর্তী উত্তর থেকে ধার করা হয়েছে ।


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 কার্সার

  • ডেটা অ্যাক্সেস মডিউলটিতে নতুন কার্সার ব্যবহার করার সময় (যেমন 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
আশ্চর্য উত্তর। কেবল row[1] = row[0]এটিই বলতে চেয়েছিলেন যে 10.2 হিসাবে, আপনি ঠিক যেমনটি করতে চান তেমন কোনও areaবৈশিষ্ট্য নেই। আপনি একটি withবিবৃতিতে প্রসঙ্গ পরিচালক হিসাবে কার্সারটিও ব্যবহার করতে পারেন এবং কোনও কিছু মুছে ফেলার বিষয়ে চিন্তা করতে হবে না।
পল এইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.