perbarui satu tabel atribut shapefile dengan nilai dari tabel dbf lain

10

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

Bogdan Palade
sumber
1
Anda dapat mengedit pertanyaan awal Anda, untuk memperbaiki atau menambahkan info.
Brad Nesom
coba keluarkan semua baris yang memiliki .next (), dengan arcpy barisnya dapat diubah, Anda untuk "for" loop pada mereka, Anda tidak melakukan .next ()
gotchula

Jawaban:

3

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:

for rowT in rowsTable:
    valueTable = rowT.getValue("OneField")
    for rowF in rowsFc:
        rowF.setValue("OneField", valueTable)
        rowsFc.updateRow(rowF)
        rowF = rowsFc.next()
    rowT = rowsTable.next() 
neuhausr
sumber
neuhausr, terima kasih banyak, itu bekerja dengan baik bagaimana Anda mengatakannya
Bogdan Palade
2

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.

Brad Nesom
sumber
-1

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:

CREATE TABLE new_table AS
SELECT a.the_geom, a.populated_field, b.populated_field2, b.populated_field3
FROM shape_table a LEFT JOIN dbf_table b ON a.populated_field=b.populated_field1;

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.

Nicklas Avén
sumber