Tengo un script de Python que agrega un campo de atributo a un Shapefile si no existe. Esto es fácil de hacer con ArcGIS (gráficamente o vía Python), pero estoy buscando algo que no dependa de ArcGIS.
Intenté esto sin éxito con OGR, ya que mi Shapefile contiene características .
He visto 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 esto se puede hacer jugando con el archivo DBF a través de dbfpy .
¿Alguien tiene alguna idea?
Respuestas:
debería echar un vistazo a estas preguntas ya que ya se ha respondido: ¿Cómo agregar atributos de funciones personalizados a Shapefile usando Python?
/programming/4215658/adding-custom-feature-attributes-to-esri-shapefile-with-python
Si desea como resultado, solo un archivo de forma, simplemente elimine sus archivos de entrada al final de su secuencia de comandos.
fuente
Aquí hay una solución. Mejor tarde que nunca:
http://geospatialpython.com/2013/04/add-field-to-existing-shapefile.html?m=1
fuente
Gracias a un formato bastante cerebral llamado DBF, no es posible agregar campos a los archivos de forma con datos de atributos existentes sin reescribir o agregar relleno al DBF. No conozco una solución preparada, pero lo que haría sería escribir un script para crear un nuevo archivo de forma basado en uno existente y agregar los campos adicionales al nuevo archivo de forma. Luego copie los datos de geometría / atributo del archivo de forma antiguo al nuevo. Y como paso final, elimine el antiguo archivo de forma y cambie el nombre del nuevo. Todo esto se logra con bastante facilidad utilizando los enlaces de Python de OGR.
Alternativamente, puede usar dbfpy para hacer lo anterior solo con el archivo DBF. El orden de los pasos sigue siendo el mismo:
No es necesario realizar ningún cambio en el archivo de forma (.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.
fuente
DBFpy debería funcionar para esto. ¿Has visto el ejemplo en esta página?
http://dbfpy.sourceforge.net/
Asegúrese de que el archivo de forma no esté siendo editado por ninguna otra aplicación, incluida ArcGIS en ese momento, ya que esto puede causar problemas al bloquear.
fuente
from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField(("FOO", "C", 15))
Encontré una solución usando OGR y gracias a la ayuda de una pregunta anterior . Aquí hay un ejemplo completo:
Mi problema fue que usé en
layer_defn.AddFieldDefn(new_field)
lugar delayer.CreateField(new_field)
. Muchas gracias a la ayuda, y lo siento por no haber verificado la otra pregunta similar.fuente