#1 Thu 08 April 2021 10:23
- upriste
- Participant occasionnel
- Date d'inscription: 14 Feb 2019
- Messages: 48
QGIS 3.16: actualiser un champ depuis une autre couche
Bonjour,
J'ai une couche LOTISSEMENT et une couche LOTS
Dans un lotissement, il y a plusieurs lots.
Dans ma couche LOTS, j'ai plusieurs situations possibles : lot vendu, lot disponible. J'ai également un champs "surface".
Dans ma couche LOTISSEMENT, j'ai un champs "surface total vendu" et un champs "surface totale disponible". Je souhaiterais que ces 2 champs soient calculé automatiquement à partir des champs de la couche LOTS c'est à dire qu'il fasse la somme des surfaces des lots vendus et la somme des surfaces des lots disponibles.
Comment m'y prendre pour arriver à ce résultat. Merci par avance, Cordialement
Hors ligne
#2 Tue 13 April 2021 16:01
- upriste
- Participant occasionnel
- Date d'inscription: 14 Feb 2019
- Messages: 48
Re: QGIS 3.16: actualiser un champ depuis une autre couche
Bonjour,
Avez-vous des pistes à me fournir? Couche virtuelle? Base de données?
Hors ligne
#3 Tue 13 April 2021 19:36
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3946
Re: QGIS 3.16: actualiser un champ depuis une autre couche
Bonjour,
Dans un lotissement, il y a plusieurs lots.
Cette relation est spatiale ou attributaire?
Avez-vous des pistes à me fournir? Couche virtuelle? Base de données?
Vous pouvez effectivement générer une couche virtuelle pour générer le calcul mais si vous avez déjà cette piste en tête, il faudrait préciser ce qui vous empêche de passer au test.
Autrement, une autre piste est de créer un champ virtuel dans la couche lotissement, et d'utiliser la fonction agregate
Hors ligne
#4 Wed 14 April 2021 16:55
- upriste
- Participant occasionnel
- Date d'inscription: 14 Feb 2019
- Messages: 48
Re: QGIS 3.16: actualiser un champ depuis une autre couche
Bonjour SANTANNA, merci de m'avoir orienté.
La relation entre LOTISSEMENT et LOTS est spatiale. Les LOTS sont contenues dans un LOTISSEMENT.
Je n'ai pas essayé la couche virtuelle car je ne connais pas son fonctionnement. Je l'ai cité pour voir si cette solution pouvait être investiguée.
J'ai testé le champs virtuel et les fonctions agregate, j'y suis presque mais il me manque un élément. Je souhaite que les surfaces des LOTS soient aggrégés par LOTISSEMENT et selon la condition de la nature d'occupation (qui peut être soit occupé, soit libre)
J'imagine une formule de ce genre mais le group by ajouté à la fin ne fonctionne pas.
aggregate(layer:='lots',aggregate:='sum',expression:="surface",filter:="occupation"='libre') ,group_by="nom_lotissement"
Merci par avance de votre relecture.
Hors ligne
#5 Wed 14 April 2021 19:15
- antonio.andrade
- Participant occasionnel
- Date d'inscription: 9 Feb 2021
- Messages: 17
Re: QGIS 3.16: actualiser un champ depuis une autre couche
Bonjour,
Si vous créez deux couches de lots, lots vendus et lots disponibles, vous pouvez utiliser les expressions suivantes pour calculer les valeurs de deux champs virtuels de la couche des lotissements :
Code:
aggregate(layer:='lots vendus',aggregate:='sum', expression:="surface", filter:=contains(geometry(@parent), $geometry))
Code:
aggregate(layer:='lots disponibles',aggregate:='sum', expression:="surface", filter:=contains(geometry(@parent), $geometry))
Hors ligne
#6 Thu 15 April 2021 08:45
- upriste
- Participant occasionnel
- Date d'inscription: 14 Feb 2019
- Messages: 48
Re: QGIS 3.16: actualiser un champ depuis une autre couche
Merci Antonio. Tu me donnes une piste mais cela nécessite de séparer ma couche en plusieurs. Or j'ai simplifié en disant qu'il y avait 2 occurences possibles (dispo/non dispo), il pourrait y en avoir 4 ou 5. Du coup, cela ne m'arrange pas de séparer la couche, mais si je ne trouve pas de solution, je me tournerai vers la tienne.
Hors ligne
#7 Thu 15 April 2021 09:09
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3946
Re: QGIS 3.16: actualiser un champ depuis une autre couche
Bonjour,
Je pense que vous y étiez quasi. Le filtre fait en fait aussi office de groupe (bon, les chipoteurs me diront que c'est le aggregate qui groupe, OK). Donc ici on va filtrer à la fois sur ce qui est vendu, et sur ce qui est contenu dans le lotissement en cours. Essayez donc
Code:
aggregate(layer:='lots',aggregate:='sum',expression:="surface",filter:="occupation"='libre' and within( $geometry, geometry(@parent) ))
Par contre, il faudra bien s'assurer que les géométries des lots sont BIEN topologiquement contenues dans les lotissements. Et sinon, en partant sur votre code, et en supposant que les lots ont un champ nom_lotissement indiquant leur lotissement d'appartenance, ça pourrait donner (inspiré du dernier exemple de la doc)
Code:
aggregate(layer:='lots',aggregate:='sum',expression:="surface",filter:="occupation"='libre' and "nom_lotissement" = attribute(@parent,'champdelacouchelotissementcontenantleurnom'))
Vous l'aurez constaté, l'astuce dans ces expressions est dans le @parent qui fait ici référence au lotissement courant
Hors ligne
#8 Tue 20 April 2021 16:50
- upriste
- Participant occasionnel
- Date d'inscription: 14 Feb 2019
- Messages: 48
Re: QGIS 3.16: actualiser un champ depuis une autre couche
Bonjour,
Je pense que vous y étiez quasi. Le filtre fait en fait aussi office de groupe (bon, les chipoteurs me diront que c'est le aggregate qui groupe, OK). Donc ici on va filtrer à la fois sur ce qui est vendu, et sur ce qui est contenu dans le lotissement en cours. Essayez doncCode:
aggregate(layer:='lots',aggregate:='sum',expression:="surface",filter:="occupation"='libre' and within( $geometry, geometry(@parent) ))Par contre, il faudra bien s'assurer que les géométries des lots sont BIEN topologiquement contenues dans les lotissements. Et sinon, en partant sur votre code, et en supposant que les lots ont un champ nom_lotissement indiquant leur lotissement d'appartenance, ça pourrait donner (inspiré du dernier exemple de la doc)
Code:
aggregate(layer:='lots',aggregate:='sum',expression:="surface",filter:="occupation"='libre' and "nom_lotissement" = attribute(@parent,'champdelacouchelotissementcontenantleurnom'))Vous l'aurez constaté, l'astuce dans ces expressions est dans le @parent qui fait ici référence au lotissement courant
Bonjour Santanna,
Merci la 1ère option fonctionne mais pas la seconde. La seconde me calcule la somme totale des lots de l'ensemble des lotissements du territoire sans répartition par lotissement.
J'approndis un petit peu l'option 1
Dans cet exemple, est-il possible de définir plusieurs filtres. Du genre : filter:="occupation"='libre' OR "occupation"= "prochainement libre"...
aggregate(layer:='lots',aggregate:='sum',expression:="surface",filter:="occupation"='libre' and within( $geometry, geometry(@parent) ))
Je n'ai pas trouvé la manière de le formuler.
Dernière modification par upriste (Tue 20 April 2021 16:51)
Hors ligne