La función aggregate() es quizás una de las expresiones más potentes que podemos usar en QGIS. Esta función es usada para devolver un valor agregado usando objetos espaciales de otra capa.
Su sintaxis es algo compleja si no la hemos usado antes. De forma simplificada, los parámetros que requiere son los siguientes:
aggregate('nombre la capa o su id',
'tipo de agregación: suma, recuento...',
'expresión o nombre de campo a agregar',
'filtro opcional de la expresión')
En la documentación oficial de QGIS puedes consultar todas sus opciones.
Ejemplo de uso de la función QGIS aggregate
Para mostrar el potencial de la función vamos a realizar una capa poligonal que representa los edificios o construcciones de la ciudad de Huelva. Los datos proceden de servicio de Catastro Inspire descargada con el complemento Spanish Inspire Catastral Downloader.

Cualquiera de las siguientes expresiones sería válida para obtener el valor agregado con el total de construcciones de la capa.
aggregate('construcciones','count','')
aggregate('construcciones','count', "fid")
aggregate(layer:='construcciones',aggregate:='count',
expression:="fid")

¿Necesitas ayuda?
Desde el Área de Sistemas de Información Geográfica y Desarrollo de Geoinnova, podemos ofrecer consultoría a entidades y empresas que necesiten implantar funciones complejas como aggregate o desarrollar flujos de trabajo orientados a sacarle el máximo partido a QGIS a nivel corporativo.
Uso de datos estadísticos en la función aggregate
El listado de opciones de la función es muy variado incluyendo cálculos estadísticos (recuento, máximo, mínimo, desviación estándar…), datos concatenados o matrices de datos (arrays).
Consultaremos el campo que almacena la superficie declara (value) en metros cuadrados para ver código con información estadística.
aggregate('construcciones','max', "value")
aggregate('construcciones','mean', "value")
Ya que la capa contiene el total de unidades dentro del edificio clasificadas como viviendas, usamos la opción sum para su consulta.
aggregate('construcciones','sum', "num_viviendas"))
Filtros por atributos para la función avanzada de QGIS aggregate
Con los filtros podemos hacer más complejas las expresiones anteriormente vistas. Volvemos a finarnos en la expresión anterior para recuento de construcciones, pero en esta ocasión, la modificaremos para obtener solo de aquellas cuyo uso predominante es el residencial.
aggregate('construcciones','count', "fid",
"uso_predominante" like '1_residential')
aggregate(layer:='construcciones',aggregate:='count',
expression:="fid", filter:="uso_predominante" like '1_residential')
Y ahora, jugando con el atributo de la superficie, queremos ver solo aquellas construcciones residenciales con área mayor a 10000 metros cuadrados.
aggregate(layer:='construcciones',aggregate:='count',
expression:="fid",
filter:="uso_predominante" like '1_residential' and "value" > 10000 )

Agregaciones basadas en operaciones espaciales
Al igual que hemos definido filtros basados en atributos, podemos añadir en la consulta criterios espaciales.
En nuestro proyecto contamos con una capa poligonal con la delimitación barrios de los barrios onubenses del DERA. Gráficamente la capa de barrios no cubre todas las construcciones. Esto nos puede servir para ver un ejemplo de filtro espacial. Necesitamos saber por ejemplo cuántas construcciones intersectan con la capa de barrios.
aggregate(layer:='buildings',
aggregate:='count',expression:=$id,
filter:=intersects( $geometry, geometry(@parent) ) )

Uso de agregaciones en campos dinámicos de QGIS
Si añadimos un nuevo campo a la capa de barrios, y actualizamos sus datos usando la expresión anterior, podríamos ir enriqueciendo la capa con nueva información relacionada.

¿Qué ocurriría si actualizáramos la capa construcciones con nuevas edificaciones? Con el ejemplo que hemos vistos la información estaría desactualizada y deberíamos volver a actualizarla aplicando de nuevo la expresión.
Una alternativa a este tema consiste en el uso de la expresión en un campo virtual. En la captura se puede apreciar cómo sacamos partido a los campos calculados en un etiquetado complejo de barrios que se actualiza cuando modificamos el uso de las edificaciones.

