Saya mencari algoritme pengelompokan spasial untuk menggunakannya dalam database yang mendukung PostGIS untuk fitur titik. Saya akan menulis fungsi plpgsql yang membutuhkan jarak antara titik-titik dalam cluster yang sama sebagai input. Pada fungsi output mengembalikan array cluster. Solusi yang paling jelas adalah membangun zona buffer yang ditentukan jarak di sekitar fitur dan mencari fitur ke buffer ini. Jika fitur tersebut ada maka teruslah membangun buffer di sekitar mereka, dll. Jika fitur tersebut tidak ada itu berarti pembangunan cluster selesai. Mungkin ada beberapa solusi pintar?
postgis
clustering
drnextgis
sumber
sumber
Jawaban:
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 dengan
kmeans-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:Sebelum membangun, Anda perlu mengatur
USE_PGXS
variabel lingkungan (posting saya sebelumnya diinstruksikan untuk menghapus bagian iniMakefile
, yang bukan pilihan terbaik). Salah satu dari dua perintah ini harus bekerja untuk shell Unix Anda:Sekarang bangun dan instal ekstensi:
(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:
yang
5
saya disediakan dalam argumen kedua darikmeans
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 :
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:
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.
sumber
Saya telah menulis fungsi yang menghitung kelompok fitur berdasarkan jarak di antara mereka dan membangun lambung cembung atas fitur ini:
Contoh menggunakan fungsi ini:
'poi' - nama layer, 'wkb_geometry' - nama kolom geometri, 'ogc_fid' - kunci utama tabel, jarak 14000-cluster.
Hasil menggunakan fungsi ini:
sumber
geometry
kolom di dalam tabel Anda, bukan untuk menyimpan lonlat secara terpisah dan membuat kolom dengan nilai unik (ID).Sejauh ini, yang paling menjanjikan yang saya temukan adalah ekstensi untuk pengelompokan K-means sebagai fungsi jendela: http://pgxn.org/dist/kmeans/
Namun saya belum berhasil menginstalnya.
Jika tidak, untuk pengelompokan kisi dasar, Anda bisa menggunakan SnapToGrid .
sumber
Melengkapi jawaban @MikeT ...
Untuk MS Windows:
Persyaratan:
Apa yang akan kamu lakukan:
cl.exe
kompiler untuk menghasilkan DLL dengankmeans
fungsi.Langkah:
Buka
kmeans.c
di editor mana saja:Setelah
#include
baris mendefinisikan makro DLLEXPORT dengan:Letakkan di
DLLEXPORT
depan setiap baris ini:Buka Visual C ++ Command Line.
Di baris perintah:
kmeans-postgresql
.SET POSTGRESPATH=C:\Program Files\PostgreSQL\9.5
Lari
Salin
kmeans.dll
ke%POSTGRESPATH%\lib
Sekarang jalankan perintah SQL di database Anda untuk "MENCIPTAKAN" fungsi.
sumber
Berikut adalah cara untuk menampilkan di QGIS hasil dari permintaan PostGIS yang diberikan dalam 2) di server ini
Karena QGIS tidak menangani pengumpulan geometri atau tipe data yang berbeda dalam kolom geometri yang sama, saya telah membuat dua lapisan, satu untuk cluster dan satu untuk poin-poin yang dikelompokkan.
Pertama untuk cluster, Anda hanya perlu poligon, hasil lainnya adalah poin kesepian:
Kemudian untuk titik berkerumun, Anda perlu mengubah koleksi geometri dalam multipoint:
Beberapa titik berada pada koordinat yang sama sehingga label dapat membingungkan.
sumber
Anda dapat menggunakan solusi Kmeans lebih mudah dengan metode ST_ClusterKMeans yang tersedia di postgis dari 2.3 Contoh:
Kotak pembatas fitur digunakan sebagai geometri klaster pada contoh di atas. Gambar pertama menunjukkan geometri asli dan yang kedua adalah hasil pilih di atas.
sumber
Solusi pengelompokan bawah ke atas dari Dapatkan satu kluster dari awan titik dengan diameter maksimum pada postgis yang tidak melibatkan kueri dinamis.
dan tipe dengan id cluster
Selanjutnya fungsi algoritma
Pemakaian:
sumber