#1 Tue 22 November 2022 15:22
- Maury Gérard
- Participant occasionnel
- Date d'inscription: 19 Jun 2019
- Messages: 15
QGIS 3.22: Affectation automatique et intersection
Bonjour - J'utilise QGIS 3.22
J'ai une couche, polygone, "Commune" avec un attribut "Nom de commune".
J'ai une autre couche, ponctuelle, "Relevé-terrain', avec un attribut "Nom de commune".
Je voudrais, quand je créé une entité "Relevé-terrain", affecter automatiquement l'attribut "Nom de commune" de cette nouvelle entité par le nom de la commune sur laquelle il est créé.
Pour la partie "affectation automatique", je sais faire, c'est pour trouver l'entité "COMMUNE" qui contient le "relevé terrain" que je vous demande de l'aide.
Cordialement
Hors ligne
#2 Wed 23 November 2022 15:15
- GlaDal
- Participant assidu
- Date d'inscription: 30 Aug 2013
- Messages: 1092
Re: QGIS 3.22: Affectation automatique et intersection
Bonjour,
Dans les propriétés de la couche ponctuelle, rubrique 'formulaire d'attributs', sélectionnez votre champ 'Commune' et dans défauts saisissez l'expression suivante :
Code:
aggregate( layer:= 'Commune', aggregate:='max', expression:="NOM", filter:=intersects($geometry, geometry(@parent)) )
Ici, "NOM" correspond à la dénomination du champ qui comporte le nom des communes de la couche 'Commune'.
Cochez 'Appliquer la valeur par défaut sur la mise à jour'.
Hors ligne
#3 Wed 23 November 2022 15:32
- Maury Gérard
- Participant occasionnel
- Date d'inscription: 19 Jun 2019
- Messages: 15
Re: QGIS 3.22: Affectation automatique et intersection
Merci beaucoup, effectivement ca fonctionne exactement comme je l'imaginais.
Hors ligne
#4 Wed 23 November 2022 19:24
- Tixi
- Participant actif
- Date d'inscription: 6 Jun 2022
- Messages: 128
Re: QGIS 3.22: Affectation automatique et intersection
Je me suis connecte pour creer un nouveau message, je vais rebondir sur celui ci, vu qu il requiert un peu la meme technique.
J ai des zones de taille variable dans des communes, auxquelles je souhaite donner un nom. J utilise pour cela la couche lieu-dits, que j ai deja par ailleurs et qui provient du cadastre EDIGEO.
J ai utilise ceci pour nommer les zones :
aggregate(layer:='LIEUX-DITS',aggregate:='min',expression:="tex",filter:=intersects( $geometry, geometry(@parent)))
curieusement, min, max ca marche avec des lettres!!!!! Cependant, mes zones sont parfois grandes, ou a cheval sur plusieurs lieux dits, et le nom qui sort n'est pas toujours representatif de la localisation de la zone.
Avec concatenate, j ai tous les lieu-dits qui intersectent chaque zone, il faut corriger a la main, c est pas ideal.
Peut etre faire avec le lieu dit qui a la surface la plus grande dans la zone! Est ce que quelqu'un saurait comment faire, en une seule formule si possible?
A moins qu il n'y ait une autre piste.
Merci
Hors ligne
#5 Thu 24 November 2022 09:12
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS 3.22: Affectation automatique et intersection
Bonjour,
Peut etre faire avec le lieu dit qui a la surface la plus grande dans la zone! Est ce que quelqu'un saurait comment faire, en une seule formule si possible?
A moins qu il n'y ait une autre piste.
Désolé, pas trop le temps de pondre une formule dérivée de aggregate (ou array_agg d'ailleurs, et prendre le premier index de la liste triée) mais dans les versions récentes, overlay_intersects avec son option sort_by_intersection_size devrait être plus simple à écrire.
Hors ligne
#6 Sun 27 November 2022 15:09
- Tixi
- Participant actif
- Date d'inscription: 6 Jun 2022
- Messages: 128
Re: QGIS 3.22: Affectation automatique et intersection
Merci,
Overlay_intersects semble s'utiliser de la maniere suivante
array_to_string(array_sort((overlay_intersects('LIEUX-DITS',tex))))
avec array to string indispensable pour pouvoir concatener les elements. En effet, la version 2.28 offre de nouvelles options, dont le classement par surface d'intersection.
Pour ma part, j'ai un peu triche, j ai pris le lieu dit qui se trouve au centroide de chaque zone, ca elimine tous les lieux dits qui sont en bordure de zone. Ca a le merite d'etre simple.
aggregate(
layer:='LIEUX-DITS',
aggregate:='min',
expression:="tex",
filter:=intersects( $geometry, centroid(geometry(@parent))))
Hors ligne