¿Es posible ordenar un arcpy.da.UpdateCursor ()?

8

Tengo un cursor de actualización de ArcPy Data Access que me gustaría ordenar antes de realizar actualizaciones.

El cursor realiza actualizaciones si no ordeno, pero si agrego una ordenación al cursor aparece un error, "no se inició la iteración".

La ordenación funciona correctamente, pero debe estar reventando el cursor por algún motivo.

¿No es posible ordenar un cursor de actualización como un cursor de búsqueda? ¿Cambia el tipo o algo?

    idList = ['100100', '100200', '100300', '200100']
    count = 0
    with arcpy.da.UpdateCursor(newFC, ("SHAPE@X", "SHAPE@Y", "Label")) as addLabelCursor:            
        for row in sorted(addLabelCursor, key=itemgetter(0), reverse = True): 
            print idList[count]
            row[2] = str(idList[count])
            addLabelCursor.updateRow(row)
            count += 1
TurboGus
fuente
Si miro a los locales en una sesión de depuración, el "addLabelCursor" sigue siendo un objeto da.UpdateCursor hasta el final. No es como si se convirtiera en una lista cuando está ordenada.
TurboGus
Está fallando en: addLabelCursor.updateRow (fila)
TurboGus
Debe

Respuestas:

11

La ordenación agota completamente el cursor antes de entrar updateRow. La forma en que funcionan los cursores es que la updateRowllamada no funciona en filas arbitrarias fuera de secuencia, sino en la actual que se repite. Es decir, solo puede operar en una fila a la vez.

Es posible que desee considerar hacer esto en el lado de la geodatabase en su lugar. Puede especificar una ORDER BYcláusula y ordenarla antes de llegar a ella.

Jason Scheirer
fuente
Parece que no puede usar los tokens de geometría en la cláusula sql de un cursor. Tendré que usar una solución alternativa como agregarlo a un campo real de antemano o tal vez simplemente almacene esta entrada de cursores en la memoria y use un cursor de búsqueda para ordenar e insertar el cursor para crear. Gracias por confirmar que no puedo ordenar un cursor de actualización y aún así actualizar.
TurboGus
77
@TurboGus pero se pueden ordenar las filas de un cursor. La ayuda indica que puede especificar el sql_clauseparámetro (tupla): sql_clause=(None, 'ORDER BY SORT_FIELD ASC')- o DESCpara descender.
nmpeterson
2

Como señaló @nmpeterson, puede ingresar una cláusula sql en la llamada del cursor para ordenar por un campo:

UpdateCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause} )

El prefijo SQL admite None, DISTINCT y TOP. El postfix de SQL admite None, ORDER BY y GROUP BY.

sql_clause = (None, 'ORDER BY SORT_FIELD ASC') - o DESC

la información proviene de la ayuda de ESRI: http://resources.arcgis.com/en/help/main/10.2/index.html#//018w00000014000000

jbalk
fuente
0

Puede que solo sea relevante para referencia futura, pero según la ayuda en línea de ArcGis cuando se usa arcpy.UpdateCursor en lugar de arcpy.da.UpdateCursor, hay una opción de clasificación disponible.

cursor = arcpy.UpdateCursor (fc, sort_fields = " YOURFIELDNAME ")

Daniel
fuente