Ich versuche, die Fläche eines Polygons in meinem Python-Skript zu berechnen. Ich erstelle ein neues Polygon aus dem Zusammenführen von zwei und möchte den Bereich des resultierenden Polygons einem Feld in der Ausgabedatei hinzufügen. Das Polygon wird in einem regulären Shapefile gespeichert und projiziert. Fläche vorzugsweise in Karteneinheiten.
Ich hätte gedacht, dass dies eine recht häufige und einfache Aufgabe ist, aber trotz viel Googleing konnte ich bisher keine funktionierende Lösung finden.
Ich hatte vor arcpy.updateCursor
, den Wert nach seiner Berechnung mit einzufügen (derzeit gibt es nur eine Funktion in der FC). Am einfachsten ist es also, wenn er als Variable zurückgegeben werden kann. Jede alternative Lösung, die dieselbe Aufgabe ausführt (den Bereichswert in das richtige Feld bringen), funktioniert auch.
Ich habe auch den Field-Rechner von Python ausprobiert. Geändert von den Hilfeseiten dachte ich, das folgende würde funktionieren, aber bisher kein Glück.
arcpy.AddField_management(tempPgs, "Shape_area", 'DOUBLE')
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)
Ausführen von ArcGIS Basic 10.1 SP1 mit Python 2.7 unter Windows 7.
Relevante Teile meines aktuellen Codes sehen folgendermaßen aus:
#/.../
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
als Teil Ihres Cursors zum Lesen des Bereichs verwenden. Die Struktur des Codes hängt jedoch davon ab, ob sich Ihr Gebiet in denselben Einheiten befindet wie das, was Sie ausschreiben möchten.