ArcPy aggiunge un anello interno errato durante la scrittura di geometria adiacente, multipart?


12

Ho riscontrato un problema strano quando si utilizza Arcpy per scrivere la geometria multipart in un file di forma. Sto usando un InsertCursor per creare una funzione multipart da un elenco di parti ciascuna con un elenco di coppie di vertici. Comprendo che quando viene creata questa funzione, più parti adiacenti vengono automaticamente "dissolte" in una singola parte. Ma per qualche motivo, questo sta creando un anello interno, anche se non ho incluso un Null arcpy.point () nella matrice come di solito è richiesto per aggiungere anelli interni. Ecco una visualizzazione:

Visualizzazione dell'errore arcpico

Qualcuno ha idea del perché questo accada e / o come superare il problema?

Per riferimento, ecco il mio codice:

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
Sì, il metodo arcpy.AsShape ha dei problemi: vedi qui per un altro esempio di questo comportamento imperfetto: gis.stackexchange.com/questions/10201/…
valveLondon,

Risposte:


2

Hai definito punti all'interno del poligono da includere nella forma. Ciò creerebbe l'output che hai ottenuto anziché l'output desiderato. Il programma considera ogni punto inserito nella definizione del poligono come definizione di un vertice del poligono, quindi se si includono tutti i vertici nella definizione del poligono, verrà restituito un poligono con un bordo tra ogni vertice. Per eliminare l'anello dovresti creare separatamente un poligono per ogni casella nella griglia e quindi dissolvere i poligoni insieme.

In alternativa, il codice sopra potrebbe essere modificato come segue per includere solo i punti esterni nel quadrato:

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.