¿Cómo agregar un campo de atributo al Shapefile existente a través de Python sin ArcGIS?

23

Tengo un script en Python que agrega un campo de atributo a un Shapefile si no existe. Esto es fácil de hacer con ArcGIS (gráficamente o mediante Python), pero estoy buscando algo que no dependa de ArcGIS.

Lo intenté sin éxito con OGR, desde mi Shapefile contiene características .

He consultado pyshp , pero, de manera similar, no hay forma de modificar el esquema después de que se haya creado. . No he probado con shapefile (para Python) , pero no veo esta característica anunciada. Tampoco puedo ver cómo se puede hacer esto haciendo retoques con el archivo DBF a través de dbfpy .

¿Alguien tiene alguna idea?

    
pregunta Mike T 18.03.2011 - 09:43

5 respuestas

8

debería ver estas preguntas, ya que ya se ha respondido: ¿Cómo agregar atributos personalizados de características a Shapefile usando Python?

enlace

Si desea como resultado, solo un shapefile, simplemente elimine sus archivos de entrada al final de su script.

    
respondido por el simo 18.03.2011 - 14:09
4

Gracias a un formato más bien cerebral llamado DBF, no es posible agregar campos a los shapefiles con datos de atributos existentes sin volver a escribir o agregar el relleno al DBF. No conozco una solución lista para usar, pero lo que haría sería escribir un script para crear un nuevo shapefile basado en uno existente y agregar los campos adicionales al nuevo shapefile. Luego copie los datos de geometría / atributo del archivo de forma antiguo al nuevo. Y como paso final, elimine el shapefile antiguo y cambie el nombre del nuevo. Todo esto se logra con bastante facilidad utilizando los enlaces de OGR python.

Alternativamente, puede usar dbfpy para hacer lo anterior con solo el archivo DBF. El orden de los pasos sigue siendo el mismo:

  1. Cree un nuevo DBF con una estructura idéntica al original
  2. Crear nuevos campos de atributo en el nuevo DBF
  3. Copie los datos del DBF original al nuevo DBF
  4. Eliminar DBF anterior, renombrar DBF nuevo a DBF antiguo

No necesita realizar ningún cambio en el shapefile (.shp) o en cualquiera de los otros archivos, ya que no hacen referencia a la información de atributos contenida en el DBF. Sin embargo, debe mantener el orden de los registros exactamente igual en el DBF anterior y en el nuevo.

    
respondido por el Sasa Ivetic 18.03.2011 - 14:21
4

Aquí hay una solución. Mejor tarde que nunca:

enlace

    
respondido por el GeospatialPython.com 20.04.2013 - 18:09
3

DBFpy debería funcionar para esto. ¿Has visto entonces el ejemplo en esta página:

enlace

Asegúrese de que el archivo shape no esté siendo editado por ninguna otra aplicación, incluido ArcGIS, ya que esto puede causar problemas a través del bloqueo.

    
respondido por el Rob Clark 18.03.2011 - 09:51
0

Encontré una solución usando OGR y gracias a la ayuda de un pregunta anterior . Aquí hay un ejemplo completo:

from osgeo import ogr

# Open a Shapefile, and get field names
source = ogr.Open('my.shp', update=True)
layer = source.GetLayer()
layer_defn = layer.GetLayerDefn()
field_names = [layer_defn.GetFieldDefn(i).GetName() for i in range(layer_defn.GetFieldCount())]
print len(field_names), 'MYFLD' in field_names

# Add a new field
new_field = ogr.FieldDefn('MYFLD', ogr.OFTInteger)
layer.CreateField(new_field)

# Close the Shapefile
source = None

Mi problema fue que usé layer_defn.AddFieldDefn(new_field) en lugar de layer.CreateField(new_field) . Muchas gracias a la ayuda, y perdón por no haber revisado completamente la otra pregunta similar.

    
respondido por el Mike T 19.06.2018 - 22:32

Lea otras preguntas en las etiquetas