ArcPy menambahkan cincin interior yang salah saat menulis geometri yang berdekatan, multi bagian?

12

Saya telah mengalami masalah aneh ketika menggunakan Arcpy untuk menulis geometri multipart ke sebuah shapefile. Saya menggunakan InsertCursor untuk membuat fitur multi bagian dari daftar bagian masing-masing dengan daftar pasangan titik. Saya mengerti bahwa ketika fitur ini dibuat, beberapa bagian yang berdekatan secara otomatis "dibubarkan" menjadi satu bagian. Tetapi untuk beberapa alasan, ini menciptakan cincin interior, meskipun saya tidak memasukkan Null arcpy.point () dalam array seperti yang biasanya diperlukan untuk menambahkan cincin interior. Berikut visualisasi:

Visualisasi kesalahan arcpy

Adakah yang tahu mengapa ini terjadi dan / atau bagaimana mengatasi masalah ini?

Untuk referensi, ini kode saya:

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)
dmahr
sumber
1
Ya - metode arcpy.AsShape memiliki masalah - lihat di sini untuk contoh lain dari perilaku cacat ini: gis.stackexchange.com/questions/10201/…
valveLondon

Jawaban:

2

Anda telah menentukan titik di bagian dalam poligon untuk dimasukkan dalam bentuk. Ini akan membuat output yang Anda dapatkan daripada output yang Anda inginkan. Program memperlakukan setiap titik yang dimasukkan ke dalam definisi poligon sebagai mendefinisikan titik dari poligon, jadi jika Anda memasukkan semua simpul dalam definisi poligon itu akan mengembalikan poligon dengan tepi antara setiap titik. Untuk menghilangkan cincin, Anda perlu membuat poligon secara terpisah untuk setiap kotak di kisi dan kemudian melarutkan poligon bersama-sama.

Atau, kode Anda di atas dapat diedit sebagai berikut untuk hanya memasukkan titik-titik eksterior di kotak:

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)
Jezibelle
sumber