Plugin AutoFields para QGIS

Este plugin permite configurar cálculos automáticos para campos vectoriales cuando se digitalizan nuevos registros (features) o se modifican los existentes. Los AutoFields son análogos a los triggers en las bases de datos o a una Calculadora de Campos automática.

Intro

Un requerimiento muy común para los usuarios SIG es obtener valores automáticos para atributos cuando se crean o modifican registros en una capa vectorial. Imagina digitalizar features en una capa de puntos y obtener valores de coordenadas X y Y automáticamente.

Si bien es cierto que este es un escenario muy común cuando se trabaja con capas vectoriales, usualmente las herramientas SIG no ofrecen una forma sencilla de lograrlo. Algunos formatos vectoriales (o el software detrás de ellos) permiten a los expertos SIG implementar triggers, que son acciones personalizadas que se ejecutan luego de crear, modificar o borrar registros en una tabla. PostgreSQL/PostGIS y SQLite/SpatiaLite soportan triggers, pero a pesar de su potencialidad, no a todos los usuarios SIG les gustaría encargarse de la creación de triggers y generalmente se relega a expertos en Bases de Datos.

El plugin AutoFields plugin para QGIS permite a los usuarios SIG definir cálculos automáticos cuando se crean o editan objetos espaciales. Puedes instalar el plugin desde el repositorio oficial de QGIS y abrir su interfaz principal dando click en este botón:

enter image description here

Uso

Un AutoField se crea eligiendo una capa vectorial, un campo (o columna), y una expresión (o valor).

Por ejemplo, si quieres obtener de forma automática la longitud de los ríos que vas a digitalizar:

  1. Eliges tu capa de ríos;enter image description here
  2. Eliges (o creas, si este aún no existe) un campo longitud, y;enter image description here
  3. Defines una expresión eligiendo entre algunas opciones ofrecidas (en este caso, Length) o abriendo el diálogo Expresión Personalizada.enter image description here

Luego de guardar el AutoField, cada vez que creas una nueva línea, modificas una geometría (línea) existente, o modificas cualquier attributo de un río de tu capa de ríos, el valor correspondiente a su campo Longitud será actualizado a la longitud calculada.

QGIS recordará los AutoFields que creaste. Incluso puedes cerrar QGIS. La próxima vez que cargues la misma capa, sus AutoFields serán habilitados y estarán listos para ayudarte a manterner valores actualizados.

Si quieres remover algunos AutoFields, puedes ir a la pestaña Lista de AutoFields, seleccionar los AutoFields a remover y dar click en Remover AutoFields. Nota que el campo creado (longitud) no será removido, solamente su AutoField asociado.

enter image description here

Si no quieres remover un AutoField, sino sobreescribir (o editar) su expresión, puedes repetir los pasos 1 al 3. Una vez des click en  Guardar AutoFields, el plugin reconocerá que estás intentanto guardar sobre un AutoField existente y te preguntará si quieres o no sobreescribirlo.

Puedes ver los siguientes ejemplos en video, los cuales muestran cómo definir AutoFields para resolver problemas comunes en el área de los SIG. Los videos tienen subtítulos en inglés y español.

Ejemplos

  • Auto-poblar propiedades geométricas y mantenerlas actualizadas (p.e., coordenadas de los puntos inicial y final líneas).
  • Definir identificadores (IDs) automáticos para un Shapefile.
  • Obtener un sello de tiempo (time stamp) cuando se crea o edita un feature.
  • Cálculo automático de área y densidad de población (un AutoField dependiendo de otro AutoField).
  • Auto-poblar la elevación (desde un DEM) para puntos usando una función de Python como expresión.

Usando AutoFields desde PyQGIS

