12 votos

ArcPy añade un anillo interior erróneo al escribir geometría adyacente multiparte?

Me he encontrado con un problema impar cuando se utiliza Arcpy para escribir geometría multiparte a un shapefile. Estoy usando un InsertCursor para crear una característica multiparte de una lista de partes cada una con una lista de pares de vértices. Entiendo que cuando se crea esta característica, las partes múltiples 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 Null arcpy.point() en el array como normalmente se requiere para añadir anillos interiores. Aquí hay una visualización:

Visualization of arcpy error

¿Alguien tiene idea de por qué ocurre esto y/o cómo solucionar 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)

2voto

timothymh Puntos 5183

Ha definido puntos en el interior del polígono para incluirlos en la forma. Esto crearía la salida que has estado obteniendo en lugar de la salida que deseas. El programa trata cada punto puesto en la definición del polígono como si definiera 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 una arista entre cada vértice. Para eliminar el anillo tendría que crear por separado un polígono para cada caja de la cuadrícula y luego disolver los polígonos juntos.

Alternativamente, su código anterior podría ser editado de la siguiente manera para incluir sólo 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)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X