Estoy tratando de calcular el área de un polígono dentro de mi script Python. Creo un nuevo polígono fusionando dos juntos, y me gustaría agregar el área del polígono resultante a un campo en el archivo de salida. El polígono se almacena en un archivo de forma regular y se proyecta. Área preferiblemente en unidades de mapa.
Hubiera pensado que se trataba de una tarea bastante común y simple, pero a pesar de mucho Googleing, hasta ahora no he podido encontrar soluciones que funcionen.
Estaba planeando usar arcpy.updateCursor
para insertar el valor una vez que se calcula (solo hay una característica en el FC en esta etapa), por lo que es más fácil si se puede devolver como una variable. Cualquier solución alternativa que realice la misma tarea (obtener el valor del área en el campo correcto) también funcionará.
También probé la calculadora de campo de Python. Modificado de las páginas de ayuda, pensé que lo siguiente funcionaría, pero hasta ahora no tuve suerte.
arcpy.AddField_management(tempPgs, "Shape_area", 'DOUBLE')
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)
Ejecutando ArcGIS Basic 10.1 SP1 con Python 2.7 en Windows 7.
Las partes relevantes de mi código actual se ven así:
#/.../
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 ...
fuente
SHAPE@AREA
como parte de su cursor para leer el área; pero la estructura del código depende de si su área está en las mismas unidades que lo que desea escribir.Respuestas:
Hay tres formas diferentes de encontrar y almacenar el área de polígonos en una clase de entidad con arcpy: 1) calculadora de campo, 2) cursores de arco "clásicos" y 3)
arcpy.da
cursores. Algo de esto se tomó prestado de mi respuesta anterior sobre el uso de SearchCursor .1. Calculadora de campo
Cuando se usa la calculadora de campo, hay tres tipos de expresiones diferentes que usan analizadores de expresiones diferentes. Esto se especifica en el tercer parámetro de la herramienta de geoprocesamiento Calcular campo . Al acceder a las propiedades del objeto Geometry usando like in
!shape.area!
, debe usar el analizador Python 9.3.La expresión que tenía antes realizaba un
split()
comando sobre el resultado de!SHAPE.AREA!
. Esto devuelve unlist
objeto Python , que no se puede convertir en unfloat
objeto.En su expresión, puede especificar la unidad del área devuelta utilizando la
@SQUAREKILOMETERS
bandera, reemplazandoSQUAREKILOMETERS
con las unidades en la página de ayuda Calcular campo .Aquí está el código de Python que usaría para este método:
2. Arc 10.0 - Cursores "clásicos"
Cuando se usan cursores clásicos (es decir
arcpy.UpdateCursor
), el objeto cursor es un objeto iterativo que contienerow
objetos. Debe usar los métodosgetValue
ysetValue
para obtener la geometría de la fila (como un objeto de geometría y establecer el valor del árearow
como flotante).Su fila de salida se almacena en un espacio temporal temporal hasta que llame al
updateRow
método en el cursor. Esto guarda los nuevos datos en el conjunto de datos real.Aquí está el código de Python que usaría para este método:
3. Arc 10.1 - cursores arcpy.da
Al usar los nuevos cursores en el módulo de acceso a datos (es decir
arcpy.da.UpdateCursor
), debe pasar una lista de nombres de campo como el segundo parámetro en el constructor del cursor. Esto requiere un poco más de trabajo por adelantado, pero losrow
objetos resultantes son listas de Python, lo que hace que sea más fácil leer y escribir datos al recorrer las filas del cursor.arcpy.da.UpdateCursor
también tiene un mejor rendimiento quearcpy.UpdateCursor
, en parte porque omite campos sin importancia, especialmente la geometría.Al leer la geometría, puede elegir una de una serie de fichas de geometría, por ejemplo
SHAPE@TRUECENTROID
,SHAPE@AREA
oSHAPE@
. El uso de un token "más simple" mejora en gran medida el rendimiento en comparación con elSHAPE@
que contiene toda la información de geometría. La lista completa de tokens se encuentra en laarcpy.da.UpdateCursor
página de ayuda.Como antes, su fila de salida se almacena en un espacio temporal temporal hasta que llame al
updateRow
método en el cursor. Esto guarda los nuevos datos en el conjunto de datos real.Aquí está el código de Python que usaría para este método:
fuente
row[1] = row[0]
ya que ya no hay unarea
atributo. También puede usar el cursor como administrador de contexto en unawith
declaración y no tener que preocuparse por eliminar nada.