ArcPy dodaje błędny pierścień wewnętrzny podczas pisania sąsiadującej, wieloczęściowej geometrii?

12

Wystąpił dziwny problem podczas używania Arcpy do zapisywania geometrii wieloczęściowej w pliku kształtu. Korzystam z InsertCursor, aby utworzyć funkcję wieloczęściową z listy części, z których każda zawiera listę par wierzchołków. Rozumiem, że po utworzeniu tej funkcji sąsiednie wiele części jest automatycznie „rozpuszczanych” w jedną część. Ale z jakiegoś powodu tworzy to wewnętrzny pierścień, mimo że nie włączyłem arcpy.point () Null do tablicy, co jest zwykle wymagane do dodania wewnętrznych pierścieni. Oto wizualizacja:

Wizualizacja błędu łuku

Czy ktoś ma pojęcie, dlaczego tak się dzieje i / lub jak rozwiązać ten problem?

Dla odniesienia, oto mój kod:

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
źródło
1
Tak - metoda arcpy.AsShape ma problemy - zobacz tutaj inny przykład tego wadliwego zachowania: gis.stackexchange.com/questions/10201/...
valveLondon

Odpowiedzi:

2

Zdefiniowałeś punkty we wnętrzu wielokąta, aby uwzględnić je w kształcie. Spowoduje to utworzenie otrzymanego wyniku, a nie pożądanego wyniku. Program traktuje każdy punkt wstawiony do definicji wielokąta jako definiujący wierzchołek wielokąta, więc jeśli uwzględnisz wszystkie wierzchołki w definicji wielokąta, zwróci wielokąt z krawędzią między każdym wierzchołkiem. Aby wyeliminować pierścień, musisz osobno utworzyć wielokąt dla każdego pola w siatce, a następnie rozpuścić razem wielokąty.

Alternatywnie powyższy kod można edytować w następujący sposób, aby uwzględnić w kwadracie tylko punkty zewnętrzne:

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
źródło