Esistono almeno due buoni metodi di clustering per PostGIS: k -means (via kmeans-postgresqlextension) o geometrie di clustering entro una distanza di soglia (PostGIS 2.2)
1) k- significa conkmeans-postgresql
Installazione: è necessario disporre di PostgreSQL 8.4 o versione successiva su un sistema host POSIX (non saprei da dove iniziare per MS Windows). Se hai installato questo dai pacchetti, assicurati di avere anche i pacchetti di sviluppo (ad esempio, postgresql-develper CentOS). Scarica ed estrai:
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/
Prima di creare, è necessario impostare la USE_PGXS variabile di ambiente (il mio post precedente mi ha indicato di eliminare questa parte del Makefile, che non era la migliore delle opzioni). Uno di questi due comandi dovrebbe funzionare per la tua shell Unix:
# bash
export USE_PGXS=1
# csh
setenv USE_PGXS 1
Ora compila e installa l'estensione:
make
make install
psql -f /usr/share/pgsql/contrib/kmeans.sql -U postgres -D postgis
(Nota: ho provato anche questo con Ubuntu 10.10, ma senza fortuna, poiché il percorso pg_config --pgxsnon esiste! Questo è probabilmente un bug di packaging di Ubuntu)
Utilizzo / Esempio: dovresti avere una tabella di punti da qualche parte (ho disegnato un sacco di punti pseudo casuali in QGIS). Ecco un esempio di quello che ho fatto:
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;
l' 5ho fornito nel secondo argomento della kmeansfunzione finestra è il numero intero K per produrre cinque cluster. Puoi cambiarlo con qualsiasi numero intero desideri.
Di seguito sono riportati i 31 punti pseudo casuali che ho disegnato ei cinque centroidi con l'etichetta che mostra il conteggio in ciascun cluster. Questo è stato creato usando la query SQL sopra.

Puoi anche tentare di illustrare dove si trovano questi cluster con 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 entro una distanza di soglia con ST_ClusterWithin
Questa funzione aggregata è inclusa in PostGIS 2.2 e restituisce una matrice di GeometryCollections in cui tutti i componenti si trovano a una distanza l'uno dall'altro.
Ecco un esempio di utilizzo, in cui una distanza di 100,0 è la soglia che risulta in 5 diversi cluster:
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;

Il cluster centrale più grande ha un raggio di circolo chiuso di 65,3 unità o circa 130, che è più grande della soglia. Questo perché le singole distanze tra le geometrie dei membri sono inferiori alla soglia, quindi la lega insieme come un cluster più grande.