banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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: 3938

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: 3938

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

SANTANNA a écrit:

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


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

 

Pied de page des forums

Powered by FluxBB