Sto cercando di calcolare l'area di un poligono nel mio script Python. Creo un nuovo poligono dall'unione di due insieme e vorrei aggiungere l'area del poligono risultante a un campo nel file di output. Il poligono viene archiviato in un file di forma regolare e viene proiettato. Area preferibilmente in unità cartografiche.
Avrei pensato che fosse un compito abbastanza comune e semplice, ma nonostante un sacco di Googleing non sono stato finora in grado di trovare soluzioni funzionanti.
Avevo intenzione di utilizzare arcpy.updateCursor
per inserire il valore una volta calcolato (in questa fase c'è solo una funzione nell'FC), quindi è più semplice se può essere restituito come variabile. Qualsiasi soluzione alternativa che compie la stessa attività (portando il valore dell'area nel campo corretto) funzionerà anche.
Ho anche provato il calcolatore di campo da Python. Modificato dalle pagine di aiuto, ho pensato che avrebbe funzionato quanto segue, ma finora nessuna fortuna.
arcpy.AddField_management(tempPgs, "Shape_area", 'DOUBLE')
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)
Esecuzione di ArcGIS Basic 10.1 SP1 con Python 2.7 su Windows 7.
Le parti rilevanti del mio codice attuale si presentano così:
#/.../
arcpy.Copy_management(inpgs, outpgs)
arcpy.AddField_management(outpgs, 'Shape_area', 'LONG')
fields = AM.FieldLst(outpgs)
#/.../
# Identify and search for shapes smaller than minimum area
where1 = '"' + 'Shape_Area' + '" < ' + str(msz)
polyrows = arcpy.SearchCursor(inpgs, where1)
for prow in polyrows:
grd1 = prow.GridID # GridID on the current polygon
grd2 = nDD.get(grd1) # GridID on the polygon downstream
# Update features
if grd2
geometry1 = prow.Shape
geometry2 = geometryDictionary[grd2]
# Update temporary features
arcpy.Merge_management([geometry1, geometry2], tempMerged)
arcpy.Dissolve_management(tempMerged, tempPgs)
fds = AM.FieldLst(tempPgs)
for field in fields[2:]:
arcpy.AddField_management(tempPgs, field, 'DOUBLE')
for fd in fds[2:]:
arcpy.DeleteField_management(tempPgs, fd)
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)
# Append them to output FC
try:
arcpy.Append_management(tempPgs, outpgs, "TEST")
except arcgisscripting.ExecuteError:
arcpy.Append_management(tempPgs, outpgs, "NO_TEST")
elif ...
else ...
SHAPE@AREA
come parte del cursore per leggere l'area; ma la struttura del codice dipende dal fatto che l'area sia nelle stesse unità di ciò che si desidera scrivere.