การสร้างเครื่องมือสคริปต์ที่จะสร้างสำเนาของคุณสมบัติระดับและชดเชยมันตามระยะทางที่กำหนดโดยใช้ ArcPy?


9

ฉันต้องการคัดลอกคลาสคุณลักษณะรูปหลายเหลี่ยมและชดเชยรูปหลายเหลี่ยมทั้งหมดประมาณ 10 ฟุตในทิศทาง x และ y ฉันถามว่ามีวิธีการทำสัปดาห์นี้หรือไม่และฉันได้รับแจ้งว่าฉันน่าจะต้องสร้างสคริปต์ของตัวเองโดยใช้อาร์คปี ฉันสร้างสคริปต์ของตัวเองโดยใช้ arcpy แต่มันไม่ทำงาน:

import arcpy
from arcpy import env
import os

env.overwriteOutput = True

# Get arguments: 
#   Input polygon feature class
#   Output polygon feature class
#
inputFeatureClass = arcpy.GetParameterAsText(0)
outputFeatureClass = arcpy.GetParameterAsText(1)
xShift = arcpy.GetParameterAsText(2)
yShift = arcpy.GetParameterAsText(3)

shapeName = arcpy.Describe(inputFeatureClass).shapeFieldName

# Create the output feature class with the same fields and spatial reference as the input feature class
arcpy.CreateFeatureclass_management(os.path.dirname(outputFeatureClass), os.path.basename(outputFeatureClass), "POLYGON", inputFeatureClass, "", "", inputFeatureClass)

# Create a search cursor to iterate through each row of the input feature class
inrows = arcpy.SearchCursor(inputFeatureClass)
# Create an insert cursor to insert rows into the output feature class
outrows = arcpy.InsertCursor(outputFeatureClass)

# Create empty Point and Array objects
pntArray = arcpy.Array()
partArray = arcpy.Array()

# Loop through each row/feature
for row in inrows:
    # Create the geometry object
    feature = row.getValue(shapeName)

    partnum = 0

    # Count the total number of points in the current multipart feature
    partcount = feature.partCount


    while partnum < partcount:
        part = feature.getPart(partnum)
        pnt = part.next()
        pntcount = 0

        # Enter while loop for each vertex
        #
        while pnt:

            pnt = part.next()
            shiftedPoint = arcpy.Point()
            try:
                shiftedPoint.ID = pnt.ID
                shiftedPoint.X = pnt.X + float(xShift)
                shiftedPoint.Y = pnt.Y + float(yShift)
            except AttributeError:
                continue
            #shiftedPoint = arcpy.Point(float(pnt.X) + float(xShift), float(pnt.Y) + float(yShift))
            pntArray.add(shiftedPoint)
            pntcount += 1

            # If pnt is null, either the part is finished or there is an 
            #   interior ring
            #
            if not pnt: 
                pnt = part.next()
                if pnt:
                    arcpy.AddMessage("Interior Ring:")
        # Create a polygon using the array of points
        polygon = arcpy.Polygon(pntArray)

        # Empty the array for the next run through the loop
        pntArray.removeAll()

        # Add the polygons (or 'parts') to an array. This is necessary for multipart features, or those with holes cut in them
        partArray.add(polygon)
        arcpy.AddMessage("Added a polygon to the partArray!")
        partnum += 1

    # Create a new row object that will be inserted into the ouput feature class. Set newRow = row so that it has the same attributes
    # Set newRow.shape = partArray so that the only thing different about this new feature is that its geometry is different (shifted)
    newRow = row
    newRow.shape = partArray

    outrows.insertRow(newRow)

    # Empy the array for the next run through the loop
    partArray.removeAll()

del inrows, outrows

ฉันได้รับข้อผิดพลาดนี้ในบรรทัด 70

<type 'exceptions.ValueError'>: Array: Add input not point nor array object

ฉันไม่สามารถหาสาเหตุที่ทำให้เกิดข้อผิดพลาดนี้ได้เนื่องจากฉันกำหนดอินพุตเป็นอาร์เรย์

ไม่มีใครรู้ว่าทำไมฉันถึงได้รับข้อผิดพลาดนี้?

คำตอบ:


14

แทนที่จะสร้างและพยายามเพิ่มรูปหลายเหลี่ยมในอาร์เรย์ของคุณให้เพิ่มอาร์เรย์ของคะแนนลงในอาร์เรย์ของชิ้นส่วน เปลี่ยนสิ่งนี้:

