Pages: 1
- Sujet précédent - QGIS: Remplissage de champs selon intersection de couches - Sujet suivant
#1 Thu 08 July 2021 10:24
- conejo
- Participant assidu
- Lieu: Lunel
- Date d'inscription: 2 Dec 2005
- Messages: 1667
QGIS: Remplissage de champs selon intersection de couches
Bonjour,
Je cherche à remplir automatiquement un champ qui donne la valeur 'croisement' dans ma couche 'enedis' (nommée L_ENEDIS) si ma couche enedis (L_ENEDIS) croise un projet de ligne à très haute tension (Trace_preferentiel_com). Avec cette expression
CASE WHEN 'L_ENEDIS' intersects 'Trace_preferentiel_com' THEN 'croisement' END
Mais l'expression est invalide. Qu'y a-t-il à corriger?
Merci.
Hors ligne
#2 Thu 08 July 2021 12:44
- Miniopterine
- Participant assidu
- Date d'inscription: 29 Nov 2005
- Messages: 278
Re: QGIS: Remplissage de champs selon intersection de couches
Bonjour;
Ca serait pas plus simple d'utiliser reffunction?
Ou comme va certainement te le proposer Santanna ( un aggregate?
Je sais pas pourquoi le case when me gêne dans ce cas....
Hors ligne
#3 Thu 08 July 2021 15:27
- Sylvain M.
- Participant assidu
- Lieu: Saint-Pierre-des-Nids (53)
- Date d'inscription: 8 Sep 2005
- Messages: 994
Re: QGIS: Remplissage de champs selon intersection de couches
Ou en SQL si vous mettez vos données en BDD (PostGis ou SQLite/Spatialite) :
Code:
UPDATE L_ENEDIS l SET croisement = 'croisement' -- ou t.croisement FROM Trace_preferentiel_com t WHERE ST_Intersects(l.geom, t.geom);
Sylvain M.
Hors ligne
#4 Thu 08 July 2021 19:21
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3927
Re: QGIS: Remplissage de champs selon intersection de couches
Bonjour,
Mais l'expression est invalide. Qu'y a-t-il à corriger?
Votre code ne respecte pas la syntaxe habituelle des fonctions QGIS et surtout pas de la fonction intersects qui est intersects (geometrieA, geometrieB). Et dans le cas présent, si vous pouvez utiliser $geometry pour l'entité ENEDIS, vous ne pouvez passer la bonne géométrie de l'entité tracé vu que vous ne savez pas quel est le bon objet et que vous devez du coup balayer toute la couche trace pour vérifier si intersection il y a. Autrement dit, la fonction intersects n'est pas la réponse.
L'extension refFunctions fait effectivement l'affaire. Pour info l'extension refFunctions a été renforcée et intégrée dans les fonctions par défaut de QGIS: il s'agit des fonctions overlay_xxx. donc à privilégier.
Hors ligne
#5 Fri 09 July 2021 09:42
- aheurion
- Participant actif
- Lieu: NANTES
- Date d'inscription: 8 Oct 2020
- Messages: 143
Re: QGIS: Remplissage de champs selon intersection de couches
Bonjour conejo,
On peut utiliser la fonction aggregate (que j'affectionne particulièrement^^) :
Code:
aggregate( 'ID_de_la_couche_Trace_preferentiel_com', 'concatenate_unique', "croisement", intersects(buffer($geometry,0.01),geometry(@parent)), ';' )
En rentrant cette expression dans la valeur par défaut de ta colonne "croisement" dans la couche L_ENEDIS, ça mettra à jour directement la valeur à partir de la couche trace_preferentiel_com (à la création ou mise à jour d'une entité de la couche L_ENEDIS, pour mettre à jour les entités existantes tu peux utiliser la même expression dans la calculatrice de champs).
Je ne sais pas si overlay_intersects permet de récupérer le champs "croisement" dont tu as besoin mais j'ai l'impression que non, ça semble ne donner que vrai ou faux comme sortie.
PS : le buffer dans l'expression est important car QGis a tendance à ne pas comprendre quand des lignes s'interceptent en dehors des noeuds qui les constituent, j'ai déjà eu le cas précédemment
PS 2 : Si ton entité croise deux entités de la couche trace_preferentiel_com avec des valeurs de "croisement" différentes alors le résultat va être une concaténation de ces deux valeurs (Qgis ne va pas choisir à ta place celui qu'il faut garder). Si ce cas peut arriver chez toi, je te conseille de rajouter un CASE WHEN "croisement" is not null THEN "croisement" WHEN "croisement" is null THEN /l'expression ci-dessus/ END
Dernière modification par aheurion (Fri 09 July 2021 09:46)
Hors ligne
#6 Fri 09 July 2021 10:12
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3927
Re: QGIS: Remplissage de champs selon intersection de couches
Bonjour,
Je pensais que @conejo souhaitait remplir un champ "croisement" de la couche L_ENEDIS avec vrai ou faux lorsque croisement ou pas mais j'ai peut-être mal compris.
Je ne sais pas si overlay_intersects permet de récupérer le champs "croisement" dont tu as besoin mais j'ai l'impression que non, ça semble ne donner que vrai ou faux comme sortie.
selon la doc, il renvoie soit un booléen (vrai ou faux), soit un array (une "liste" de valeurs).
Hors ligne
Pages: 1
- Sujet précédent - QGIS: Remplissage de champs selon intersection de couches - Sujet suivant