Saya mencoba menjelaskan di sini apa yang saya coba lakukan:
Saya punya satu shapefile dan satu tabel dbf independen dengan bidang yang sama. Dalam tabel dbf semua bidang diisi tetapi dalam tabel atribut shapefile hanya satu, beri nama "OneField". Apa yang ingin saya lakukan adalah memeriksa bahwa nilai-nilai dari "OneField" (Shapefile) sama dengan nilai-nilai di "OneField" (tabel dbf) dan jika demikian, untuk mengisi bidang kosong yang tersisa di tabel atribut shapefile dengan yang dalam tabel dbf independen.
Saat ini saya mencoba hanya menyalin nilai dari tabel dbf independen ke tabel atribut shapefile tapi saya mandek (ketika saya menjalankan kode ini saya mendapatkan pesan bahwa pythonwin berhenti bekerja dan tidak ada yang terjadi pada tabel). Bisakah Anda membantu saya?
Ini kodenya:
import arcpy
table = "link/to/table.dbf"
fc = "link/to/shapefile.shp"
# Create a search cursor
rowsTable = arcpy.SearchCursor(table)
# Create an update cursor
rowsFc = arcpy.UpdateCursor(fc)
for row in rowsTable:
row = row.getValue("OneField")
valueTable = row
for row in rowsFc:
row = row.setValue("OneField", valueTable)
rowsFc.updateRow(row)
row = rowsFc.next()
row = rowsTable.next()
del row, rowsFc, rowsTable
Terima kasih banyak
Jawaban:
Itulah yang dilakukan alat QGIS "Gabung dengan Atribut". Dibutuhkan file shapefile dan dbf (atau shapefile kedua) dan bergabung dengan tabel atribut mereka. Alat ini ditulis dengan python, jadi Anda harus menemukan semua yang Anda butuhkan di sini: http://trac.osgeo.org/qgis/browser/trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py
sumber
Dari sudut pandang kode, sepertinya Anda menggunakan "baris" untuk banyak (~ 4) hal yang berbeda, beberapa di antaranya tampaknya tidak perlu. Saya tidak melakukan banyak hal dengan arcpy, tapi saya membayangkan sesuatu seperti ini akan bekerja lebih baik. Jika ya, Anda akan berakhir dengan seluruh kolom OneField di FC Anda yang diisi dengan nilai terakhir OneField dari tabel Anda:
sumber
Saya menghabiskan banyak waktu untuk mencoba ini sendiri dan saya punya sesuatu yang berhasil. Lihat kode saya di sini untuk membuatnya berfungsi.
Bagaimana cara memperbarui kelas fitur dengan melakukan iterasi melalui nilai dengan percabangan? .
Anda harus membuat daftar yang berisi semua bidang sehingga Anda bisa mengulanginya.
sumber
Metode saya untuk memindahkan data dari dbf ke shapefile. Adalah untuk (tentu saja saya lebih suka melakukan ini di dalam perangkat lunak gui) bergabung dengan dbf ke shapefile.
Pada titik itu saya biasanya memilih atribut yang bukan nol (saya melakukan ini pada bidang id dari tabel kedua). Jika mereka bukan nol maka mereka cocok.
Setelah ini selesai, Anda dapat memilih nilai dengan shapefile.onefield <> table.onefield.
Kemudian jalankan perhitungan Anda di shapefile.
sumber
Maaf karena tidak menjawab pertanyaan Anda, tetapi saya pasti akan melakukan ini di db-environment. Terutama jika banyak data, maka itu mungkin akan jauh lebih cepat.
Jika Anda misalnya memuat shapefile dan dbf ke dalam PostGIS db, kueri Anda akan terlihat seperti ini:
Jika Anda meletakkan indeks pada bidang yang bergabung, ini harus sangat cepat. Anda tentu saja dapat memperbarui form_table, tetapi suka membuat tabel baru sebagai gantinya untuk tidak menghancurkan data asli.
sumber