25 votos

Añadir campo de atributo a Shapefile existente a través de Python sin ArcGIS

Tengo un script en Python que añade un campo de atributo a un Shapefile si no existe. Esto es fácil de hacer con ArcGIS (gráficamente o a través de Python), pero estoy buscando algo que no depende de ArcGIS.

Probé esto sin éxito con OGR, ya que mi Shapefile contiene características .

He mirado pyshp pero tampoco es posible modificar el esquema una vez creado. No he probado con shapefile (para Python) pero no veo que se anuncie esta función. Tampoco puedo ver cómo se puede hacer esto jugando con el archivo DBF a través de dbfpy .

¿Alguien tiene alguna idea?

9voto

eplawless Puntos 2076

Usted debe tener una mirada en estas preguntas, ya que se ha respondido ya : ¿Cómo añadir atributos personalizados a Shapefile utilizando Python?

https://stackoverflow.com/questions/4215658/adding-custom-feature-attributes-to-esri-shapefile-with-python

Si desea como resultado, sólo un shapefile, sólo tiene que borrar sus archivos de entrada al final de su script.

4voto

Jason Z Puntos 111

Gracias a un formato bastante descerebrado llamado DBF, añadir campos a los shapefiles con datos de atributos existentes no es posible sin reescribir o añadir relleno al DBF. No conozco ninguna solución, pero lo que yo haría sería escribir un script para crear un nuevo shapefile basado en uno existente y añadir los campos adicionales al nuevo shapefile. A continuación, copie los datos de geometría y atributos del shapefile antiguo al nuevo. Y como paso final, eliminar el shapefile antiguo y renombrar el nuevo. Todo esto es bastante fácil de lograr utilizando OGR python bindings.

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

  1. Crear un nuevo DBF con estructura idéntica al original
  2. Crear nuevos campos de atributos en el nuevo DBF
  3. Copiar datos del DBF original al nuevo DBF
  4. Eliminar DBF antiguo, renombrar DBF nuevo a DBF antiguo

No es necesario realizar ningún cambio en el propio archivo shape (.shp) ni en ninguno 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 antiguo y en el nuevo.

4voto

harpo Puntos 17399

He aquí una solución. Más vale tarde que nunca:

http://geospatialpython.com/2013/04/add-field-to-existing-shapefile.html?m=1

3voto

TCS Puntos 185

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

http://dbfpy.sourceforge.net/

Asegúrese de que el archivo shapefile no está siendo editado por cualquier otra aplicación, incluyendo ArcGIS en el momento, ya que esto puede causar problemas a través de bloqueo.

2voto

hernan43 Puntos 566

Encontré una solución utilizando OGR y gracias a la ayuda de un pregunta anterior . He aquí 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))
print('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 era que utilizaba layer_defn.AddFieldDefn(new_field) en lugar de layer.CreateField(new_field) . Muchas gracias por la ayuda, y perdón por no comprobar a fondo la otra pregunta similar.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X