ArcPy fügt einen fehlerhaften inneren Ring hinzu, wenn benachbarte, mehrteilige Geometrie geschrieben wird?

12

Bei der Verwendung von Arcpy zum Schreiben von mehrteiliger Geometrie in ein Shapefile ist ein merkwürdiges Problem aufgetreten. Ich verwende einen InsertCursor, um ein mehrteiliges Feature aus einer Liste von Teilen mit jeweils einer Liste von Scheitelpunktpaaren zu erstellen. Ich verstehe, dass beim Erstellen dieses Features benachbarte mehrere Teile automatisch in einem einzigen Teil "aufgelöst" werden. Aus irgendeinem Grund wird hierdurch ein innerer Ring erstellt, obwohl ich kein Null arcpy.point () in das Array aufgenommen habe, wie dies normalerweise zum Hinzufügen innerer Ringe erforderlich ist. Hier ist eine Visualisierung:

Visualisierung des Arcpy-Fehlers

Hat jemand eine Idee, warum dies geschieht und / oder wie das Problem behoben werden kann?

Als Referenz ist hier mein Code:

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
quelle
1
Ja, die Methode arcpy.AsShape weist Probleme auf. Ein weiteres Beispiel für dieses fehlerhafte Verhalten finden Sie hier: gis.stackexchange.com/questions/10201/…
valveLondon

Antworten:

2

Sie haben Punkte im Inneren des Polygons definiert, die in die Form einbezogen werden sollen. Dies würde die Ausgabe erzeugen, die Sie erhalten, und nicht die Ausgabe, die Sie möchten. Das Programm behandelt jeden in die Polygondefinition eingegebenen Punkt als einen Scheitelpunkt des Polygons definierend. Wenn Sie also alle Scheitelpunkte in die Polygondefinition einschließen, wird ein Polygon mit einer Kante zwischen jedem Scheitelpunkt zurückgegeben. Um den Ring zu entfernen, müssten Sie für jedes Kästchen im Raster ein eigenes Polygon erstellen und die Polygone dann gemeinsam auflösen.

Alternativ kann der obige Code wie folgt bearbeitet werden, um nur die äußeren Punkte im Quadrat einzuschließen:

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
quelle