ArcPy เพิ่มวงแหวนภายในที่ผิดพลาดเมื่อเขียนเรขาคณิตหลายส่วนที่อยู่ติดกัน?


12

ฉันพบปัญหาแปลก ๆ เมื่อใช้ Arcpy เพื่อเขียนเรขาคณิตหลายส่วนไปยังรูปร่างไฟล์ ฉันใช้ InsertCursor เพื่อสร้างคุณสมบัติหลายส่วนจากรายการของชิ้นส่วนแต่ละรายการด้วยรายการของคู่จุดสุดยอด ฉันเข้าใจว่าเมื่อคุณลักษณะนี้สร้างขึ้นชิ้นส่วนที่อยู่ติดกันจะถูก "ละลาย" โดยอัตโนมัติเป็นส่วนเดียว แต่ด้วยเหตุผลบางอย่างนี่เป็นการสร้างวงแหวนภายในแม้ว่าฉันไม่ได้รวม Null arcpy.point () ในอาเรย์ตามปกติจะต้องเพิ่มวงแหวนภายใน นี่คือการสร้างภาพ:

การแสดงภาพของข้อผิดพลาด arcpy

ไม่มีใครมีความคิดใด ๆ ว่าทำไมสิ่งนี้จึงเกิดขึ้นและ / หรือวิธีการแก้ไขปัญหานี้หรือไม่?

สำหรับการอ้างอิงนี่คือรหัสของฉัน:

import arcpy

arcpy.CreateFeatureclass_management(r"C:\temp", "test.shp", "POLYGON")
OutputCursor = arcpy.InsertCursor(r"C:\temp\test.shp")

# List of parts, each with list of vertex pairs
ListOfParts = []
ListOfParts.append([[0,1],[1,1],[1,0],[0,0],[0,1]])
ListOfParts.append([[0,2],[1,2],[1,1],[0,1],[0,2]])
ListOfParts.append([[0,3],[1,3],[1,2],[0,2],[0,3]])
ListOfParts.append([[1,1],[2,1],[2,0],[1,0],[1,1]])
ListOfParts.append([[1,2],[2,2],[2,1],[1,1],[1,2]])
ListOfParts.append([[1,3],[2,3],[2,2],[1,2],[1,3]])
ListOfParts.append([[2,1],[3,1],[3,0],[2,0],[2,1]])
ListOfParts.append([[2,2],[3,2],[3,1],[2,1],[2,2]])
ListOfParts.append([[2,3],[3,3],[3,2],[2,2],[2,3]])

# Array of parts to be passed to newRow()
ArrayOfParts = arcpy.Array()

# Add parts to array
for Part in ListOfParts:
    ArrayOfVertices = arcpy.Array()
    for Vertex in Part:
        ArrayOfVertices.add(arcpy.Point(Vertex[0],Vertex[1]))
    ArrayOfParts.add(ArrayOfVertices)
    ArrayOfVertices.removeAll()

# Output new feature
OutputFeature = OutputCursor.newRow()
OutputFeature.shape = ArrayOfParts
OutputCursor.insertRow(OutputFeature)

1
ใช่ - วิธี arcpy.AsShape มีปัญหา - ดูที่นี่สำหรับตัวอย่างของพฤติกรรมที่ไม่สมบูรณ์นี้: gis.stackexchange.com/questions/10201/…
valveLondon

คำตอบ:


2

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

หรือรหัสของคุณด้านบนสามารถแก้ไขได้ดังต่อไปนี้เพื่อรวมเฉพาะจุดภายนอกในตาราง:

import arcpy

arcpy.CreateFeatureclass_management(r"C:\temp", "test.shp", "POLYGON")
OutputCursor = arcpy.InsertCursor(r"C:\temp\test.shp")

# List of parts, each with list of vertex pairs
ListOfParts = []
ListOfParts.append([[0,3],[3,3],[3,0],[0,0],[0,3]])

# Array of parts to be passed to newRow()
ArrayOfParts = arcpy.Array()

# Add parts to array
for Part in ListOfParts:
    ArrayOfVertices = arcpy.Array()
    for Vertex in Part:
        ArrayOfVertices.add(arcpy.Point(Vertex[0],Vertex[1]))
    ArrayOfParts.add(ArrayOfVertices)
    ArrayOfVertices.removeAll()

# Output new feature
OutputFeature = OutputCursor.newRow()
OutputFeature.shape = ArrayOfParts
OutputCursor.insertRow(OutputFeature)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.