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 aveckmeans-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:
wget http://api.pgxn.org/dist/kmeans/1.1.0/kmeans-1.1.0.zip
unzip kmeans-1.1.0.zip
cd kmeans-1.1.0/
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:
# bash
export USE_PGXS=1
# csh
setenv USE_PGXS 1
Maintenant, construisez et installez l'extension:
make
make install
psql -f /usr/share/pgsql/contrib/kmeans.sql -U postgres -D postgis
(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:
SELECT kmeans, count(*), ST_Centroid(ST_Collect(geom)) AS geom
FROM (
SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
FROM rand_point
) AS ksub
GROUP BY kmeans
ORDER BY kmeans;
le 5
I fourni dans le deuxième argument de la kmeans
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 :
SELECT kmeans, ST_MinimumBoundingCircle(ST_Collect(geom)) AS circle
FROM (
SELECT kmeans(ARRAY[ST_X(geom), ST_Y(geom)], 5) OVER (), geom
FROM rand_point
) AS ksub
GROUP BY kmeans
ORDER BY kmeans;
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:
SELECT row_number() over () AS id,
ST_NumGeometries(gc),
gc AS geom_collection,
ST_Centroid(gc) AS centroid,
ST_MinimumBoundingCircle(gc) AS circle,
sqrt(ST_Area(ST_MinimumBoundingCircle(gc)) / pi()) AS radius
FROM (
SELECT unnest(ST_ClusterWithin(geom, 100)) gc
FROM rand_point
) f;
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.