Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Printemps des cartes 2024

#1 Sun 23 February 2020 17:56

Frédéric Duhart
Juste Inscrit !
Date d'inscription: 22 Dec 2016
Messages: 9

QGIS: Calculatrice vecteur - valeur depuis une autre couche

Bonjour,

Je me demande si il est possible, depuis la calculatrice de champ d'une couche vecteur de récupérer la valeur d'un attribut d'une autre couche.
Par exemple, pour une couche de point, je voudrai pouvoir récupérer un attribut d'une entité polygone contenant ce point.

Je sais que la fonction 'Joindre les attributs par localisation' permet cela, mais est-il possible de le faire dans la calculatrice? et si oui comment?

merci!

Hors ligne

 

#2 Mon 24 February 2020 01:49

Julien81
Participant assidu
Lieu: Giroussens
Date d'inscription: 14 Jan 2019
Messages: 151

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Bonsoir,

\1ere méthode : un aggregat par la calculatrice permet cela et plus encore :

aggregate('DEPARTEMENT','max',"INSEE_DEP",intersects(centroid(geometry(@parent)),$geometry))

ici (totalement inutile mais à trnasposer), je suis sur une couche commune en màj sur un champ pour récupérer le code dep de ma couche DEPARTEMENT type admin express.
Il faut voir la couche commune, en mise à jour, comme ta couche de points (ici=centroid(geometry(@parent)), donc pour ton cas seulement geometry(@parent) car couche de points : ok pour intersects avec $geometry de 'DEPARTEMENT' (=ta couche de polygone "contenants"))
le $geometry dans le aggregate concerne la couche cible 'DEPARTEMENT' ; Je te renvoie sur la doc dans l'interface graphique pour les autres méthodes d'aggrégat ('concatenate','collect',...), mais ça devrait faire le taf, à adapter selon ton champs à récupérer et ta couche cible!
aggregate('couche_cible','methode_aggr',"champ_cible",expression filtre,..)

\2eme méthode : extension Refunction à installer, puis dans la calculatrice de champs dans onglet/groupe Reference, de nouvelles fonctionnalités  permettent de croiser deux couches et de récupérer les infos de l'une dans l'autre

Ou jointure spatiale en effet avec génération d'une nouvelle couche

Hors ligne

 

#3 Mon 24 February 2020 14:45

Frédéric Duhart
Juste Inscrit !
Date d'inscription: 22 Dec 2016
Messages: 9

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Merci,

Ca me parait très clair. je vais analyser tout cela.

Hors ligne

 

#4 Thu 16 April 2020 10:20

chanteclair
Participant assidu
Lieu: Pau
Date d'inscription: 3 Jan 2007
Messages: 717

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Bonjour à tous,
Je relance le sujet car j'ai un cas à peu près identique mais qui ne fonctionne qu'à moitié !
J'ai donc, sous format shape, une couche de points et une couche de communes.
Je souhaite renseigner dans la couche points, l'attribut "nom" avec le nom de la commune qui les contiennent.
J'ai donc utilisé la formule suivante :

Code:

 aggregate( 'communes','concatenate', "nom", intersects($geometry, geometry(@parent)))

où "communes" est le nom de ma couche de communes et "nom", l'attribut que je cherche à renseigner.
J'ai d'abord fait le test sur un extrait de données et cela a très bien fonctionné.
Or quand je veux le faire sur ma couche de points entière, je n'ai rien (même l'aperçu du résultat dans la calculatrice de champs ne renvoie que ", alors qu'avec l'extrait de la couche, je voyais bien apparaître un nom de commune).
J'en déduis qu'il me manque quelque chose, mais je ne vois pas quoi...
Merci de vos éclaircissements.
Cordialement.

Hors ligne

 

#5 Thu 16 April 2020 12:20

chanteclair
Participant assidu
Lieu: Pau
Date d'inscription: 3 Jan 2007
Messages: 717

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

J'ai, à tout hasard, installé les Reffunctions et ai testé

Code:

geomintersects('communes','nom')

depuis la calculatrice de champs et aucun résultat (ni erreur) non plus.

