คำนวณพื้นที่ภายในสคริปต์ Python ใน ArcMap


14

ฉันพยายามคำนวณพื้นที่ของรูปหลายเหลี่ยมภายในสคริปต์ Python ของฉัน ฉันสร้างรูปหลายเหลี่ยมใหม่จากการรวมสองรูปเข้าด้วยกันและฉันต้องการเพิ่มพื้นที่ของรูปหลายเหลี่ยมที่เป็นผลลัพธ์ลงในเขตข้อมูลในไฟล์ผลลัพธ์ รูปหลายเหลี่ยมจะถูกเก็บไว้ในรูปร่างปกติและฉาย พื้นที่โดยเฉพาะอย่างยิ่งในหน่วยแผนที่

ฉันคิดว่านี่เป็นงานที่ค่อนข้างธรรมดาและเรียบง่าย แต่ถึงแม้ว่าจะมี Googleing อยู่มากมายฉันก็ยังหาวิธีแก้ปัญหาที่ใช้งานไม่ได้

ฉันวางแผนที่arcpy.updateCursorจะใช้เพื่อแทรกค่าเมื่อคำนวณแล้ว (มีเพียงฟีเจอร์เดียวใน FC ในขั้นตอนนี้) ดังนั้นที่ง่ายที่สุดคือถ้ามันสามารถส่งคืนเป็นตัวแปรได้ โซลูชันทางเลือกใด ๆ ที่ทำภารกิจเดียวกันให้สำเร็จ (การรับค่าพื้นที่ลงในฟิลด์ที่ถูกต้อง) ก็จะใช้ได้เช่นกัน

ฉันได้ลองใช้เครื่องคิดเลขภาคสนามจาก Python ด้วย แก้ไขจากหน้าช่วยเหลือฉันคิดว่าสิ่งต่อไปนี้ใช้ได้ แต่ยังไม่มีโชค

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

ใช้งาน ArcGIS Basic 10.1 SP1 ด้วย Python 2.7 บน Windows 7

ส่วนที่เกี่ยวข้องของรหัสปัจจุบันของฉันมีลักษณะดังนี้:

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

ประเภทผลลัพธ์ของคุณคืออะไร Shapefile, ฐานข้อมูลไฟล์, มีอย่างอื่นอีกไหม? ไฟล์เอาต์พุตของคุณถูกฉายหรือไม่ถูกคาดการณ์?
blord-castillo

นอกจากนี้คุณสามารถโพสต์ตัวอย่างโค้ดอีกเล็กน้อยโดยเฉพาะเคอร์เซอร์ที่คุณใช้ทำการอัปเดตหรือไม่ เป็นไปได้ว่าคุณสามารถบรรลุสิ่งที่คุณต้องการโดยใช้SHAPE@AREAส่วนของเคอร์เซอร์เพื่ออ่านพื้นที่ แต่โครงสร้างของรหัสขึ้นอยู่กับว่าพื้นที่ของคุณอยู่ในหน่วยเดียวกันกับสิ่งที่คุณต้องการเขียนหรือไม่
blord-castillo

คำตอบ:


29

มีสามวิธีในการค้นหาและจัดเก็บพื้นที่รูปหลายเหลี่ยมในคลาสคุณลักษณะด้วย arcpy: 1) เครื่องคำนวณฟิลด์, 2) เคอร์เซอร์ arcpy "คลาสสิค" และ 3) arcpy.daเคอร์เซอร์ บางส่วนของนี้เป็นของฉันที่ยืมมาจากคำตอบก่อนหน้าเกี่ยวกับการใช้ SearchCursor


