Las expresiones de QGIS tiene una función de agregación que permiten hacer uniones espaciales «al vuelo». Esto nos permite utilizar QGIS para usos muy interesantes. En esta entrada mostraremos cómo utilizar la función Aggregate en QGIS.
Un uso de este tipo es permitir una edición de datos rápida y precisa. Por ejemplo, cuando se está digitalizando y se desea rellenar automáticamente un campo en función de su relación con otra capa.
Para ejemplificar esta característica utilizaremos las capas de parcelas, radios censales, barrios, comunas y calles del portal de Buenos Aires Data de la Capital Autónoma de Buenos Aires (CABA).
Índice
Ejemplo Nº 1. Rellenar automáticamente los campos de la capa “areas_relevamiento” desde las capas de parcelas, radios_censales, barrios y comunas.
CABA está dividida en 15 comunas y 48 barrios superpuestos. En lugar de ingresar los datos del barrio, comuna, cantidad de parcelas y población por radio censal manualmente, se configurarán los campos cuyas propiedades se completarán automáticamente.
El primer paso es abrir las propiedades de la capa “areas_relevamiento”.
En la pestaña Formulario de atributos, seleccionar el campo que deseamos que sea rellenado automáticamente. Procedemos a indicar la expresión usando la función aggregate con el valor a determinar.
Campo comunas
La expresión para el campo comunas será la siguiente:
aggregate
(‘comunas’, ‘concatenate’, «comunas_t», intersects($geometry,geometry(@parent)), ‘, ‘ , «comunas») |
–función aggregate
–nombre de la capa –tipo de agregación –campo con valor de agregación –expresión de calculo –concatenador –ordenación de la concatenación
|
Esta expresión significa que queremos consultar la capa comunas y recuperar el valor del campo comunas_t. El agregado se calculará utilizando solo las características que pasan los criterios de filtro definidos en el parámetro de filtro.
- Definimos un filtro espacial para obtener solo la entidad que intersecta el polígono que acabamos de digitalizar.
- La expresión geometry(@parent) se refiere a la entidad digitalizada “areas_relevamiento” y $geometry se refiere a la geometría de las entidades de la capa de intersección “comunas”.
- Se debe marcar el recuadro de “Aplicar valor predeterminado al actualizar”.
Campo barrios
Repetiremos el proceso el campo barrios:
aggregate
(‘barrios’, ‘concatenate’, «barrio», intersects($geometry,geometry(@parent)), ‘, ‘, «comuna») |
–función aggregate
–nombre de la capa –tipo de agregación –campo con valor de agregación –expresión de calculo –concatenador –ordenación de la concatenación |
Esta expresión significa que queremos consultar la capa barrios y recuperar el valor del campo barrio. A
- Definimos un filtro espacial para obtener solo la entidad que intersecta el polígono que acabamos de digitalizar.
- Marcamos el recuadro de “Aplicar valor predeterminado al actualizar”.
Campo cant_parce
De nuevo se repite el proceso para el campo cant_parce:
aggregate
(‘parcelas’, ‘count’, «id», intersects($geometry,geometry(@parent)), ‘, ‘ ) |
–función aggregate
–nombre de la capa –tipo de agregación –campo con valor de agregación –expresión de calculo –concatenador |
Esta expresión significa que queremos consultar la capa parcelas y recuperar el valor de la cantidad de geometrías presentes mediante el campo id.
- Definimos un filtro espacial para obtener solo las entidades que intersectan el polígono que acabamos de digitalizar.
-
Marcamos el recuadro de “Aplicar valor predeterminado al actualizar”.
Campo poblacion
Por último, repetimos el proceso para el campo poblacion:
aggregate
(‘radios_censales’, ‘sum’, «tot_pob», intersects($geometry,geometry(@parent)), ‘, ‘ ) |
–función aggregate
–nombre de la capa –tipo de agregación –campo con valor de agregación –expresión de calculo –concatenador
|
Esta expresión significa que queremos consultar la capa radios_censales y recuperar la sumatoria de los valores presentes en el campo tot_pob.
- Definimos un filtro espacial para obtener solo las entidades que intersectan el polígono que acabamos de digitalizar.
- Marcamos el recuadro de “Aplicar valor predeterminado al actualizar”.
Como puede observarse, al finalizar la edición del polígono se generan automáticamente los valores para los campos poblacion, cant_parce, barrios y comunas a partir de configuración de completado automático.
Ejemplo Nº 2. Definición de Calle cercana frente a parcela digitalizada mediante restricción de nombre y cálculo de área de parcela
Con la capa de calles será de utilidad obtener del nombre de la calle enfrente en lugar de escribirlo manualmente y muchísimo mejor que el usuario pueda elegir el nombre desde las calles cercanas.
Vamos a las propiedades de la capa de parcelas_digitalizadas → pestaña Formularios de atributos.
Seleccionamos el campo calle_frente y elegimos en Tipo de Control → Relación de valores.
Podemos configurar este campo para buscar los nombres del atributo de calle en la capa de calles. El truco es ingresar una expresión de filtro espacial para seleccionar los caminos que están cerca de la geometría digitalizada. Con la siguiente expresión puedes obtener el valor del campo:
intersects($geometry, buffer(@current_geometry, 0.0005))
Adicionalmente se puede calcular el área de parcela digitalizada. Para ello, al igual que en el primer ejemplo, en la pestaña Formulario de atributos seleccionamos el campo área para que sea rellenado automáticamente indicando la expresión $area. Ésta se refiere al área a la entidad digitalizada “parcelas_digitalizadas”. Marcamos el recuadro de “Aplicar valor predeterminado al actualizar”.
Ahora, a medida que digitalizamos las parcelas, los nombres de las calles cercanas se rellenarán en el cuadro desplegable y se presentarán al usuario. De igual manera se autocompletará el área de la entidad digitalizada. Hay duplicados debido a que varios segmentos de línea de la misma calle están presentes dentro de la distancia de búsqueda.
Más información
Para obtener mayor información sobre la función aggregate en QGIS puedes visitar la documentación de QGIS – función aggregate.
Este documento es una versión en habla hispana mejorada del artículo del blog de Ujaval Gandhi.
Licenciado en Geografía. Máster en Sistemas de Información Geográfica. Consultor GIS desde el año 2004. En MappingGIS desde el año 2012 para ayudarte a impulsar tu perfil GIS y diferenciarte de la competencia. Echa un vistazo a todos nuestros cursos de SIG online.
Hola! Alguna idea de como hacer lo mismo en ArcGIS
Muchas Gracias por el aporte. Estuve dándole vueltas para adaptarlo en caso de querer tomar un valor único para un campo desde una capa en la que no coinciden todos los polígonos, en mi caso Parcelas en varias Parroquias . A mí me sirvió con la función centroide:
aggregate (‘Parroquias’, ‘max’, «PARROQUIA», intersects($geometry,centroid(geometry(@parent))))
Hola,
Me parece muy útil esta función. El problema que veo es que, siguiendo estos pasos, sólo se autorellena el campo en cuestión cuando introducimos una nueva entidad.
Hay alguna forma de hacer el mismo proceso (o similar) para entidades ya digitalizadas, para así evitar el uso de herramientas de geoproceso y generar nuevos archivos?
Gracias y un saludo!
Hola Gabriel, gusto en saludarte.
Si, hay una forma para hacer el mismo proceso con entidades ya digitalizadas. Los pasos son los siguientes:
1) Abrir la tabla de atributos de la entidad ya digitalizada
2) Abrir calculadora de campos desde la tabla de atributos
3) Dejando activo el recuadro de «Crear un campo nuevo» escribir en el recuadro al lado de «Nombre del campo de salida» el nombre del campo que se autorellenará con la función aggregate. Si el cálculo a realizar por la función aggregate es incorporar un dato tipo númerico con decimales, o una cadena de caracteres a partir de la entidad con la que hará los cálculos se deberá seleccionar el tipo del campo de salida que corresponda.
4) En el recuadro de expresión escribir la función aggregate con la cual se hará el autorelleno del campo indicado en el paso 3.
En este punto se podrá verificar luego de haber escrito correctamente la función aggregate en el recuadro de expresión la vista preliminar de la salida en la parte inferior del recuadro, este es un ejemplo de los posibles cálculos que hará el QGIS para autorellenar el campo.
5) Dar aceptar y esperar que el QGIS realice el cálculo para cada uno de los registros que contiene la entidad digitalizada versus la entidad con la que la función aggregate realiza los cálculos.
Al finalizar el proceso la entidad digitalizada el QGIS la habrá cambiado de manera automática a modo de edición, si el resultado del cálculo realizado por la función aggregate es correcto debemos guardar los cambios y terminar la edición.
De esta forma es que se puede autorellenar el campo de una entidad ya digitalizada.
Nota, por consultas que he recibido previamente por las redes en otros medios es importante que tanto la entidad digitalizada así como la entidad con la que la función aggregate realiza los cálculos deban tener la misma proyección, este es un error común que se comete y por ello en el paso 4 es probable que no vean en la vista preliminar de la salida ningún ejemplo del cálculo.
Por favor Gabriel, haz saber si estas indicaciones responden a tu consulta, quedamos atentos.
Saludos,
Excelente aporte. Saludos y felicidades por su blog, definitivamente uno de los mas interesantes en la comunidad de Geomática en español, espero no decaigan en ese empeño de compartir este tipo de aporte.
Hola Juan, Muchas gracias por tus palabras que nos ayudan a seguir trabajando!