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
Respostas:
É exatamente isso que a ferramenta "Join by Attribute" do QGIS ftools está fazendo. Ele pega um shapefile e um arquivo dbf (ou um segundo shapefile) e junta suas tabelas de atributos. A ferramenta está escrita em python, portanto, você deve encontrar tudo o que precisa aqui: http://trac.osgeo.org/qgis/browser/trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py
fonte
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:
fonte
Passei bastante tempo tentando fazer isso sozinho e tenho algo que funciona. Consulte o meu código aqui para fazê-lo funcionar.
Como atualizar a classe de recurso iterando através dos valores com ramificação? .
Você precisará fazer uma lista que contenha todos os campos para poder iterá-los.
fonte
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.
fonte
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:
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.
fonte