Puedes crear, sobreescribir y remover AutoFields desde otros plugins de QGIS, desde la consola de Python de QGIS, o desde scripts de PyQGIS. Solo debes tener en cuenta los siguientes pasos.

  1. Necesitas obtener una referencia a la instancia de la clase AutoFieldManager, la cual te permite crear, sobreescribir y remover AutoFields. Para ello, te sugerimos usar la función getAutoFieldManager(), así:
    from qgis import utils
    def getAutoFieldsManager():
        if not utils.isPluginLoaded('AutoFields'):
            if 'AutoFields' in utils.available_plugins:
                utils.loadPlugin('AutoFields')
                utils.startPlugin('AutoFields')
                af = utils.plugins['AutoFields']
                return af.autoFieldManager
            else:
                print "It seems AutoFields plugin is not installed. Could you please check it?"
                return None
    
  2. Usar la función getAutoFieldsManager() para obtener la referencia a AutoFieldManager.
    afm = getAutoFieldsManager()
    
  3. Así es como creas AutoFields usando PyQGIS. En el siguiente ejemplo, crearemos un AutoField en la capa myPointLayer (la cual debe ser una instancia de QgsVectorLayer), sobre su campo coordinate (el campo debería existir en myPointLayer), con la expresión $x, la cual te dará la coordenada X.
    if afm:
       autoFieldId = afm.createAutoField(  layer=myPointLayer, fieldName=u'coordinate', expression=u'$x' ) 
    
  4. Ahora puedes crear feaures, modificar geometrías o modificar atributos (bien sea vía interfaz de QGIS o vía PyQGIS) y tu AutoField actualizará automáticamente el valor del campo coordinate! Solo debes tener presente que si usas PyQGIS, necesitas realizar la edición dentro de una sesión de edición y no directamente al proveedor de datos (Data Provider). Por ejemplo:
    tmpFeature = QgsFeature( myPointLayer.pendingFields() )
    tmpFeature.setGeometry( QgsGeometry.fromPoint( QgsPoint(-74.4, 4.5) ) )
    myPointLayer.startEditing()
    myPointLayer.addFeature( tmpFeature )
    myPointLayer.commitChanges()
    

    Tu campo coordinate ahora debe tener el valor -74.4 para el feature creado.

  5. Puedes sobreescribir un AutoField (p.e., para cambiar su expresión) de esta forma:
    autoFieldId = afm.overwriteAutoField( layer=myPointLayer, fieldName=u'coordinate', expression=u'$y' )
    
  6. Finalmente, puedes remover el AutoField creado pasos atrás, ejecutando lo siguiente:
    afm.removeAutoField( autoFieldId )
    

Si quieres usar AutoFields sin interfaz gráfica,por ejemplo, desde un script de PyQGIS fuera de QGIS, puedes dar un vistazo a las pruebas del plugin (Tests.py). Si tienes alguna pregunta al respecto, deja un comentario en este post.

Preguntas Frecuentes (FAQ)

  • ¿Sobre cuáles versiones de QGIS funciona el plugin AutoFields?
    Puedes usar el plugin AutoFields en QGIS v2.12.x o superior. Aunque necesitas v2.14.x si quieres convertir las unidades de propiedades geométricas (p.e., área, longitud, y perímetro) desde sistema de referencia de la capa a las unidades definidas en el proyecto actual de QGIS.
  • ¿El plugin AutoFields actualiza todos los features (registros) de mi capa vectorial?
    ¡Si! A partir de la versión 0.4.0 del plugin, cuando creas un AutoField puedes elegir si quieres calcular la expresión en los registros existentes de la capa. Esto permite que todos los registros de la capa (existentes y los que crees de allí en adelante) tengan el campo calculado y actualizado.

  • ¿Los AutoFields funcionan con ‘X’ formato vectorial?
    Ya hemos probado AutoFields con datos de PostgreSQL/PostGIS, SpatiaLite, Shapefile, WFS-T (Transactional Web Feature Service) y Memory layers. Te agradezco me hagas saber si usas AutoFields sobre otros formatos vectoriales.
  • ¿Los AutoFields son como los Campos Virtuales (Virtual Fields)?
    No. A diferencia de los Virtual Fields, los AutoFields:

    • Almacenan los valores calculados en los datos mismos;
    • Son independientes del proyecto de QGIS en el que estés trabajando, esto es, puedes cambiar de proyecto y los AutoFields seguirán funcionando si cargas las capas con AutoFields;
    • Solo funcionan sobre capas editables (por ejemplo, QGIS no escribe en capas de formatos como GML).
  • ¿Puedo crear múltiples AutoFields por capa?
    Si, seguro que puedes.
  • ¿Cómo se enlazan los AutoFields a mi capa?
    Los AutoFields que creas para una capa se enlazan a su fuente (layer source) (p.e., a la ruta para un Shapefile o a una cadena de conexión para una capa PostGIS). Eso significa que si cambias el directorio de un Shapefile o el nombre del esquema tu capa PostGIS, los AutoFields no podrán reconocer su capa asociada y serán inhabilitados.
  • ¿Puedo obtener propiedades geométricas como área, longitud y perímetro en otras unidades?
    Los cálculos de área y distancia tienen en cuenta las unidades definidas en el proyecto. Ve a Project -> Project properties -> General -> Measurements si quieres definir otras unidades para tus cálculos.
  • ¿Puedo usar AutoFields sobre memory layers?
    Por lo general, puedes usar AutoFields sobre memory layers sin ningún problema, mientras no quieras usarlos en varias sesiones. De hecho, los memory layers no funcionan en varias sesiones de QGIS puesto que sus features son borrados cuando se cierra QGIS.
  • ¿Qué pasa si agrego la misma capa dos veces a QGIS?
    Los AutoFields existentes solo serán asociados a la primera capa que cargues y no a sus duplicados. Como recomendación, si tienes que cargar capas duplicadas, elige una de ellas (la que se cargó primero) para configurar (crear, sobreescribir o remover) AutoFields y hacer ediciones. Si empiezas a crear AutoFields sobre varias capas duplicadas, los resultados se volverán impredecibles.
  • ¿Puedo crear múltiples AutoFields al mismo tiempo?
    Si, seguro que puedes. Por ejemplo, si quieres obtener la coordenada X actualizada sobre varias capas de puntos, seleccionalas en el listado de capas del plugin, crea un Nuevo Campo (puedes incluso seleccionar un campo en común si es que existe), y elige la opción Coordenada X desde la secciónValor o Expresión. Finalmente, dale click a Guardar AutoField.
  • ¿Cómo puedo desactivar temporalmente un AutoField para realizar otras ediciones?
    Agrega un duplicado de tu capa y realiza las ediciones sobre ella. Esas ediciones se propagarán a la capa original sin disparar los cálculos automáticos de tus AutoFields.
  • ¿Puedo editar el valor de un AutoField manualmente?
    Puedes editar atributos cuyo campo correspondiente tenga un AutoField asociado, bien sea manualmente o incluso usando la Calculadora de Campos sobre ellos, sin embargo, debes tener en cuenta que tan pronto como edites de nuevo el feature correspondiente, el valor que editaste manualmente del AutoField se sobreescribirá.
  • ¿Qué pasa si edito miles de features a la vez?
    Para modificaciones en lotes te recomendamos usar la Calculadora de Campos. Es mucho más rápido ya que está optimizada para ello. Los AutoFields te dan la posibilidad de automatizar cálculos y se crearon pensando en actualizar uno o pocos features a la vez.

