Apakah mungkin untuk mengurutkan arcpy.da.UpdateCursor ()?

8

Saya memiliki kursor pembaruan ArcPy Data Access yang ingin saya urutkan sebelum melakukan pembaruan.

Kursor membuat pembaruan jika saya tidak mengurutkan, tetapi jika saya menambahkan semacam ke kursor saya mendapatkan kesalahan, "iterasi tidak dimulai."

Penyortiran berfungsi dengan benar tetapi harus menghantam kursor karena suatu alasan.

Apakah tidak mungkin untuk mengurutkan kursor pembaruan seperti kursor pencarian? Apakah itu mengubah jenis atau sesuatu?

    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
sumber
Jika saya melihat penduduk setempat dalam sesi debug, "addLabelCursor" tetap menjadi objek da.UpdateCursor. Ini tidak seperti yang dikonversi menjadi daftar ketika disortir.
TurboGus
Gagal di: addLabelCursor.updateRow (baris)
TurboGus
Anda harus mengurutkan dalam panggilan kursor menggunakan klausa sql (ORDER BY)
jbalk

Jawaban:

11

Semacam itu sepenuhnya menghabiskan kursor sebelum Anda masuk ke updateRow. Cara kursor bekerja adalah bahwa updateRowpanggilan tidak berfungsi pada baris sewenang-wenang, tetapi pada saat ini sedang diulangi. Artinya, Anda hanya dapat beroperasi pada satu baris sekaligus.

Anda mungkin ingin melakukan ini di sisi geodatabase. Anda dapat menentukan ORDER BYklausa dan mengurutkannya sebelum Anda mendapatkannya.

Jason Scheirer
sumber
Sepertinya Anda tidak dapat menggunakan token geometri dalam klausa sql dari kursor. Saya harus menggunakan pekerjaan sekitar seperti menambahkannya ke bidang nyata sebelum tangan atau mungkin saya hanya akan menyimpan input kursor ini dalam memori dan menggunakan kursor pencarian untuk mengurutkan dan menyisipkan kursor untuk membuat. Terima kasih telah mengonfirmasi bahwa saya tidak dapat mengurutkan kursor pembaruan dan masih memperbarui.
TurboGus
7
@ TurboGus tetapi Anda bisa mengurutkan baris dalam kursor. The bantuan menunjukkan Anda dapat menentukan sql_clause(tuple) parameter: sql_clause=(None, 'ORDER BY SORT_FIELD ASC')- atau DESCuntuk turun.
nmpeterson
2

Seperti yang ditunjukkan @nmpeterson, Anda dapat memasukkan klausa sql ke dalam panggilan kursor untuk mengurutkan berdasarkan bidang:

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

Awalan SQL mendukung None, DISTINCT, dan TOP. Postfix SQL mendukung None, ORDER BY, dan GROUP BY.

sql_clause = (Tidak Ada, 'ORDER BY SORT_FIELD ASC') - atau DESC

info berasal dari bantuan ESRI: http://resources.arcgis.com/en/help/main/10.2/index.html#//018w00000014000000

jbalk
sumber
0

Ini mungkin hanya relevan untuk referensi di masa mendatang, tetapi menurut ArcGis bantuan online saat menggunakan arcpy.UpdateCursor bukan arcpy.da.UpdateCursor ada opsi penyortiran yang tersedia.

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

Daniel
sumber