polygon = arcpy.Polygon(pntArray)
pntArray.removeAll()
partArray.add(polygon)

สำหรับสิ่งนี้:

partArray.add(pntArray)
pntArray.removeAll()

นอกจากนี้ยังมีปัญหาเกี่ยวกับรหัสของคุณที่พยายามแทรกแถว คุณต้องใช้เคอร์เซอร์แทรกเพื่อสร้างแถวใหม่และแทรก เริ่มต้นที่บรรทัด 77 ในตัวอย่างโค้ดต้นฉบับของคุณ:

newRow = outrows.newRow()
newRow.shape = partArray
outrows.insertRow(newRow)

แก้ไข : คุณควรย้าย "pnt = part.next ()" ในวงด้านในของคุณไปด้านล่าง try / ยกเว้นบล็อกของคุณเพื่อให้คุณไม่ข้ามจุดใด ๆ และบล็อก if ที่ทดสอบการทำงานของวงแหวนภายใน เช่นเดียวกับที่รหัสในโพสต์ของคุณจะไม่รับวงแหวนภายใน นี่คือสิ่งทั้งหมดหลังจากการเปลี่ยนแปลงทั้งหมดที่ฉันได้อธิบายไว้:

import arcpy
from arcpy import env
import os

env.overwriteOutput = True

# Get arguments: 
#   Input polygon feature class
#   Output polygon feature class
#
inputFeatureClass = arcpy.GetParameterAsText(0)
outputFeatureClass = arcpy.GetParameterAsText(1)
xShift = arcpy.GetParameterAsText(2)
yShift = arcpy.GetParameterAsText(3)
print '\nparams: ', inputFeatureClass, outputFeatureClass, xShift, yShift, '\n'

shapeName = arcpy.Describe(inputFeatureClass).shapeFieldName

# Create the output feature class with the same fields and spatial reference as the input feature class
if arcpy.Exists(outputFeatureClass):
    arcpy.Delete_management(outputFeatureClass)
arcpy.CreateFeatureclass_management(os.path.dirname(outputFeatureClass), os.path.basename(outputFeatureClass), "POLYGON", inputFeatureClass, "", "", inputFeatureClass)

# Create a search cursor to iterate through each row of the input feature class
inrows = arcpy.SearchCursor(inputFeatureClass)
# Create an insert cursor to insert rows into the output feature class
outrows = arcpy.InsertCursor(outputFeatureClass)

# Create empty Point and Array objects
pntArray = arcpy.Array()
partArray = arcpy.Array()

# Loop through each row/feature
for row in inrows:
    # Create the geometry object
    feature = row.getValue(shapeName)
    partnum = 0
    # Count the total number of points in the current multipart feature
    partcount = feature.partCount
    print 'num parts: ', partcount
    while partnum < partcount:
        part = feature.getPart(partnum)
        pnt = part.next()
        print 'outer while'
        pntcount = 0
        # Enter while loop for each vertex
        #
        while pnt:
            shiftedPoint = arcpy.Point()
            try:
                shiftedPoint.ID = pnt.ID
                shiftedPoint.X = pnt.X + float(xShift)
                shiftedPoint.Y = pnt.Y + float(yShift)
            except AttributeError:
                continue
            pntArray.add(shiftedPoint)
            pntcount += 1
            pnt = part.next()
            print 'pntcount: ', pntcount
            # If pnt is null, either the part is finished or there is an 
            #   interior ring
            if pnt is None: 
                pnt = part.next()
                if pnt:
                    arcpy.AddMessage("Interior Ring:")
        partArray.add(pntArray)
        pntArray.removeAll()
        arcpy.AddMessage("Added a polygon to the partArray!")
        partnum += 1
    # Create a new row object that will be inserted into the ouput feature class. Set newRow = row so that it has the same attributes
    # Set newRow.shape = partArray so that the only thing different about this new feature is that its geometry is different (shifted)
    newRow = outrows.newRow()
    newRow.shape = partArray
    outrows.insertRow(newRow)
    # Empy the array for the next run through the loop
    partArray.removeAll()
del inrows, outrows

ฉันเพิ่งค้นพบว่าสคริปต์เลื่อนทุกอย่างอย่างสมบูรณ์ยกเว้นฟีเจอร์ที่มีวงแหวนภายใน 2 ตัวขึ้นไป มันจะปล่อยให้สายเชื่อมต่อและบิดเบือนรูปหลายเหลี่ยม คุณรู้วิธีการบัญชีนี้หรือไม่?
แทนเนอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.