Je cherche un algorithme de clustering spatial pour l'utiliser dans la base de données compatible PostGIS pour les entités ponctuelles. Je vais écrire la fonction plpgsql qui prend la distance entre les points du même cluster en entrée. A la sortie, la fonction retourne un tableau de clusters. La solution la plus évidente consiste à créer des zones tampons à une distance spécifiée autour de l'entité et à rechercher des entités dans cette mémoire tampon. Si de telles fonctionnalités existent, continuez à créer un tampon autour d'eux, etc. Si de telles fonctionnalités n'existent pas, cela signifie que la construction du cluster est terminée. Peut-être y at-il des solutions intelligentes?
postgis
clustering
drnextgis
la source
la source
Réponses:
Il existe au moins deux bonnes méthodes de clustering pour PostGIS: k- moyen (via
kmeans-postgresql
extension) ou clustering de géométries situées à une distance seuil (PostGIS 2.2).1) k signifie avec
kmeans-postgresql
Installation: Vous devez avoir PostgreSQL 8.4 ou supérieur sur un système hôte POSIX (je ne saurais pas par où commencer pour MS Windows). Si vous avez installé ceci à partir de packages, assurez-vous de disposer également des packages de développement (par exemple,
postgresql-devel
pour CentOS). Télécharger et extraire:Avant de compiler, vous devez définir la
USE_PGXS
variable d'environnement (mon précédent message m'avait demandé de supprimer cette partie de l'Makefile
option qui n'était pas la meilleure des options). Une de ces deux commandes devrait fonctionner pour votre shell Unix:Maintenant, construisez et installez l'extension:
(Remarque: j'ai aussi essayé cela avec Ubuntu 10.10, mais pas de chance, car le chemin d'accès
pg_config --pgxs
n'existe pas! C'est probablement un bogue d'emballage Ubuntu)Utilisation / Exemple: Vous devriez avoir un tableau de points quelque part (j'ai dessiné un tas de points pseudo aléatoires dans QGIS). Voici un exemple avec ce que j'ai fait:
le
5
I fourni dans le deuxième argument de lakmeans
fonction window est le K entier pour produire cinq clusters. Vous pouvez changer ceci en tout entier que vous voulez.Ci-dessous se trouvent les 31 points pseudo aléatoires que j'ai dessinés et les cinq centroïdes avec l'étiquette indiquant le nombre dans chaque groupe. Cela a été créé en utilisant la requête SQL ci-dessus.
Vous pouvez également essayer d’illustrer où se trouvent ces clusters avec ST_MinimumBoundingCircle :
2) Clustering dans une distance seuil avec
ST_ClusterWithin
Cette fonction d'agrégat est incluse dans PostGIS 2.2 et renvoie un tableau de GeometryCollections où tous les composants sont distants l'un de l'autre.
Voici un exemple d'utilisation où une distance de 100,0 est le seuil qui résulte en 5 grappes différentes:
Le groupe central le plus grand a un cercle entourant le cercle de 65,3 unités, soit environ 130 unités, ce qui est supérieur au seuil. Cela s'explique par le fait que les distances individuelles entre les géométries des membres sont inférieures au seuil. Elles sont donc reliées comme un cluster plus grand.
la source
J'ai écrit une fonction qui calcule des groupes de caractéristiques en fonction de la distance qui les sépare et construit une coque convexe sur ces caractéristiques:
Exemple d'utilisation de cette fonction:
'poi' - nom de la couche, 'wkb_geometry' - nom de la colonne de géométrie, 'ogc_fid' - clé primaire de la table, 14000 - distance du cluster.
Le résultat de l'utilisation de cette fonction:
la source
geometry
colonne dans votre table, ne pas stocker lonlat séparément ni créer une colonne avec des valeurs uniques (ID).Jusqu'ici, le plus prometteur que j'ai trouvé est cette extension pour le clustering K-means en tant que fonction de fenêtre: http://pgxn.org/dist/kmeans/
Cependant, je n'ai pas encore réussi à l'installer.
Sinon, vous pouvez utiliser SnapToGrid pour la mise en grappe de base .
la source
Complétant la réponse @MikeT ...
Pour MS Windows:
Exigences:
Que vas tu faire:
cl.exe
compilateur pour générer une DLL avec unekmeans
fonction.Pas:
Ouvrez le
kmeans.c
dans n'importe quel éditeur:Après les
#include
lignes, définissez la macro DLLEXPORT avec:Mettez
DLLEXPORT
avant chacune de ces lignes:Ouvrez la ligne de commande Visual C ++.
En ligne de commande:
kmeans-postgresql
.SET POSTGRESPATH=C:\Program Files\PostgreSQL\9.5
Courir
Copier le
kmeans.dll
à%POSTGRESPATH%\lib
Exécutez maintenant la commande SQL dans votre base de données pour "CREER" la fonction.
la source
Voici un moyen d’afficher dans QGIS le résultat de la requête PostGIS donnée en 2) dans cette réponse
Comme QGIS ne gère ni les collectes de géométrie ni les types de données différents dans la même colonne de géométrie, j'ai créé deux couches, une pour les clusters et une pour les points en cluster.
Tout d'abord pour les clusters, vous n'avez besoin que de polygones, les autres résultats sont des points isolés:
Ensuite, pour les points en cluster, vous devez transformer les collectes de géométries en points multiples:
Certains points sont aux mêmes coordonnées, de sorte que l'étiquette pourrait être source de confusion.
la source
Vous pouvez utiliser la solution Kmeans plus facilement avec la méthode ST_ClusterKMeans disponible dans postgis à partir de 2.3 Exemple:
Le cadre de sélection des entités est utilisé comme géométrie de cluster dans l'exemple ci-dessus. La première image montre les géométries d'origine et la seconde est le résultat de la sélection ci-dessus.
la source
Solution de clustering ascendante à partir de Obtenir un cluster unique à partir d'un nuage de points de diamètre maximum dans Postgis, sans aucune requête dynamique.
et un type avec identifiant de cluster
Suivant la fonction de l'algorithme
Usage:
la source