Setidaknya ada dua metode pengelompokan yang baik untuk PostGIS: k- berarti (melalui kmeans-postgresql
ekstensi) atau geometri pengelompokan dalam jarak ambang batas (PostGIS 2.2)
1) k- artinya dengankmeans-postgresql
Instalasi: Anda harus memiliki PostgreSQL 8.4 atau lebih tinggi pada sistem host POSIX (saya tidak tahu harus mulai dari mana untuk MS Windows). Jika Anda menginstal ini dari paket, pastikan Anda juga memiliki paket pengembangan (misalnya, postgresql-devel
untuk CentOS). Unduh dan ekstrak:
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/
Sebelum membangun, Anda perlu mengatur USE_PGXS
variabel lingkungan (posting saya sebelumnya diinstruksikan untuk menghapus bagian ini Makefile
, yang bukan pilihan terbaik). Salah satu dari dua perintah ini harus bekerja untuk shell Unix Anda:
# bash
export USE_PGXS=1
# csh
setenv USE_PGXS 1
Sekarang bangun dan instal ekstensi:
make
make install
psql -f /usr/share/pgsql/contrib/kmeans.sql -U postgres -D postgis
(Catatan: Saya juga mencoba ini dengan Ubuntu 10.10, tetapi tidak berhasil, karena jalurnya pg_config --pgxs
tidak ada! Ini mungkin merupakan bug pengemasan Ubuntu)
Penggunaan / Contoh: Anda harus memiliki tabel poin di suatu tempat (saya menggambar banyak poin pseudo acak di QGIS). Berikut ini adalah contoh dengan apa yang saya lakukan:
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;
yang 5
saya disediakan dalam argumen kedua dari kmeans
fungsi jendela adalah K integer untuk menghasilkan lima cluster. Anda bisa mengubahnya ke bilangan bulat apa pun yang Anda inginkan.
Di bawah ini adalah 31 poin acak semu yang saya gambar dan lima centroid dengan label yang menunjukkan jumlah di setiap cluster. Ini dibuat menggunakan query SQL di atas.
Anda juga dapat mencoba mengilustrasikan di mana cluster ini berada bersama 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 dalam jarak ambang batas dengan ST_ClusterWithin
Fungsi agregat ini disertakan dengan PostGIS 2.2, dan mengembalikan array GeometryCollections di mana semua komponen berada dalam jarak satu sama lain.
Berikut ini adalah contoh penggunaan, di mana jarak 100.0 adalah ambang batas yang menghasilkan 5 kelompok berbeda:
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;
Cluster tengah terbesar memiliki jari-jari lingkaran melingkar dari 65,3 unit atau sekitar 130, yang lebih besar dari ambang batas. Ini karena jarak individual antara geometri anggota kurang dari ambang, sehingga mengikatnya bersama sebagai satu cluster yang lebih besar.