É possível classificar um arcpy.da.UpdateCursor ()?

8

Eu tenho um cursor de atualização do ArcPy Data Access que gostaria de classificar antes de fazer atualizações.

O cursor faz atualizações se eu não classificar, mas se eu adicionar uma classificação, recebo um erro "iteração não iniciada".

A classificação está funcionando corretamente, mas deve estar bloqueando o cursor por algum motivo.

Não é possível classificar um cursor de atualização como um cursor de pesquisa? Isso muda o tipo ou algo assim?

    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
fonte
Se eu assistir os locais em uma sessão de depuração, o "addLabelCursor" continuará sendo um objeto da.UpdateCursor durante todo o tempo. Não é como se fosse convertido em uma lista quando classificado.
TurboGus 9/08/2012
Está falhando em: addLabelCursor.updateRow (linha)
TurboGus
Você precisa classificar dentro da chamada do cursor usando uma cláusula sql (ORDER BY)
jbalk

Respostas:

11

A classificação esgota completamente o cursor antes de você entrar updateRow. A maneira como os cursores funcionam é que a updateRowchamada não funciona em linhas arbitrárias fora da sequência, mas na atual sendo repetida. Ou seja, você só pode operar em uma linha por vez.

Você pode querer fazer isso no lado do geodatabase. Você pode especificar uma ORDER BYcláusula e classificá-la antes de acessá-la.

Jason Scheirer
fonte
Parece que você não pode usar os tokens de geometria na cláusula sql de um cursor. Vou ter que usar uma solução alternativa, como adicioná-lo a um campo real antes da mão, ou talvez eu apenas armazene essa entrada de cursores na memória e use um cursor de pesquisa para classificar e inserir o cursor para criar. Obrigado por confirmar que não consigo classificar um cursor de atualização e ainda assim atualizar.
TurboGus 9/08/12
7
@TurboGus, mas você pode classificar as linhas em um cursor. A ajuda indica que você pode especificar o sql_clauseparâmetro (tupla): sql_clause=(None, 'ORDER BY SORT_FIELD ASC')- ou DESCpara decrescente.
Npmeterson 17/10/2014
2

Como o @nmpeterson apontou, você pode inserir uma cláusula sql na chamada do cursor para classificar por um campo:

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

O prefixo SQL suporta None, DISTINCT e TOP. O postfix do SQL suporta None, ORDER BY e GROUP BY.

sql_clause = (Nenhum, 'ORDER BY SORT_FIELD ASC') - ou DESC

As informações vêm da ajuda da ESRI: http://resources.arcgis.com/en/help/main/10.2/index.html#//018w00000014000000

jbalk
fonte
0

Pode ser relevante apenas para referência futura, mas de acordo com a ajuda on-line do ArcGis ao usar arcpy.UpdateCursor em vez de arcpy.da.UpdateCursor, há uma opção de classificação disponível.

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

Daniel
fonte