5 votos

Cómo reemplazar arcpy. ¿CalculateField_management con un cursor de actualización?

Me gustaría sustituir esta expresión

arcpy.CalculateField_management(bufferFile, "Shape_Area", "float('!shape.area@squaremeters!')", "PYTHON")

con un arcpy.da.updatecursor. La razón de esto es que quiero evitar la críptica sintaxis del comando anterior para mejorar la legibilidad del código.

¿Es esto posible?

3voto

shsteimer Puntos 8749

En primer lugar usted necesita para obtener las áreas

bufferfile_with_areas = "bufferfilewithareas.shp" #or whichever path you want     
arcpy.CalculateAreas_stats(bufferfile, bufferfile_with_areas)

Esto creará una copia de su archivo antiguo, pero con un F_AREA campo. Este campo contendrá el área de los valores que desea asignar a la Shape_Area campo.

rows = arcpy.UpdateCursor(bufferFile_with_areas)

for row in rows:
    row.Shape_Area = float(row.F_AREA) 
    rows.updateRow(row)
del row
del rows

El updateCursor tendrá que ir a través de los atributos de fila en fila y asignar el valor a la Shape_Area atributo. Usted tendrá un extra de paso de la conversión, aunque, para convertir las unidades a partir de la dada por la arcpy.CalculateAreas_stats a metros cuadrados.

2voto

rowntreerob Puntos 131

Mis disculpas por la demora, pero pensé que había puesto esta para ayudar a explicar (y la portada de mi último post. Hice esta prueba y confirmado el siguiente código funciona, tal vez más rápido que la calculadora de campo. Mis disculpas si he engañado a nadie con el uso de la '@' token -- en lugar de ello he utilizado una referencia espacial de objetos con la actualización del cursor para hacer de la 'sobre la marcha' de la conversión. La tecla de línea (ver más abajo) es la configuración de la actualización del cursor, esencialmente el 3er parámetro permite la conversión de la unidad sin el paso intermedio, CalculateAreas_stats (o incluso sin un paso más con la conversión de la unidad), como he prometido no era necesario (@ R. K. - lo siento por no haberlo explicado mejor antes):

Aquí está la crítica de línea en el código: filas = arcpy.UpdateCursor(fc ", objSR)

EDIT: Una cosa más, sobre el "acceso a datos" módulo de actualización de cursor (arcpy.da.UpdateCursor), que es parte de la pregunta original -- no tengo 10.1 en este punto, pero la documentación muestra que el SR objeto se admite la misma manera "...puede ser especificado con un SpatialReference objeto o una cadena equivalente." Se ve como el acceso a la geometría ha cambiado un poco, el uso de la '@' token: FORMA@ÁREA

http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000014000000

import arcpy, os

# Target shapefile (in native state plane feet units):
fc = r'C:\Documents and Settings\whitley-wayne\Desktop\updatecursorShapeArea\New_ShapefileBuffer.shp'

# The state plane system projection file:
prjFilename = r'NAD 1983 HARN StatePlane Florida East FIPS 0901 (Meters).prj'

# The system subdirectory tree:
coordSysDir = r'Coordinate Systems\Projected Coordinate Systems\State Plane\NAD 1983 HARN (Meters)'

# ...getting the ArcGIS install directory and joining the above path- and file- names...
prjFilepath = os.path.join(os.path.join(arcpy.GetInstallInfo()['InstallDir'], coordSysDir), prjFilename)

# The spatial reference object (establishing a metric unit of measure):
objSR = arcpy.SpatialReference(prjFilepath)

# Opening an update cursor using the spatial reference object (in meters)...

# The shapefile native units are still feet.
# The update cursor will update the Shape_Area field using objSR for the units conversion to meters:
rows = arcpy.UpdateCursor(fc, '', objSR)
for row in rows:
               row.Shape_Area = row.shape.area
               rows.updateRow(row)

del row, rows

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X