#1 Tue 18 July 2017 16:06
- Jean-Marc68
- Participant occasionnel
- Lieu: Rimouski
- Date d'inscription: 24 Jan 2015
- Messages: 23
Points moyens nuages
Salut,
Soit une table de points dans PostGIS et qui est qui est affichée dans Quantum GIS via une vue.
Cette table contient des points relevés à différentes périodes. Bien entendu, de période en période, les relevez ne sont pas exactement à la même place. Quand un point a été relevé plusieurs (beaucoup) fois, ça devient vraiment fouilli dans QGIS (de belle "taches"), sans compter la lourdeur qui commence à se faire sentir.
Contrainte : garder tous les points dans la table (pour consultation).
Ce que je pense faire : Créer une vue dans PostGIS qui contiendrait des points moyens selon une distance. Disons qu'un point moyen serait calculé pour chaque nuage d'un rayon de 10cm. Ensuite, j'afficherais soit la vue des points moyens, soit la vue de tous les points selon l'échelle.
Mon problème : Comme vous vous en doutez, la SQL de la vue des points moyens. J'ai bien trouvé comment obtenir un point moyen d'une série de points (ST_CENTROID), mais je ne veux pas UN point moyen de toute la table. Je n'arrive pas à créer la SQL pour créer les points moyen de nuages différents (tous les points dans une rayon X) à partir de mon fichier global de points.
J'imagine que qqn a dû déjà se trouver face à ce problème et pourrait m'aider.
Merci de vos z'avis z'avisés.
Hors ligne
#2 Tue 18 July 2017 21:06
- cquest
- Participant assidu
- Date d'inscription: 6 Jan 2013
- Messages: 875
Re: Points moyens nuages
Il y a un identifiant commun au points à moyenner ? si oui, faire un GROUP BY dessus puis le ST_Centroid
si non... il va falloir jouer du cluster avec ST_ClusterWithin dans postgis
Christian Quest - https://amicale.net/@cquest sur Mastodon (terminé twitter/X)
Membre fondateur et porte parole d'OpenStreetMap France
Initiateur de opendatArchives, OpenEventDatabase, Panoramax
Hors ligne
#3 Wed 06 September 2017 16:25
- Jean-Marc68
- Participant occasionnel
- Lieu: Rimouski
- Date d'inscription: 24 Jan 2015
- Messages: 23
Re: Points moyens nuages
Merci de ta réponse cquest.
J'ai dû mal m'exprimer et je pense que ce que je n'ai pas pu faire comprendre ce que je cherche à faire.
Je vais essayer de le mettre en "image".
Soit une table contenant des points relevés dans des villes de France. Certaines villes contiennent beaucoup de points, d'autres n'en contiennent qu'un.
Admettons, pour l'image, qu'il y ait 1000 points à Marseille, 10.000 points à Paris, 5000 points à Renne, 1 point à Brest, 5000 points à Lyon, ...
Je ne tiens pas compte des autres données que les coordonnées.
Ce que je cherche à faire est dans PostGIS, une vue qui calculerait le point moyen d'un nuage d'un rayon défini (disons 50km de rayon pour l'image des points de France).
À ce que j'ai vu, ST_ClusterWithin part d'un point connu et retournerait tous les points qui sont dans le rayon donné. Pour chaque ville, il me semble (à moins que j'ai mal compris. Ce qui est tout à fait possible) qu'il retournerait un nuage autour de chaque point. Par exemple, pour Marseille j'aurais 1000 nuages avec sensiblement les mêmes points.
Or c'est l'inverse que je cherche. Je cherche à déterminer les nuages et à en calculer le point moyen.
Le ST_Centroid me retournerai le point moyen de chaque nuage, mais je n'arrive justement pas à déterminer les nuages.
En somme, je cherche à faire une requête requête pourrait déterminer qu'à Lyon il y a un nuage de points distants de moins de 50km, de même qu'à Paris, Marseille, etc ...
La requête retournait des ensembles de points (nuages) distants de moins de la tolérance (le 50km de l'exemple) à partir de la table des points de France. En entrée de requête j'aurais la table des points de France, et en sortie, chaque ligne représenterait un nuage de points. Par exemple une géométrie multipoint (par exemple) pour Marseille, une pour Paris, une pour Renne, une pour Brest et une pour Lyon.
Ainsi je pourrais applique un ST_Centroid sur chaque ligne et trouver le point moyen de chaque nuage.
Merci de votre aide.
Hors ligne
#4 Wed 06 September 2017 18:12
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: Points moyens nuages
Salut,
Je pense que st_clusterwithin est adéquate :
ST_ClusterWithin
Fonction d'agrégat -
Renvoie un tableau de GeometryCollections, où chaque GeometryCollection représente un ensemble de géométries séparées par pas plus que la distance spécifiée
A ceci près que selon la distance donnée en argument, il se peut que des points se retrouvent dans plusieurs nuages.
Dernière modification par tumasgiu (Wed 06 September 2017 18:14)
Hors ligne
#5 Wed 06 September 2017 18:21
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Points moyens nuages
Bonsoir,
Je pense que cquest a raison: regardez du coté de st_clusterWithin:
Ca construit un array de geometries qui sont a une distance données les unes des autres: le centroid de cette geometrie vous en donne le centre:
Code:
select st_centroid(unnest(st_clusterWithin(geometry, 2000))) from testpt;
Sur l'image: 35000 points sur des communes, "résumés" en 651 points, centres des clusters initiaux à 2km.
Nicolas
Hors ligne
#6 Wed 06 September 2017 21:11
- Jean-Marc68
- Participant occasionnel
- Lieu: Rimouski
- Date d'inscription: 24 Jan 2015
- Messages: 23
Re: Points moyens nuages
Merci beaucoup tumasgiu et Nicolas de la rapidité de votre réponse. Je n'avais visiblement pas compris la fonction ST_ClusterWithin.
En me basant sur l'exemple de de Nicloas, j'ai écris ma SQL mais je reçois le message
"ERREUR: la fonction st_clusterwithin(geometry, integer) n'existe pas
SQL state: 42883"
En effet je ne la trouve pas dans ma liste de fonctions.
Je viens de découvrir avec stupeur que ST_ClusterWithin nécessite PostGIS 2.2, or j'ai PostGIS 2.1.7
Il va falloir que je fasse une MAJ de mon PostGIS.
Encore merci de votre aide qui m'est précieuse.
Dernière modification par Jean-Marc68 (Wed 06 September 2017 21:24)
Hors ligne
#7 Thu 07 September 2017 07:59
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: Points moyens nuages
Bonjour,
Une autre solution consiste à calculer le barycentre d'un ensemble de points.
X = somme de 1 à n des (xi) divisé par n (idem Y).
Il suffit de définir l'ensemble en fonction d'une géométrie, d'un rayon, d'un tampon bref ce que l'on veut.
L'avantage de st_clusterwithin est de proposer une agrégation automatique à partir d'un rayon, mais comme le souligne Tumasgiu il est possible et même certain (en fonction du rayon) qu'un point appartienne à plusieurs grappes. Il faut noter aussi qu'il n'est pas possible a priori de récupérer les id des points "grappés", donc pas possible de remonter aux informations liées aux points.
Petite précision la formule donnée plus haut est en fait
G(X,Y) = (somme1àn (AiXi)/somme(Ai) , somme1àn (AiYi)/somme(Ai))
Où Ai sont les poids attribués aux points. (autre avantage de cette méthode).
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#8 Thu 07 September 2017 08:36
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: Points moyens nuages
Bonjour,Il faut noter aussi qu'il n'est pas possible a priori de récupérer les id des points "grappés", donc pas possible de remonter aux informations liées aux points.
Exact, mais on peut toujours joindre la table en comparant les géométries,
ce qui peut être relativement long quand celles-ci sont complexes.
Dernière modification par tumasgiu (Thu 07 September 2017 08:37)
Hors ligne
#9 Thu 07 September 2017 09:39
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Points moyens nuages
(sorry tomasgiu: j'ai envoyé ma réponse hier sans rafraîchir la page...)
Hors ligne
#10 Thu 07 September 2017 09:44
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: Points moyens nuages
Nicolas,
Pas de souci, mieux vaut 4 avis qu'un seul
Hors ligne