Usar la función aggregate como valor por defecto en QGIS para nuevos elementos
Vamos a terminar esta serie de ejemplos con otra posibilidad de manejo de la función aggregate. Podemos integrar una expresión para que sea usada como valor por defecto cuando creemos nuevos elementos.
Supongamos que gestionamos una capa de obras en vía pública (saneamiento, fibra, arreglo de acerado…) Queremos que al dibujar el tramo de la obra se almacene por defecto los datos de todos las calles afectadas a una distancia de 10 metros.

Nuestra función de agregación será la siguiente:
aggregate(layer:='viales',aggregate:='concatenate',
expression:=to_string("id_vial"),
filter:=intersects($geometry, buffer(geometry(@parent),10)) ,
concatenator:=',')
La opción de la función será ‘concatenate’ que usaremos para guardar todos los códigos de vías separados por como que intersecten con un buffer de 10 metros de la obra.
Añadiremos la función como valor por defecto en el control del formulario del campo correspondiente.

Gracias a esta configuración, cada vez que creemos o actualicemos un tramo de obra se salvarán en la tabla todos los códigos de vías afectados.

Conclusión
Con estos sencillos ejemplos hemos querido mostrar algunos opciones de la aplicación de la función avanzada de QGIS aggregate.
Si estáis interesados en profundizar más en el uso profesional de expresiones con QGIS podéis consultar el temario de nuestro curso de QGIS Avanzado.
Hola. Gracias por tu articulo.
Sabría como calcular la suma de las áreas de polígonos dentro de polígonos más grandes de otra capa?
La función de unir atributos por localización (resumen) no me funciona correctamente puesto que me arroja datos erróneos y con la función de agregados no consigo hacer que esa suma de polígonos menores aparezca en la tabla de atributos de los polígonos con mayor tamaño. Un saludo.
Saludos Javier,
Es complicado hacerse una composición de lugar de un planteamiento a partir una breve descripción. Con esto quizás la opción que te podamos plantear no sea la correcta.
¿Porqué no asignar el código del área superior a las áreas menores y a partir de ahí realizar los cálculos? Esto supone al menos tener estas dos capas.
Te recomiendo también pasarte por el grupo de usuarios de QGIS España. Allí podrás exponer con más detalle tu consulta. Compartimos el enlace Grupo Telegram QGIS España
Buen articulo. Aclara muy bien las premisas básicas con las que se construye la función aggregate
Nos alegra que te haya sido de utilidad. Las posibilidades son sin duda enormes.
En respuesta del lector desagradable, siento decirle que esto es una entrada de blog, no una clase maestra, si quisiera aprender en profundidad para eso te enlazan al curso de QGIS avanzado. En general, asi funciona el marketing en internet (nadie te va a regalar nada). A pesar de ello, aporta muy buenos ejemplos para aplicarlos con la función aggregate, lo cual es de mucho agradecer.
Saludos
Buenos días:
Siento ser desagradable y comentar lo que sigue, pero es la sensación que me queda tras la lectura del Artículo.
No es lo mismo un profesor que un maestro. Un profesor enseña; un maestro hace fácil lo difícil. Ud. ha hecho lo primero: ha enseñado lo que sabe, pero no ha conseguido, desde mi humilde punto de vista, transmitir sus conocimientos para que el lector aprenda.
En estos casos suelo poner el ejemplo del profesor de Arte ingles Gombrich. El manual de Historia del Arte parece escrito por ángeles (hace fácil lo difícil); en ese caso Gombrich hace de maestro. Aunque si toma ud. otros manuales del mismo profesor, verá que puede hace de árido profesor.
Volviendo a lo nuestro, hecho en falta en el Artículo una redacción más de maestro que de profesor.
Atentamente,
Saludos,
Cualquier opinión que nos ayude a mejorar nuestros contenidos son bienvenidas. Tendremos en cuenta sus comentarios para próximas publicaciones.
Gracias.
Buenos días.
Me gustaría participar en esta opinión que ud. profiere, dado que pienso debería de aclararse un punto importante al respecto…
Ud. se apoya en la transmisión de conocimientos para justificar la diferencia entre maestros y profesores. Si nos ceñimos única y exclusivamente a este punto, me gustaría comentarle que para que toda transmisión (de conocimientos o de cualquier otra cosa) sea efectiva, debe de existir un emisor, un receptor y un medio de transmisión.
Teniendo en cuenta que la duda o la crítica se hace sobre el emisor y entiendo que por ende sobre el medio de transmisión (en este caso el lenguaje utilizado, su forma de uso en un contexto concreto y por otro lado, el uso de un artículo de un blog), deja al margen de ella la valoración de la capacidad del receptor para recibir correctamente el mensaje transmitido.
Entonces, habría que preguntarse por un lado si este blog es un medio válido para llevar a cabo la actividad de un maestro (tal y como ud. lo entiende) y si de los receptores de dicho blog, tienen la capacidad/aptitud de entender correctamente los contenidos del artículo.
Hay que contar, que tal y como podemos ver, el contenido de este artículo es de tipo técnico, especialista y de un nivel avanzado… luego el lector final, deberá de disponer de dicha cualificación para asimilar el contenido adecuadamente, dado que no es un artículo generalista, que esté al alcance de cualquier persona.
A modo de conclusión, tras exponer lo anterior, pienso que evidentemente los blogs no son medios aptos para llevar a cabo la actividad de maestro tal y como ud. sugiere y que además, dependerá de la cualificación y aptitud del receptor para conseguir que se produzca una adecuada transmisión de conocimientos.
Valga aclarar también, que no es responsabilidad del emisor que el receptor carezca de estas aptitudes y cualificaciones previas, al igual que no es responsabilidad del receptor que el emisor carezca de las habilidades suficiente para poder llevar a cabo una transferencia de conocimiento con garantías de éxito (que entiendo que es de lo que ud. se queja).
Dicho esto, creo que ud. se equivoca al afirmar con tal rotundidad que el artículo no consigue el objetivo marcado por culpa del emisor (redactor del artículo), dado que si lo valoramos adecuadamente, existen ciertas dudas sobre la capacidad del resto de los elementos intrínsecos a toda comunicación, el medio sobre el que está publicado y el propio receptor.
Con ánimo de construir y no de ofender a nadie.
Un saludo
Buenos días:
Deduzco por su forma de escribir, que es Ud. bastante más joven que yo. Consecuentemente no ha alcanzado, aún, la edad para comprender, en su justo término, el significado de lo que dice afirmo yo contundentemente. ¡Por supuesto, porque estoy de vuelta de muchas cosas! Cuando uno llega a una cierta edad, se desembaraza de todo lo accesorio y se queda con lo esencial. Y por la edad se sabe cuándo un texto es bueno o malo para aprender. Y todo lo que Ud. a desgranado y desarrollado acertadamente, es todo lo que yo he dejado de lado, como accesorio, por edad, a la hora de responder.
Y no cuestiono al autor ni su capacidad profesional, si no la forma en que lo ha escrito. Es más, si no me hubiera gustado, no lo hubiera leído tal vez. Por eso mismo digo que “hecho en falta en el Artículo una redacción más de maestro que de profesor”. ¿Quizá porque intuyo que es capaz de ello?
En cuanto al blog, como formato, en mi modesta opinión, es uno de esos escasos espacios de Internet aún poco contaminados. Y aquí sí que puedo estar errando por la edad, pero me sigue atrayendo con interés. Es más, soy un habitual de ellos.
Para finalizar le pondré otro ejemplo parecido a Gombrich. En este caso al español Antonio Quilis, Doctor en Filosofía y Letras, especializado en fonética y un monstruo de la fonética judicial. Sus obras de fonética son, en verdad, difíciles de digerir… por decir algo; ahora bien, si toma Ud. lo que escribió, por ejemplo, para los alumnos de UNED y pensar que hablamos de la misma persona se hace duro.
Así que, intuyo –repito– que el autor del Artículo del que tratamos es capaz de desmenuzar la información para el general de los lectores. Si no lo creyera, no me habría molestado en responder. Como ve, son diferentes enfoques sobre la misma cuestión,
Atentemente,