ArcPy ajoute un anneau intérieur erroné lors de l'écriture d'une géométrie adjacente en plusieurs parties?

12

J'ai rencontré un problème étrange lors de l'utilisation d'Arcpy pour écrire une géométrie en plusieurs parties dans un fichier de formes. J'utilise un InsertCursor pour créer une fonctionnalité en plusieurs parties à partir d'une liste de pièces, chacune avec une liste de paires de sommets. Je comprends que lorsque cette fonction est créée, plusieurs pièces adjacentes sont automatiquement «dissoutes» en une seule pièce. Mais pour une raison quelconque, cela crée un anneau intérieur, même si je n'ai pas inclus un arcpy.point () nul dans le tableau, comme cela est généralement requis pour ajouter des anneaux intérieurs. Voici une visualisation:

Visualisation de l'erreur arcpy

Quelqu'un at-il une idée de pourquoi cela se produit et / ou comment surmonter le problème?

Pour référence, voici mon 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
la source
1
Ouais - la méthode arcpy.AsShape a des problèmes - voir ici pour un autre exemple de ce comportement défectueux: gis.stackexchange.com/questions/10201/…
valveLondon

Réponses:

2

Vous avez défini des points à l'intérieur du polygone à inclure dans la forme. Cela créerait la sortie que vous obtenez plutôt que la sortie que vous souhaitez. Le programme traite chaque point placé dans la définition de polygone comme définissant un sommet du polygone, donc si vous incluez tous les sommets dans la définition de polygone, il retournera un polygone avec une arête entre chaque sommet. Pour éliminer l'anneau, vous devez créer séparément un polygone pour chaque boîte de la grille, puis dissoudre les polygones ensemble.

Alternativement, votre code ci-dessus pourrait être modifié comme suit pour inclure uniquement les points extérieurs dans le carré:

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
la source