O ArcPy adiciona um anel interno incorreto ao escrever geometria multipartística adjacente?


12

Eu me deparei com um problema estranho ao usar o Arcpy para escrever geometria de várias partes em um shapefile. Estou usando um InsertCursor para criar um recurso de várias partes de uma lista de partes, cada uma com uma lista de pares de vértices. Entendo que, quando esse recurso é criado, várias partes adjacentes são automaticamente "dissolvidas" em uma única parte. Mas, por algum motivo, isso está criando um anel interno, mesmo que eu não tenha incluído um arcpy.point () nulo na matriz, como normalmente é necessário para adicionar anéis internos. Aqui está uma visualização:

Visualização de erro arcpy

Alguém tem alguma idéia de por que isso está acontecendo e / ou como superar o problema?

Para referência, aqui está o meu 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)

1
Sim - o método arcpy.AsShape tem problemas - veja aqui outro exemplo desse comportamento defeituoso: gis.stackexchange.com/questions/10201/…
valveLondon

Respostas:


2

Você definiu pontos no interior do polígono para incluir na forma. Isso criaria a saída que você está obtendo, e não a saída que deseja. O programa trata cada ponto colocado na definição de polígono como definindo um vértice do polígono; portanto, se você incluir todos os vértices na definição de polígono, ele retornará um polígono com uma aresta entre cada vértice. Para eliminar o anel, você precisaria criar um polígono para cada caixa na grade e dissolver os polígonos juntos.

Como alternativa, seu código acima pode ser editado da seguinte maneira para incluir apenas os pontos externos no quadrado:

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.