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
Respuestas:
Eso es exactamente lo que está haciendo la herramienta QGIS ftools "Join by Attribute". Toma un archivo shape y un archivo dbf (o un segundo archivo shape) y se une a sus tablas de atributos. La herramienta está escrita en python, por lo que debe encontrar todo lo que necesita aquí: http://trac.osgeo.org/qgis/browser/trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py
fuente
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:
fuente
Pasé una buena cantidad de tiempo intentando hacerlo yo mismo y tengo algo que funciona. Consulte mi código aquí para que funcione.
¿Cómo actualizar la clase de entidad iterando a través de valores con ramificación? .
Tendrá que hacer una lista que contenga todos los campos para que pueda recorrerlos.
fuente
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.
fuente
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í:
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.
fuente