Di tangkapan layar terlampir, atribut berisi dua bidang minat "a" dan "b". Saya ingin menulis skrip untuk mengakses baris yang berdekatan untuk membuat beberapa perhitungan. Untuk mengakses satu baris, saya akan menggunakan UpdateCursor berikut:
fc = r'C:\path\to\fc'
with arcpy.da.UpdateCursor(fc, ["a", "b"]) as cursor:
for row in cursor:
# Do something
Misalnya, dengan OBJECTID 4, saya tertarik menghitung jumlah nilai baris dalam bidang "a" yang berdekatan dengan baris OBJECTID 4 (yaitu 1 + 3) dan menambahkan nilai itu ke baris OBJECTID 4 di bidang "b". Bagaimana saya bisa mengakses baris yang berdekatan dengan kursor untuk membuat perhitungan semacam ini?
sumber
OBJECTID
- solusi ini dapat mengidentifikasi tetangga sesuai dengan nilai-nilai kunci itu. Namun, kamus biasanya tidak mendukung pencarian "berikutnya" atau "sebelumnya". Anda membutuhkan sesuatu seperti Trie .Saat memutar di atas baris, Anda harus melacak nilai sebelumnya. Ini adalah salah satu cara untuk melakukannya:
atau, jika tabelnya tidak besar, saya mungkin akan membangun kamus, seperti d = {a: b} dan kemudian di perbarui data akses kursor dari kamus: d.get (a + 1) atau d.get (a -1) untuk melakukan perhitungan matematika ..
sumber
Saya telah menerima jawaban @Hornbydd untuk membimbing saya menuju solusi kamus. Skrip terlampir melakukan tindakan berikut:
sumber
Modul Akses Data cukup cepat dan Anda dapat membuat a
SearchCursor
untuk menyimpan semua nilai dari 'a' ke dalam daftar kemudian membuat aUpdateCursor
untuk beralih melalui setiap baris dan pilih dari daftar untuk memperbarui baris 'b' yang diperlukan. Dengan cara ini Anda tidak perlu khawatir tentang menyimpan data di antara baris =)Jadi sesuatu seperti ini:
Ini adalah solusi yang cukup kasar tetapi saya baru saja menggunakannya untuk mengatasi masalah yang sangat mirip. Jika kode tidak berfungsi semoga kode ini menempatkan Anda di jalur yang benar!
Edit: Diubah terakhir jika pernyataan dari DAN ke ATAU Edit2: Diubah kembali. Ahh tekanan dari posting StackExchange pertama saya!
sumber
aList
alih-alih menambahkan setiap entri. 2) Gunakanenumerate()
alih-alih memiliki penghitung terpisah untuk indeks.Pertama, Anda membutuhkan kursor pencarian; Saya tidak berpikir Anda bisa mendapatkan nilai dengan kursor pembaruan. Kemudian di setiap iterasi gunakan aNext = row.next (). GetValue ('a') untuk mendapatkan nilai dari baris berikutnya.
Untuk mendapatkan nilai dari baris sebelumnya saya akan mengatur variabel di luar for for sama dengan nol. Ini diperbarui untuk sama dengan nilai baris saat ini dari 'a'. Anda kemudian dapat mengakses variabel ini di iterasi berikutnya.
Ini kemudian akan memenuhi persamaan Anda dari B = A (rowid-1) + A (rowid + 1)
sumber
fieldA
dan menggunakannya untuk menghitung nilai baru untukfieldB
).