actualizar una tabla de atributos de shapefile con valores de otra tabla dbf

10

Intento explicar aquí lo que estoy tratando de hacer:

Tengo un shapefile y una tabla dbf independiente con los mismos campos. En la tabla dbf, todos los campos están poblados, pero en la tabla de atributos shapefile solo uno, asígnele el nombre "OneField". Lo que quiero hacer es verificar que los valores de "OneField" (Shapefile) sean los mismos que los valores de "OneField" (tabla dbf) y, de ser así, llenar los campos vacíos restantes en la tabla de atributos de shapefile con los valores en la tabla independiente de dbf.

Por el momento, estoy tratando de copiar los valores de la tabla dbf independiente a la tabla de atributos de shapefile, pero estoy atascado (cuando ejecuto este código recibo un mensaje de que pythonwin dejó de funcionar y no sucede nada en las tablas). ¿Me puedes echar una mano por favor?

Aquí está el 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

Muchas gracias

Bogdan Palade
fuente
1
Puede editar su pregunta original, para corregir o agregar información.
Brad Nesom
intente eliminar todas las líneas que tienen .next (), con arcpy las filas son iterables, usted para "for" bucles en ellas, no hace .next ()
gotchula

Respuestas:

3

Desde el punto de vista del código, parece que está usando "fila" para un montón (~ 4) cosas diferentes, algunas de las cuales parecen ser innecesarias. No hago mucho con arcpy, pero imagino que algo así funcionaría mejor. Si lo hiciera, terminaría con la columna completa de OneField en su FC completada con el último valor de OneField de su tabla:

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
fuente
neuhausr, muchas gracias, funciona bien cómo lo pones
Bogdan Palade
2

Mi método para mover datos de un dbf a un shapefile. Es (por supuesto que prefiero hacer esto dentro de un software gui) unir el dbf al shapefile.

En ese punto, normalmente selecciono atributos que no son nulos (hago esto en el campo id de la segunda tabla). Si no son nulos, entonces coinciden.

Una vez hecho esto, puede seleccionar los valores por shapefile.onefield <> table.onefield.

Luego ejecute su cálculo en el archivo de forma.

Brad Nesom
fuente
-1

Perdón por no responder a su pregunta, pero definitivamente haría esto en db-environment. Especialmente si se trata de una gran cantidad de datos, entonces probablemente será mucho más rápido.

Si, por ejemplo, carga el archivo de forma y el dbf en un db PostGIS, su consulta podría verse así:

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;

Si coloca el índice en los campos de unión, esto debería ser muy rápido. Por supuesto, puede actualizar shape_table en su lugar, pero le gusta crear una nueva tabla para no destruir los datos originales.

Nicklas Avén
fuente