¿ArcPy agrega un anillo interior erróneo al escribir geometría adyacente de varias partes?

12

Me he encontrado con un problema extraño cuando uso Arcpy para escribir geometría multiparte en un archivo de forma. Estoy usando un InsertCursor para crear una entidad multiparte a partir de una lista de partes, cada una con una lista de pares de vértices. Entiendo que cuando se crea esta característica, varias partes adyacentes se "disuelven" automáticamente en una sola parte. Pero por alguna razón, esto está creando un anillo interior, a pesar de que no incluí un nulo arcpy.point () en la matriz, ya que generalmente se requiere para agregar anillos interiores. Aquí hay una visualización:

Visualización de error de arco

¿Alguien tiene alguna idea de por qué sucede esto y / o cómo superar el problema?

Como referencia, aquí está mi código:

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
fuente
1
Sí, el método arcpy.AsShape tiene problemas. Vea aquí otro ejemplo de este comportamiento defectuoso: gis.stackexchange.com/questions/10201/…
valveLondon

Respuestas:

2

Ha definido puntos en el interior del polígono para incluirlos en la forma. Esto crearía la salida que ha estado obteniendo en lugar de la salida que desea. El programa trata cada punto puesto en la definición del polígono como la definición de un vértice del polígono, por lo que si incluye todos los vértices en la definición del polígono, devolverá un polígono con un borde entre cada vértice. Para eliminar el anillo, deberá crear por separado un polígono para cada cuadro en la cuadrícula y luego disolver los polígonos juntos.

Alternativamente, su código anterior podría editarse de la siguiente manera para incluir solo los puntos exteriores en el cuadrado:

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
fuente