cập nhật một bảng thuộc tính shapefile với các giá trị từ một bảng dbf khác


10

Tôi cố gắng giải thích ở đây những gì tôi đang cố gắng làm:

Tôi có một shapefile và một bảng dbf độc lập với cùng các trường. Trong bảng dbf, tất cả các trường được điền nhưng trong bảng thuộc tính shapefile chỉ có một, hãy đặt tên là "OneField". Điều tôi muốn làm là kiểm tra xem các giá trị từ "OneField" (Shapefile) có giống với các giá trị trong "OneField" (bảng dbf) không và nếu có, để điền các trường trống còn lại trong bảng thuộc tính shapefile trong bảng dbf độc lập.

Hiện tại tôi đang cố gắng sao chép các giá trị từ bảng dbf độc lập sang bảng thuộc tính shapefile nhưng tôi bị kẹt. (Khi tôi chạy mã này, tôi nhận được thông báo rằng pythonwin đã ngừng hoạt động và không có gì xảy ra với các bảng). Bạn có thể giúp tôi một tay được không?

Đây là mã:

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

Cảm ơn rât nhiều


1
Bạn có thể chỉnh sửa câu hỏi ban đầu của mình, để sửa hoặc thêm thông tin.
Brad Nesom

hãy thử lấy ra tất cả các dòng có .next (), với Arcpy các hàng có thể lặp lại được, bạn cho các vòng lặp "cho" trên chúng, bạn không làm .next ()
gotchula

Câu trả lời:



3

Từ quan điểm mã, có vẻ như bạn đang sử dụng "hàng" cho một loạt (~ 4) thứ khác nhau, một số trong đó có vẻ không cần thiết. Tôi không làm gì nhiều với arcpy, nhưng tôi tưởng tượng một thứ như thế này sẽ hoạt động tốt hơn. Nếu đúng như vậy, bạn sẽ kết thúc với toàn bộ cột OneField trong FC của bạn với giá trị cuối cùng của OneField từ bảng của bạn:

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, cảm ơn bạn rất nhiều, nó hoạt động tốt như thế nào bạn đặt nó
Bogdan Palade


2

Phương pháp của tôi để di chuyển dữ liệu từ dbf sang shapefile. Là (tất nhiên tôi thích làm điều này trong một phần mềm gui) tham gia dbf vào shapefile.

Tại thời điểm đó tôi thường chọn các thuộc tính không phải là null (tôi làm điều này trên trường id của bảng thứ hai). Nếu họ không null thì họ đã khớp.

Khi điều này được thực hiện, bạn có thể chọn các giá trị bằng shapefile.onefield <> table.onefield.

Sau đó chạy tính toán của bạn trong shapefile.


-1

Xin lỗi vì đã không trả lời câu hỏi của bạn, nhưng tôi chắc chắn sẽ làm điều này trong môi trường db thay thế. Đặc biệt nếu đó là nhiều dữ liệu, thì có lẽ sẽ nhanh hơn rất nhiều.

Ví dụ, nếu bạn tải shapefile và dbf vào db PostGIS, truy vấn của bạn có thể trông giống như thế này:

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;

Nếu bạn đặt chỉ mục trên các trường tham gia, điều này sẽ rất nhanh. Thay vào đó, bạn có thể cập nhật shape_table thay vào đó, nhưng muốn tạo một bảng mới thay vì không phá hủy dữ liệu gốc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.