Problemas Conocidos

  • Cuando se crean nuevos features, los AutoFields solo se actualizan cuando se guardan cambios. Herramientas como Split también son afectadas por este problema, ya que al partir un objeto, por lo menos una de las partes resultandes es agregada como un nuevo feature. (Esto es para evitar que QGIS se cierre inesperadamente QGIS issue #15311)
  • Te recomendamos no usar comandos Redo en cualquiera de sus formas, p.e., atajo de teclado (Ctrl+Shift+R por defecto), botones, o desde PyQGIS. QGIS se cerrará inesperadamente tarde o temprano. (QGIS issue #15311)
  • Cuando se edita con formularios, el formulario no despliega el valor automático, sino que se requiere dar click en Aceptar para ver el valor automático en la tabla de atributos.
  • Escribir directamente al proveedor de datos (p.e., vía PyQGIS) no tiene una SIGNAL asociada, por lo que no es posible para los AutoFields hacer cálculos automáticos luego de dichas ediciones (mira este hilo en QGIS-dev mailing list).
  • Algunas veces, iniciar una sesión de edición desde la tabla de atributos con valores NULL, emite la señal attributeValueChanged varias veces (mira hilo en QGIS-dev mailing list).
  • Si se usa Undo y se cierra la sesión de edición sin guardar cambios, los AutoFields retendrán valores. Si, por ejemplo, tuviesen un valor NULL antes de empezar a editar, luego de cerrar la sesión de edición ya no tendrán el valor NULL sino que retendrán algún valor de los cálculos. (Related to QGIS issue #15311)
  • Agregar un nuevo campo en capas PostGIS no funciona (QGIS issue #13743).

Agradecimientos

Un agradecimiento especial a todos los voluntarios de la fase de pruebas: Thomas Baumann, Hennessy Becerra, Miguel Ángel Blanco, Diego Cordero, Erwin Galvis, Romina González Musso, Andrés Guarín, William Guerrero, Arturo Lorenzo, Sandra Liliana Moreno, Enrique Morón, Leonardo Porto Nazareth y Marcela Suárez. Todos ellos me dieron comentarios y sugerencias muy útiles, que ayudaron a mejorar AutoFields considerablemente.

Gracias a todos los desarrolladores de QGIS, ellos realizan el trabajo duro para que este tipo de desarrollo sea posible.

Donaciones

No fui contratado para desarrollar el plugin AutoFields. Lo desarrollé para suplir una necesidad de la comunidad. Por lo tanto, si tú (la comunidad) quieres agradecer este trabajo, por favor dona para que pueda obtener el dinero que merezco. Aparte del desarrollo en si mismo, usaré tu donación para hacer mantenimiento al plugin, para mantener su documentación nactualizada, para revisar los problemas de QGIS encontrados e intentar resolverlos, así como para migrar el plugin a la versión QGIS v3.x que se avecina.

Cantidad sugerida para la donación:

Si quieres contribuir de otras formas (código, traducciones, creando reportes), por favor hazlo a través del repositorio de GitHub del plugin AutoFields.

¡Esperamos que los AutoFields les sean útiles!

Puedes contactarme si te gustaría cotratarme para desarrollar un plugin de QGIS que necesites.