Cómo crear y remover campos de atributos a través de la Python Console de PyQGIS

En el post anterior se refirió el procedimiento para modificar los valores de un campo de atributos mediante la Python Console de PyQGIS y que ya había sido previamente creado a través de las prestaciones de QGIS. En esta ocasión se va a señalar cómo crear tales campos.

La referencia del procedimiento está basada en el PyQGIS cookbook. Este no es un libro de texto sino un extenso manual de referencia que, pese a estar salpicado de alguno que otro error, eso no le quita que es una excelente referencia cuando uno comienza a desentrañar la forma de interpretarlo. No obstante, presenta en la mayoría de los casos porciones de código exentas de detalles importantes que pueden hacer difícil su comprensión inicial y desanimar a cualquier principiante.

El PyQGIS cookbook sugiere que, aunque la mayoría de los manejadores (providers) de datos vectoriales soportan la edición de los datos de la capa, es conveniente usar la función capabilities() para encontrar que serie de funcionalidad puede ser soportada. Por tanto, basado en este criterio, si me propongo a crear los campos ‘AREA’ y ‘LENGTH’ en un vectorial tipo polígono que creé en un post pasado, y que tengo como capa activa en el Map Legend, tendría que proceder de la siguiente manera:

from PyQt4.QtCore import QVariant

pol=iface.activeLayer()

caps = pol.dataProvider().capabilities()

if caps & QgsVectorDataProvider.AddAttributes:
    res = pol.dataProvider().addAttributes( [ QgsField("AREA", QVariant.Double), 
                                              QgsField("LENGTH", QVariant.Double) ] )

if res == True:
    print "Field was added satisfactorily"

else:
    print "Field was not created"
    
pol.updateFields()

La imagen siguiente refleja que el código ha funcionado satisfactoriamente y los campos han sido incluidos sin necesidad de iniciar una sesión de edición:

field

No obstante, como el provider de este shapefile es ‘ogr’ sabemos que soporta funcionalidad completa para las labores de edición y si prescindimos de capabilities() el código siguiente también opera:

from PyQt4.QtCore import QVariant

pol=iface.activeLayer()

res = pol.dataProvider().addAttributes( [ QgsField("AREA2", QVariant.Double), 
                                              QgsField("LENGTH", QVariant.Double) ] )

if res == True:
    print "Field was added satisfactorily"

else:
    print "Field was not created"
    
pol.updateFields()

Sin embargo, el uso de pol.dataProvider().deleteAttributes([n]) para borrar los campos, donde n es el índice del campo, no funciona adecuadamente (desplaza y mezcla los valores de los atributos que no son objeto de eliminación; lo que probablemente es un bug en el procedimiento) y si se desea eliminar directamente uno de ellos sería conveniente hacerlo en una sesión de edición con startEditing; como al final de este post. Sin embargo, lo ideal sería hacerlo a través de un buffer de edición; tema de un próximo post.

Esta entrada fue publicada en Código Python, PyQGIS, SIG, Software Libre. Guarda el enlace permanente.

Una respuesta a Cómo crear y remover campos de atributos a través de la Python Console de PyQGIS

  1. Pingback: Cómo crear y remover campos de atributos...

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s