Esistono almeno due buoni metodi di clustering per PostGIS: k -means (via kmeans-postgresql
extension) 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-devel
per 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 --pgxs
non 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' 5
ho fornito nel secondo argomento della kmeans
funzione 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.