#1 Mon 21 February 2022 17:04
- sylvainSIG
- Participant assidu
- Lieu: Moissac
- Date d'inscription: 29 Nov 2018
- Messages: 265
QGIS: Aggregate functions
Bonjour,
Je cherche à créer un atlas par commune des routes. Pour chaque planche j'aimerais que la donnée de la longueur totale se mette à jour automatiquement. j'ai découvert la fonction aggregate, mais je ne sais pas trop l'utiliser.
Pour le moment j'ai ça, avec deux couches, une avec les voies l'autre avec les contours administratifs.
Code:
"insee" || ' - ' || "nom" || ' - ' || '\n' || aggregate(layer:='voie', aggregate:='sum', expression:="calcul_longueur", filter:="calcul_insee")
"insee' fait référence à l'insee situé sur la couche commune,
"calcul_insee" fait référence à l'insee situé sur la couche des voies,
En l'état, l'expression me renvoie la somme de toutes les voies, toute commune confondu. Moi je veux juste la somme de l'entité de l'atlas.
Merci pour votre aide, Sylvain
Hors ligne
#2 Tue 22 February 2022 09:12
- shirosaki
- Participant actif
- Lieu: Lyon
- Date d'inscription: 30 Mar 2018
- Messages: 125
Re: QGIS: Aggregate functions
Bonjour, dans votre formule le code est incomplet.
Vous avez mis un filtre, mais pas de condition, du coup par défaut, la formule va filtrer les valeurs ou "calcul_insee" est nul.
Il faut donc rajouter une condition du type "calcul_insee" = '07xxx'
Sauf que vous ne pouvez pas appeler un champ de la couche 'parente' dans la formule aggregate comme cela, il faut utiliser une formule du genre
Code:
attribute(@parent,'insee')
votre formule doit donc ressembler à cela :
Code:
"insee" || ' - ' || "nom" || ' - ' || '\n' || aggregate(layer:='voie', aggregate:='sum', expression:="calcul_longueur", filter:="calcul_insee" = attribute(@parent,'insee') )
Paul QUESNOT
Hors ligne
#3 Wed 23 February 2022 08:54
- sylvainSIG
- Participant assidu
- Lieu: Moissac
- Date d'inscription: 29 Nov 2018
- Messages: 265
Re: QGIS: Aggregate functions
Merci :-)
Cette formule redescend un nombre décimal avec un nombre interminable de chiffres après la virgule. Comment faire pour réduire ?
aggregate(layer:='voie', aggregate:='sum', expression:="calcul_longueur", filter:="calcul_insee" = attribute(@parent,'insee')
J'ai essayé to_int(29.4554), le résultat est 22 (?). Y a t il une fonction de troncature ?
Merci
Sylvain
Hors ligne
#5 Wed 23 February 2022 09:42
- sylvainSIG
- Participant assidu
- Lieu: Moissac
- Date d'inscription: 29 Nov 2018
- Messages: 265
Re: QGIS: Aggregate functions
La formule à rallonge renvoie 29.1466666, et le round la-dessus renvoie 22.... Un bug de qgis ? une mauvaise utilisation de round ?
Hors ligne
#6 Wed 23 February 2022 10:04
- mfangain
- Participant actif
- Date d'inscription: 12 Jun 2012
- Messages: 88
Re: QGIS: Aggregate functions
Peut-être que le résultat de "aggregate" n'est pas un nombre mais du texte?
Essayer peut-être avec quelquechose du genre : round(to_real(formulearallonge),0)?
Une autre solution serait d'arrondir directement le champ au départ avant aggrégation, même ça peut peut-être arriver à un résultat légèrement différent au final. avec ...,expression:=round("calcul_longueur",0),...
Hors ligne
#7 Wed 23 February 2022 14:40
- sylvainSIG
- Participant assidu
- Lieu: Moissac
- Date d'inscription: 29 Nov 2018
- Messages: 265
Re: QGIS: Aggregate functions
Pour finir, je suis resté en mètre plutôt qu'en kilomètre et ça marche
Merci
Sylvain
Hors ligne
#8 Wed 23 February 2022 21:55
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3939
Re: QGIS: Aggregate functions
Hello,
La formule à rallonge renvoie 29.1466666, et le round la-dessus renvoie 22
Fausse alerte ou toujours avéré? Version de QGIS? Je viens d'essayer sur QGIS 3.23 round(29.1466666) et ça me renvoie bien 29.
Hors ligne