Suite

Postgis : cluster/groupe de points en fonction de la distance

Postgis : cluster/groupe de points en fonction de la distance


Nous avons un ensemble de milliers de points et voulons regrouper tous ceux qui sont à moins de 100m les uns des autres (pour obtenir le centroïde de chaque groupe). Une première idée était de construire des tampons de 100 m autour de chaque point et d'unir/regrouper tous les polygones qui se croisent/se chevauchent en un seul (mais il peut aussi y avoir des polygones qui ne se chevauchent pas dans un cluster, voir capture d'écran) - après cela, nous pourrions simplement calculer le centroïde des polygones fusionnés. Mais je ne sais pas comment faire cela dans Postgis (dans QGIS, il existe un outil simple appelé "dissoudre" qui fusionne les polygones qui se chevauchent, mais nous voulons automatiser le processus)


Vous pouvez regrouper des points à l'aide de la requête récursive ou de la procédure PL/PLGSQL décrite dans les réponses à cette question. Il suffit de remplacerST_DDanspourST_Intersects/ST_Touches, le cas échéant.

Si vous êtes à l'aise d'essayer quelque chose d'expérimental, vous pouvez créer PostGIS avec des fonctions spécialement conçues pour résoudre ce problème : voir le ticket sur trac (code disponible sur github)

Mise à jour janvier 2016: Les fonctions "expérimentales" décrites ci-dessus ne sont plus expérimentales ;ST_ClusterDansetST_ClusterIntersectingsont disponibles dans PostGIS 2.2. Je recommande fortement PostGIS 2.2.1, qui inclut un correctif de performances très important pour ces fonctions.


Voir la vidéo: PostGIS Introduction presented by Paul Ramsey at STL PostGIS Day 2019