#1 Thu 21 February 2019 10:59
- Cerise45
- Participant actif
- Date d'inscription: 31 Aug 2011
- Messages: 132
QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Bonjour à la communauté,
Cela fait un moment que je cherche une solution "simple" à mettre en oeuvre.
Mon input est une couche vecteur d'hexagones (en forme de nid d’abeilles). Chaque hexagone a une valeur qui lui est attribuée.
Ce que je cherche à savoir ? Pour chacun des hexagones, je cherche à faire la somme des valeurs des x hexagones contigus (qui entourent l'hexagone en 2 ou 3 anneaux autour.... ou dont l'hexagone est entièrement contenu x km autour du centroïde du-dit hexagone).
C'est en fait l'équivalent des statistiques focale mais en mode vecteur.
Pour mieux illustrer, en attaché : en orange l'hexagone concerné, le cercle en pointillé orange le rayon de x km, en jaune les hexagones entièrement inclus dans ce cercle. L'idée est ensuite de sommer ces valeurs et de les indiquer dans la table attributaire de l'hexagone en jaune.
J'ai tenté plusieurs choses :
- convertir en raster puis utiliser r.neighborhood de GRASS sous QGIS mais ce dernier algo n'a pas bien fonctionné (problème de projection semblerait-il ou parfois il ne fonctionne pas du tout quand je met un radius supérieur à 3... parfois le résultat ne s'affiche pas du tout : bref, pas convainquant).
- j'ai pensé à l'idée de développer un plugin qui ferait une boucle sur chaque hexagone puis une sélection spatiale (mais le plugin c'est un peu long à développer et surtout dans QGIS je ne sais pas vraiment si le type de sélection spatiale que je veux faire est implémentée dans un outil existant)
J'en appelle donc à vous pour tenter d'obtenir d'autres solutions....
Je vous remercie et vous souhaite une belle journée!
Hors ligne
#2 Thu 21 February 2019 12:21
- Renaud
- Membre
- Lieu: Ploemeur (56)
- Date d'inscription: 9 Mar 2006
- Messages: 2315
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Bonjour,
L'outil 'Outils généraux pour les vecteurs - Joindre les attributs par localisation (résumé)' répond presque à la question.
Comme il n'est pas possible de définir une relation spatiale de proximité (moins de x m de la cible), il faudra faire une zone tampon avant
Renaud Mouche
Hors ligne
#3 Thu 21 February 2019 12:31
- Cerise45
- Participant actif
- Date d'inscription: 31 Aug 2011
- Messages: 132
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Bonjour,
Merci de votre suggestion.
Le souci est que je souhaite faire ce processus en boucle : donc cela risque d'être gênant de faire autant de zones tampon que d'hexagones, et surtout ils sont se superposer ce qui voudrait dire qu'ensuite je devrai dire de faire une jointure des attributs par localisation mais en ne considérant uniquement LA zone tampon de l'hexagone concerné.... je ne sais pas si je peux implémenter ce process avec la fonction proposée par QGIS ?
Hors ligne
#4 Thu 21 February 2019 13:31
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Bonjour,
Tout simplement, créer un champ somme_atour_nid en champ virtuel dont l'expression dans le calculateur de champ est la suivante :
Code:
aggregate('nid_abeilles','sum',"nb_abeilles", filter:=touches($geometry, geometry(@parent)))
Et pour la méthode centroïde :
Code:
aggregate('nid_abeilles','sum',"nb_abeilles", filter:=within($geometry, buffer(centroid(geometry(@parent)),100000)))
Ou en plus "élégant" :
Code:
with_variable( 'distance', 100000, aggregate('nid_abeilles','sum',"nb_abeilles", filter:=within($geometry, buffer(centroid(geometry(@parent)),@distance))) )
geodata au cerema et petits billets en géomatique
Hors ligne
#5 Thu 21 February 2019 13:53
- Renaud
- Membre
- Lieu: Ploemeur (56)
- Date d'inscription: 9 Mar 2006
- Messages: 2315
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Joli !
Renaud Mouche
Hors ligne
#6 Fri 22 February 2019 13:07
- Cerise45
- Participant actif
- Date d'inscription: 31 Aug 2011
- Messages: 132
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Tout d'abord : Merci beaucoup MathieurR pour la suggestion du code ! En si peu de temps
... mais j'ai quelques petits soucis :
J'ai aussi regardé ce post que je viens de trouver : https://georezo.net/forum/viewtopic.php?id=106468 qui semble correspondre +/- à ce que je veux faire ...
Je ne sais pas si cette étape est utile dans mon cas... je ne pense pas, mais au cas où : J'ai d'abord créé une relation dans les propriétés de mon projet QGIS : entre ma couche et la même couche (avec l'ID) puisque je veux faire du clustering sur une seule couche.
J'ai ensuite testé votre troisième bloc de code, et voici ce que j'ai compris :
'nid_abeilles' : le nom de mon layer
'sum' : la fonction d'aggrégation que l'on veut utiliser
"nb_abeilles" : champ qui correspondait à la valeur de mon hexagone
Lors que je met la ligne de code dans le calculateur de champ : si je calcule dans un champ existant ou bien dans un champ virtuel, cela fonctionne mais me renvoie toujours la valeur 0
Suite à la lecture de cet article https://github.com/qgis/QGIS-Enhancemen … /issues/59, comme mon info se trouve dans 1 seul layer j'ai tenté mais sans succès (retourne la valeur 0) :
Code:
sum( "nb_abeilles" , filter:=within($geometry, buffer(centroid(geometry(@parent)),100000)))
Il a fonctionné avec juste
Code:
sum("nb_abeilles")
mais le filtre ne semble pas correct...
Pourtant, j'ai décortiqué cette partie :
Code:
within($geometry, buffer(centroid(geometry(@parent)),100000))
:
on a bien within(geometrie 1, geometrie 2)
soit :
une intersection entre : geometrie 1 > mon layer (mon hexagone)
& geometrie 2 > le centroide de mon hexagone auquel on a appliqué un buffer de 100 000 mètres. @parent ? hum... je ne vois pas
J'ai tenté ça, mais sans succès non plus :
Code:
sum( "nb_abeilles" , filter:=within($geometry, buffer(centroid($geometry),10000)))
Je bloque donc sur la partie de l'opération géométrique....
Je sollicite votre aide à nouveau...
Dernière modification par Cerise45 (Fri 22 February 2019 17:17)
Hors ligne
#7 Mon 25 February 2019 10:57
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3947
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Bonjour,
Je ne sais pas si cette étape est utile dans mon cas... je ne pense pas, mais au cas où : J'ai d'abord créé une relation dans les propriétés de mon projet QGIS : entre ma couche et la même couche (avec l'ID) puisque je veux faire du clustering sur une seule couche.
Non, vous n'avez pas besoin de créer une relation...
Aucun de vos exemples de code n'utilise les suggestions de Mathieu. Il utilise la (meta?)fonction "aggregate" tandis que vos exemples font directement usage de la fonction statistique concernée (sum). Réessayez donc avec la proposition de Mathieu.
Hors ligne
#8 Mon 25 February 2019 12:14
- Cerise45
- Participant actif
- Date d'inscription: 31 Aug 2011
- Messages: 132
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Bonjour SANTANNA,
Merci pour la confirmation qu'il n'y ait pas besoin de faire de relation. Je l'ai enlevée de mon projet.
Quand aux formules essayées, c'est vrai que cela ne correspondait pas tout à fait aux formules proposées par MathieuR mais j'étais gênée avec le 1er argument de la fonction (le nom de la couche si j'ai bien compris ?), ce qui m'a amenée à comprendre ce qui était proposé et à trouver encore d'autres liens.
J'ai testé dans tous les sens à vrai dire... en commençant par les propositions de MathieuR, mais comme cela ne fonctionnait pas de mon côté, j'ai testé d'autres choses
J'ai donc retesté :
Code:
aggregate('nom_de_mon_layer', 'sum', "nb_abeilles", filter:=within($geometry, buffer(centroid(geometry(@parent)),10000)))
Malheureusement, cette fonction dans le calculateur de champ me renvoie 0 dans toutes les lignes de mon shapefile...
Je ne comprends toujours pas ce qui ne fonctionne pas chez moi
Dernière modification par Cerise45 (Mon 25 February 2019 12:16)
Hors ligne
#9 Mon 25 February 2019 12:41
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3947
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
100 000 --> 10 000 erreur de recopie ici ou de saisie dans QGIS?
Ca fonctionne ici.
Hors ligne
#10 Mon 25 February 2019 12:44
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Bonjour,
Cette expression est bien à appliquer à la couche de grilles.
Voici en PJ un zip comprenant le projet QGIS et les données ayant servi à faire les tests. Pour modèle
geodata au cerema et petits billets en géomatique
Hors ligne
#11 Mon 25 February 2019 18:57
- Cerise45
- Participant actif
- Date d'inscription: 31 Aug 2011
- Messages: 132
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Un grand MERCI MathieuR (et les autres).
J'ai tenté sur QGIS 3 (au lieu de QGIS 2.18), ça prend du temps mais ça fonctionne !
Encore merci de m'avoir fait découvrir ce potentiel exceptionnel de géotraitements résumés dans une seule ligne... incroyable
Dernière modification par Cerise45 (Mon 25 February 2019 22:39)
Hors ligne
#12 Tue 26 February 2019 10:51
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3947
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Bonjour,
Encore merci de m'avoir fait découvrir ce potentiel exceptionnel de géotraitements résumés dans une seule ligne... incroyable smile
Faites attention: on peut y prendre goût très vite...
Hors ligne
#13 Tue 26 February 2019 11:11
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
Encore merci de m'avoir fait découvrir ce potentiel exceptionnel de géotraitements résumés dans une seule ligne... incroyable
J'ai découvert il y a peu tout le potentiel de la combinaison des aggregate + autres expressions
C'est vrai que c'est très puissant, sans compter que l'on peut aussi créer ses propres fonctions en python (voir http://www.qgistutorials.com/fr/docs/cu … ions.html)
Autant dire que le potentiel semble difficilement tarissable
Ravi d'avoir pu aider en tout cas. Ca m'a aussi permis de découvrir des choses
geodata au cerema et petits billets en géomatique
Hors ligne
#14 Tue 26 February 2019 13:43
- Cerise45
- Participant actif
- Date d'inscription: 31 Aug 2011
- Messages: 132
Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur
C'est sûr.... !
Je dirai que ça manque encore de tutoriels (ou au moins d'exemples) sur le net de ce côté là (comment construire la combinaison de requêtes python par exemple avec aggregate)... mais en tout cas j'y penserai la prochaine fois
Merci encore et bonne journée à toutes et tous !
Hors ligne