Jueves 18 de Agosto de 2016 04:23

Plugin AutoFields para QGIS

Written by  German Carrillo
Rate this item
(2 votes)

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.


Last modified on Lunes 12 de Septiembre de 2016 17:14

Latest from German Carrillo

Related items (by tag)

Comentarios  

 
+1 # Very useful module!Anton Biatov 31-10-2016 09:39
Hi, German!
Very useful module!
I wrote a small review module AutoFields, in Russian in my blog:
https://gis-naturalist.blogspot.com/2016/10/AutoFields.html
Responder | Responder con una citación | Citar
 
 
+1 # Re:tuxman 31-10-2016 15:09
Hi Anton,

thanks a lot for the review! Glad you find the plugin useful.

I'll share your post in our Twitter account (@GeoTux2).

Regards,

Germán
Responder | Responder con una citación | Citar
 
 
0 # Great plugingael 13-12-2016 14:15
Hi German,

Your plugin is very useful. Is it possible to change the path when AutoFields is disabled ?
Thank you for your answer !
Gael
Responder | Responder con una citación | Citar
 
 
+1 # Re:tuxman 13-12-2016 19:56
Hi Gael,

great that you find it useful.

What do you mean by path? What kind of layers do you use?

Are you changing the location of your layers and would like AutoFields to recognize the new location?

Regards,

Germán
Responder | Responder con una citación | Citar
 
 
0 # Regael 14-12-2016 09:36
Hi German,

Yes I've changed the location of my layers (shapefile) and I want to modify the new location.

I've created a project with many parameters in AutoFields.

I want to use this project in new arborescence with a relative path.

So it's the same layers with same fields but the name of a folder is different.

Regards,

Gael
Responder | Responder con una citación | Citar
 
 
+1 # Re:tuxman 14-12-2016 14:33
Hi Gael,

that feature is not yet supported. Some German company was also interested in it, they even offer to sponsor it. I'm waiting for their decision.

Keep in mind that AutoFields are not tied to a particular QGIS project. The solution I envision is more related to add import/export functionality to the plugin.

If you're interested in funding such feature, let me know.

Regards,

Germán
Responder | Responder con una citación | Citar
 
 
0 # Re:tuxman 21-04-2017 20:52
Hi Gael,

good news for you. You can use the new export/import functionality in AutoFields v0.5.0. See [1] for details.

Regards,

Germán
---
[1] http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/336-exportar-importar-autofields
Responder | Responder con una citación | Citar
 
 
0 # How exchange the "list of AutoFields"Vincent 15-12-2016 12:41
Hello,

I've followed, with interest, your chat about your great plugin. However the right question is where and how are keep the AutoFields setting in the computer ? Maybe, we could exchange a setting file and put it in the rignt place in each computer...

Thank you and have a nice day,

Vincent
Responder | Responder con una citación | Citar
 
 
+1 # Re:tuxman 15-12-2016 15:18
Hi,

AutoFields definitions are stored by Qt in the operating system as key-value pairs. On GNU/Linux, AutoFields are in /home/user/.config/QGIS, whereas on Windows, AutoFields are stored in the registry.

In that way, AutoFields can persist across QGIS sessions and be independent of QGIS projects.

I would not recommend users change those settings by hand, and that's why import/export functionality may be handy.

Regards,

Germán
Responder | Responder con una citación | Citar
 
 
0 # Re:tuxman 21-04-2017 21:02
Hi Vincent,

good news for you. You can use the new export/import functionality in AutoFields v0.5.0. See [1] for details.

Regards,

Germán
----
[1] http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/336-exportar-importar-autofields
Responder | Responder con una citación | Citar
 
 
0 # Saving definitions to fileHugues 27-03-2017 21:15
Hello,
First, thank you for the plug-in, it is extremely useful.

I was wondering if it would be possible to save the definitions to a separate file so that it would persist across QGIS installs. For example, I use QGIS on both a desktop and a Laptop, with the project and layer files synched through Dropbox. The only thing that doesn't follow cleanly is the AutoFields, which I have to update on both machines whenever I make a change to an AutoField. Saving them to a file and loading them on QGIS start would solve that issue. It would also be much easier to backup and restore. Note that I'm running Windows, so right now I'm looking at exporting and importing the Reg Key every time, but that's making me nervous...

Thank you.
Responder | Responder con una citación | Citar
 
 
0 # Re:tuxman 29-03-2017 15:16
Hi Hughes,

great that you find it useful. As that seems to be a highly requested feature for AutoFields, I invite you (or to Gael or Vincent) to create a feature request (tab Issues) at the GitHub repository [1]. I'll see when I have time to start looking for a solution.

Regards,

Tuxman
-------
[1] https://github.com/gacarrillor/autofields
Responder | Responder con una citación | Citar
 
 
+1 # Request doneHugues 29-03-2017 16:51
Hello, I added the feature request on github. Thanks for your work and let me know if you want me to beta test.
https://github.com/gacarrillor/AutoFields/issues/2
Responder | Responder con una citación | Citar
 

Escribir un comentario


Código de seguridad
Refescar

back to top