Hors ligne

 

#6 Thu 16 April 2020 13:48

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

L'utilisation d'aggregate et concatenate me semble inversée. Ce serait pertinent si vous vouliez créer une phrase pour chaque commune avec le nom des points qu'elle contient. Pas pour l'inverse. Là vous voulez une valeur unique. Pas besoin d'aggréger ni de concatener. Facile à faire en SQL, mais la syntaxe de la calculatrice de champs ne m'est pas familière. Je vais tenter de m'y pencher.

Dernière modification par carteq (Thu 16 April 2020 13:48)

Hors ligne

 

#7 Thu 16 April 2020 15:36

chanteclair
Participant assidu
Lieu: Pau
Date d'inscription: 3 Jan 2007
Messages: 717

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Je le fais de temps à autre en sql également, mais la contrainte de travailler avec des shapes fait que je me suis intéressé à cette fonctionnalité d’agrégat, dont je ne suis pas familier non plus.
Et là, je cherche, je cherche...
Le paramètre concatenate semble indispensable dans la fonction du même nom, c'est le seul qui semble capable de retourner une chaine.
Mais si vous trouvez, je suis preneur !!
Merci.

Hors ligne

 

#8 Thu 16 April 2020 16:21

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Concatenate est essentiel cas d'aggrégation, en effet. Mais là, aucun besoin d'aggréger.

Hors ligne

 

#9 Thu 16 April 2020 16:51

chanteclair
Participant assidu
Lieu: Pau
Date d'inscription: 3 Jan 2007
Messages: 717

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Quelle fonction utiliser alors ?
Si j'en crois cette vidéo (https://www.youtube.com/watch?v=aMEhdW6rvB4) je recherche une utilisation similaire non ?

Hors ligne

 

#10 Thu 16 April 2020 17:08

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

J'ai essayé :

aggregate( layer:='communes', aggregate:='concatenate', expression:="champ_nom_commune_dans_la_couche_de_communes",
               filter:=intersects( $geometry, geometry( @parent ) ) )

Ça fonctionne. J'ai testé 19000 entités. Ça prend un temps ridiculement long comparé au SQL.

Je me demande si votre expression "nom" n'est pas erroné dans votre essai mentionné plus haut ? Est-ce vraiment le nom du champ dans la couche commune ?

Je vais chercher quelque chose de plus direct que aggregate.

Hors ligne

 

#11 Thu 16 April 2020 17:14

chanteclair
Participant assidu
Lieu: Pau
Date d'inscription: 3 Jan 2007
Messages: 717

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Je viens de tester sur une autre couche de points et votre formule fonctionne. J'en déduis que c'était ma couche de test qui posait problème.
N'ayant qu'une centaine de points, le temps m'importe peu.
Merci de votre aide.
Cordialement.

Hors ligne

 

#12 Thu 16 April 2020 17:14

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Si j'en crois cette vidéo (https://www.youtube.com/watch?v=aMEhdW6rvB4) je recherche une utilisation similaire non ?


Dans la video, il y un lien de un-à-plusieurs. Dans votre cas, c'est un-pour-un : un point n'est que dans une commune. Rien à aggréger. Il faut juste aller chercher la valeur.

Hors ligne

 

#13 Thu 16 April 2020 17:32

chanteclair
Participant assidu
Lieu: Pau
Date d'inscription: 3 Jan 2007
Messages: 717

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Oui tout à fait. Mais si cela le fait pour plusieurs éléments à concaténer, on peut supposer que cela le fasse pour un seul.
Même s'il y a peut-être plus simple.

Dernière modification par chanteclair (Thu 16 April 2020 17:33)

Hors ligne

 

#14 Thu 16 April 2020 19:34

carteq
Participant assidu
Date d'inscription: 8 Mar 2008
Messages: 829

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

@parent :

Refers to the current feature in the parent layer, providing access to its attributes and geometry when filtering an aggregate function


Il semble qu'on ait pas le choix d'utiliser aggregate si on utilise @parent.

Dernière modification par carteq (Thu 16 April 2020 19:35)

Hors ligne

 

