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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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.... smile

Je vous remercie et vous souhaite une belle journée!


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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 smile

... 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 hmm

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... hmm

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... smile

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

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 smile

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 sad

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

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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 smile

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

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... big_smile

Hors ligne

 

#13 Tue 26 February 2019 11:11

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

Re: QGIS 2.18 ou 3.4: Clustering à partir d'un vecteur

Cerise45 a écrit:

Encore merci de m'avoir fait découvrir ce potentiel exceptionnel de géotraitements résumés dans une seule ligne... incroyable smile


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 smile


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 smile

Merci encore et bonne journée à toutes et tous !

Hors ligne

 

Pied de page des forums

Powered by FluxBB