1. เครื่องคิดเลขภาคสนาม

  • เมื่อใช้เครื่องคำนวณฟิลด์มีนิพจน์สามประเภทที่ใช้ตัวแยกวิเคราะห์นิพจน์ต่างกัน นี้จะถูกระบุในพารามิเตอร์ที่สามของเครื่องมือคำนวณสนาม Geoprocessing เมื่อเข้าถึงคุณสมบัติของวัตถุ Geometry ที่ใช้ like in !shape.area!คุณควรใช้ Python 9.3 parser

  • การแสดงออกที่คุณมีก่อนดำเนินการคำสั่งผลการsplit() !SHAPE.AREA!ส่งคืนlistออบเจ็กต์Python ซึ่งไม่สามารถส่งไปยังfloatวัตถุได้

  • ในการแสดงออกของคุณคุณสามารถระบุหน่วยพื้นที่กลับโดยใช้@SQUAREKILOMETERSธงเปลี่ยนSQUAREKILOMETERSกับหน่วยงานในที่หน้าความช่วยเหลือคำนวณสนาม

นี่คือรหัส Python ที่ฉันจะใช้สำหรับวิธีนี้:

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

2. Arc 10.0 - เคอร์เซอร์ "คลาสสิค"

  • เมื่อใช้เคอร์เซอร์คลาสสิก (เช่นarcpy.UpdateCursor) วัตถุเคอร์เซอร์เป็นrowวัตถุที่บรรจุซ้ำได้ คุณต้องใช้getValueและsetValueวิธีการเพื่อให้ได้รูปทรงเรขาคณิตจากแถว (เป็นวัตถุรูปทรงเรขาคณิตและตั้งค่าพื้นที่ให้rowเป็นแบบลอย

  • แถวผลลัพธ์ของคุณถูกเก็บไว้ในพื้นที่ลบชั่วคราวจนกว่าคุณจะเรียกใช้updateRowเมธอดบนเคอร์เซอร์ สิ่งนี้จะบันทึกข้อมูลใหม่ลงในชุดข้อมูลจริง

นี่คือรหัส Python ที่ฉันจะใช้สำหรับวิธีนี้:

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. Arc 10.1 - เคอร์เซอร์ arcpy.da

  • เมื่อใช้เคอร์เซอร์ใหม่ใน data access module (เช่นarcpy.da.UpdateCursor) คุณจะต้องผ่านรายการชื่อฟิลด์เป็นพารามิเตอร์ที่สองในตัวสร้างเคอร์เซอร์ สิ่งนี้ต้องการการทำงานเพิ่มเติมล่วงหน้า แต่rowวัตถุที่ได้คือรายการ Python ซึ่งทำให้ง่ายต่อการอ่านและเขียนข้อมูลเมื่อวนซ้ำผ่านแถวเคอร์เซอร์ arcpy.da.UpdateCursorยังมีประสิทธิภาพที่ดีขึ้นกว่าarcpy.UpdateCursorบางส่วนเพราะข้ามเขตข้อมูลที่ไม่สำคัญโดยเฉพาะรูปทรงเรขาคณิต

  • เมื่ออ่านเรขาคณิตคุณสามารถเลือกหนึ่งของจำนวนของสัญญาณรูปทรงเรขาคณิตเช่นSHAPE@TRUECENTROID, หรือSHAPE@AREA SHAPE@การใช้โทเค็น "เรียบง่าย" ช่วยเพิ่มประสิทธิภาพได้อย่างมากเมื่อเทียบกับSHAPE@ซึ่งมีข้อมูลรูปทรงเรขาคณิตทั้งหมด รายการโทเค็นทั้งหมดอยู่ที่arcpy.da.UpdateCursorหน้าช่วยเหลือ

  • ก่อนหน้านี้แถวผลลัพธ์ของคุณจะถูกเก็บไว้ในพื้นที่ขูดชั่วคราวจนกว่าคุณจะเรียกใช้updateRowเมธอดบนเคอร์เซอร์ สิ่งนี้จะบันทึกข้อมูลใหม่ลงในชุดข้อมูลจริง

นี่คือรหัส Python ที่ฉันจะใช้สำหรับวิธีนี้:

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คำสั่งและไม่ต้องกังวลกับการลบอะไร
พอล H
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.