#15 Fri 17 April 2020 09:28

chanteclair
Participant assidu
Lieu: Pau
Date d'inscription: 3 Jan 2007
Messages: 717

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Merci pour ces précisions.
Cela fonctionne pour ce que j'ai à faire, je vais m'en satisfaire pour ces shapes à traiter ponctuellement.
Bonne journée

Hors ligne

 

#16 Sun 24 April 2022 08:48

rybaack
Juste Inscrit !
Date d'inscription: 23 Apr 2022
Messages: 1

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

bonjour,

J'aimerais croiser les geometries d'un shp polygone avec celle d'un shp ligne.

Il faudrait que j'attribue dans un nouvelle colonne de mon shp polygone, les linéaires(via : $length) de ligne contenue dans chaque geometrie de polygone.

Cela est t il possible par la calculatrice d'expression?

Hors ligne

 

#17 Thu 28 April 2022 15:32

shirosaki
Participant actif
Lieu: Lyon
Date d'inscription: 30 Mar 2018
Messages: 124

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

rybaack a écrit:

bonjour,

J'aimerais croiser les geometries d'un shp polygone avec celle d'un shp ligne.

Il faudrait que j'attribue dans un nouvelle colonne de mon shp polygone, les linéaires(via : $length) de ligne contenue dans chaque geometrie de polygone.

Cela est t il possible par la calculatrice d'expression?


Bonjour,
Dans un premier temps, quel version de Qgis utilisez vous ?
Si vous utilisez la 3.16, il faudra installer l'extension "array plus" (sur le gestionnaire de plugin)
Si vous avez la dernière version en date, pas la peine normalement.

Ensuite, aller sur votre couche polygone et via la calculatrice d'expression mettez une formule du genre :

Code:

array_sum(
overlay_within('nom_de_la_couche_ligne',$length)
)

attention, cette formule marche uniquement si vos deux couches sont dans le même système de projection

Dernière modification par shirosaki (Thu 28 April 2022 15:49)


Paul QUESNOT

Hors ligne

 

#18 Thu 28 April 2022 15:45

Robin.k
Participant occasionnel
Date d'inscription: 15 Mar 2022
Messages: 45

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Bonjour,

Pour les dernières versions de QGIS 3, la fonction est intégrée, exemple :

array_to_string(overlay_within('communes',insee ))
Pour récupérer l'attribut insee de la couche 'commune'.

Pour les versions précédentes, il faut installer l'extension refunction et utiliser ainsi la fonction geomwithin('communes',insee ).

S'il n'y a pas de résultats, plusieurs possibilités :

- Les couches n'ont pas le même système de projection

- L'attribut est mauvais ex : colonne formatée pour recevoir des nombres entiers alors qu'on essaye de mettre du texte.

- Plusieurs polygones se superposent, la fonction ne sait pas lequel prendre

- La formule est mauvaise, il faut remplacer within par touches ou nearest ou contains ou interstects selon l'opération spatiale voulue. (Mais dans votre cas ça devrait être within.

Bonne journée,

Dernière modification par Robin.k (Thu 28 April 2022 15:46)

Hors ligne

 

#19 Mon 08 April 2024 17:44

cyrille
Participant assidu
Date d'inscription: 7 Feb 2006
Messages: 385

Re: QGIS: Calculatrice vecteur - valeur depuis une autre couche

Bonjour, je reouvre le dossier.

Comment faire pour mettre dans une etiquette calculee ou une info bulle dynamique la longueur des polylignes contenues dans un departement ?
Ex longueur des lignes de chemin de fer par departement ?

j'a testé array_sum(
overlay_intersects ('PARIS_HENDAYE_L2E',$length)
)

Alors que ca fonctionne très bien avec des ponctuels dans un département :

aggregate(layer:= 'Immeuble_R_L2E', aggregate:= 'count', expression:= 'Immeuble_R_L2E',
filter:= contains(geometry(@parent), $geometry))


Merci de vos lumières.

Dernière modification par cyrille (Tue 09 April 2024 09:04)

Hors ligne

 

Pied de page des forums

Powered by FluxBB