atualizar uma tabela de atributo shapefile com valores de outra tabela dbf

10

Eu tento explicar aqui o que estou tentando fazer:

Eu tenho um shapefile e uma tabela dbf independente com os mesmos campos. Na tabela dbf, todos os campos são preenchidos, mas na tabela de atributos shapefile, apenas um, vamos chamá-lo de "OneField". O que eu quero fazer é verificar se os valores do "OneField" (Shapefile) são iguais aos valores do "OneField" (tabela dbf) e, se sim, preencher os campos vazios restantes na tabela de atributos do shapefile com os valores na tabela dbf independente.

No momento, estou tentando apenas copiar os valores da tabela dbf independente para a tabela de atributos shapefile, mas estou travado. (Quando executo esse código, recebo uma mensagem de que pythonwin parou de funcionar e nada acontece com as tabelas). Você pode me dar uma mão, por favor?

Aqui está o código:

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

Muito obrigado

Bogdan Palade
fonte
1
Você pode editar sua pergunta original, corrigir ou adicionar informações.
precisa
tente pegar todas as linhas que têm .next (), com arcpy as linhas são iterable, por "para" laços sobre eles, você não faz .next ()
gotchula

Respostas:

3

Do ponto de vista do código, parece que você está usando "row" para várias coisas (~ 4) diferentes, algumas das quais parecem desnecessárias. Não faço muito com o arcpy, mas imagino que algo assim funcionaria melhor. Nesse caso, você acabaria com a coluna inteira do OneField no seu FC preenchida com o último valor do OneField da sua tabela:

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
fonte
Neuhausr, muito obrigado, funciona bem como você diz
Bogdan Palade
2

Meu método para mover dados de um dbf para um shapefile. É (claro que eu prefiro fazer isso dentro de um software GUI) associar o dbf ao shapefile.

Nesse ponto, normalmente seleciono atributos que não são nulos (faço isso no campo de ID da segunda tabela). Se não forem nulos, corresponderam.

Feito isso, você pode selecionar os valores por shapefile.onefield <> table.onefield.

Em seguida, execute seu cálculo no shapefile.

Brad Nesom
fonte
-1

Desculpe por não responder à sua pergunta, mas eu definitivamente faria isso no db-environment. Especialmente se houver muitos dados, provavelmente será muito mais rápido.

Se você, por exemplo, carrega o shapefile e o dbf em um PostGIS db, sua consulta pode se parecer com:

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;

Se você colocar o índice nos campos de junção, isso deve ser muito rápido. É claro que você pode atualizar o shape_table, mas prefere criar uma nova tabela para não destruir os dados originais.

Nicklas Avén
fonte