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é ?

#1 Thu 08 July 2021 10:24

conejo
Participant assidu
Lieu: Lunel
Date d'inscription: 2 Dec 2005
Messages: 1663

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 (wink 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: 993

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

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

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

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

 

Pied de page des forums

Powered by FluxBB