Diberikan sampel besar (~ 1 juta) dari poin yang tidak terdistribusi secara merata - apakah mungkin untuk menghasilkan grid tidak teratur (dalam ukuran, tetapi juga bisa berbentuk tidak teratur jika itu mungkin?) Yang akan berisi jumlah minimum n poin yang ditentukan ?
Itu kurang penting bagi saya jika 'sel' yang dihasilkan dari kisi-kisi tersebut mengandung tepat n jumlah poin atau setidaknya n poin.
Saya mengetahui solusi seperti genvecgrid di ArcGIS atau Create Grid Layer di QGIS / mmgis namun mereka semua akan membuat grid biasa yang akan menghasilkan output dengan sel kosong (masalah yang lebih kecil - saya bisa dengan mudah membuangnya) atau sel dengan jumlah poin kurang dari n (masalah lebih besar karena saya membutuhkan solusi untuk menggabungkan sel-sel tersebut, mungkin menggunakan beberapa alat dari sini ?).
Saya sudah googling di sekitar tetapi tidak berhasil dan saya terbuka untuk solusi komersial (ArcGIS & ekstensi) atau gratis (Python, PostGIS, R).
sumber
Jawaban:
Saya melihat MerseyViking merekomendasikan quadtree . Saya akan menyarankan hal yang sama dan untuk menjelaskannya, inilah kode dan contohnya. Kode ditulis
R
tetapi harus dengan mudah port ke, katakanlah, Python.Idenya sangat sederhana: pisahkan titik kira-kira setengah dalam arah x, kemudian secara rekursif membagi dua bagian sepanjang arah y, bergantian arah di setiap level, sampai tidak ada lagi pemisahan yang diinginkan.
Karena tujuannya adalah untuk menyamarkan lokasi titik yang sebenarnya, ada baiknya untuk memasukkan beberapa keacakan ke dalam pemisahan . Salah satu cara sederhana cepat untuk melakukan ini adalah dengan membagi pada set kuantil jumlah acak kecil menjauh dari 50%. Dengan cara ini (a) nilai-nilai pemisahan sangat tidak mungkin bertepatan dengan koordinat data, sehingga poin akan jatuh secara unik ke dalam kuadran yang dibuat oleh partisi, dan (b) koordinat titik tidak mungkin untuk merekonstruksi secara tepat dari quadtree.
Karena tujuannya adalah untuk mempertahankan jumlah minimum
k
node dalam setiap daun quadtree, kami menerapkan bentuk quadtree terbatas. Ini akan mendukung (1) pengelompokan poin ke dalam kelompok yang memiliki antarak
dan 2 *k
-1 elemen masing-masing dan (2) memetakan kuadran.Ini
R
Kode menciptakan pohon node dan terminal daun, membedakannya berdasarkan kelas. Pelabelan kelas mempercepat pasca pemrosesan seperti memplot, ditunjukkan di bawah ini. Kode menggunakan nilai numerik untuk id. Ini berfungsi hingga kedalaman 52 di pohon (menggunakan ganda; jika bilangan bulat panjang yang tidak ditandatangani digunakan, kedalaman maksimum adalah 32). Untuk pohon yang lebih dalam (yang sangat tidak mungkin dalam aplikasi apa pun, karena setidaknyak
* 2 ^ 52 poin akan terlibat), id harus berupa string.Perhatikan bahwa desain pembagian dan penaklukan rekursif dari algoritma ini (dan, akibatnya, sebagian besar algoritma pasca-pemrosesan) berarti bahwa persyaratan waktu adalah O (m) dan penggunaan RAM adalah O (n) di mana
m
jumlah sel dann
jumlah titik.m
sebanding dengann
dibagi dengan poin minimum per sel,k
. Ini berguna untuk memperkirakan waktu perhitungan. Misalnya, jika dibutuhkan 13 detik untuk mempartisi n = 10 ^ 6 poin ke dalam sel 50-99 poin (k = 50), m = 10 ^ 6/50 = 20000. Jika Anda ingin mempartisi ke 5-9 poin per sel (k = 5), m adalah 10 kali lebih besar, sehingga waktunya naik sekitar 130 detik. (Karena proses pemisahan seperangkat koordinat di sekitar middle mereka semakin cepat karena sel semakin kecil, waktu yang sebenarnya hanya 90 detik.) Untuk mencapai k = 1 titik per sel, akan memakan waktu sekitar enam kali lebih lama masih, atau sembilan menit, dan kita dapat mengharapkan kode sebenarnya menjadi sedikit lebih cepat dari itu.Sebelum melangkah lebih jauh, mari kita buat beberapa data spasi tidak teratur yang menarik dan buat quadtree terbatas mereka (waktu berlalu 0,29 detik):
Berikut kode untuk membuat plot ini. Ini mengeksploitasi
R
polimorfisme:points.quadtree
akan dipanggil setiap kalipoints
fungsi diterapkan kequadtree
objek, misalnya. Kekuatan ini terbukti dalam kesederhanaan ekstrim dari fungsi untuk mewarnai titik-titik sesuai dengan pengidentifikasi kluster mereka:Memplot kisi-kisi itu sendiri sedikit lebih sulit karena memerlukan kliping berulang dari ambang yang digunakan untuk partisi quadtree, tetapi pendekatan rekursif yang sama sederhana dan elegan. Gunakan varian untuk membangun representasi poligonal kuadran jika diinginkan.
Sebagai contoh lain, saya menghasilkan 1.000.000 poin dan mempartisinya menjadi 5-9 kelompok. Waktu adalah 91,7 detik.
Sebagai contoh bagaimana berinteraksi dengan GIS , mari kita tuliskan semua sel quadtree sebagai bentuk poligon menggunakan
shapefiles
perpustakaan. Kode ini mengemulasi rutinitas klipinglines.quadtree
, tetapi kali ini harus menghasilkan deskripsi vektor sel. Ini adalah output sebagai frame data untuk digunakan denganshapefiles
perpustakaan.Poin itu sendiri dapat dibaca secara langsung menggunakan
read.shp
atau dengan mengimpor file data koordinat (x, y).Contoh penggunaan:
(Gunakan batas yang diinginkan untuk di
xylim
sini untuk membuka jendela ke subkawasan atau untuk memperluas pemetaan ke wilayah yang lebih besar; kode ini default ke tingkat poin.)Ini saja sudah cukup: gabungan spasial dari poligon-poligon ini ke titik-titik awal akan mengidentifikasi kelompok-kelompok tersebut. Setelah diidentifikasi, operasi "ringkasan" basis data akan menghasilkan ringkasan statistik dari titik-titik dalam setiap sel.
sumber
shapefiles
paket atau Anda dapat mengekspor (x, y) koordinat dalam teks ASCII dan membacanyaread.table
. (2) Saya merekomendasikan penulisanqt
dalam dua bentuk: pertama, sebagai titik pembentuk untukxy
tempatid
bidang dimasukkan sebagai pengidentifikasi kluster; kedua, di mana segmen garis diplot olehlines.quadtree
dituliskan sebagai polyline shapefile (atau di mana pemrosesan analog menulis sel sebagai polyfon shapefile). Ini sesederhana memodifikasilines.quadtree.leaf
outputxylim
sebagai persegi panjang. (Lihat hasil edit.)quad
: (1) inisialisasiid=1
; (2) perubahanid/2
keid*2
dalamlower=
line; (3) membuat perubahan serupa keid*2+1
dalamupper=
baris. (Saya akan mengedit jawaban saya untuk mencerminkan hal itu.) Itu juga harus memperhatikan perhitungan area: tergantung pada GIS Anda, semua area akan positif atau semuanya akan negatif. Jika semuanya negatif, balikkan daftar untukx
dany
masukcell.quadtree.leaf
.Lihat apakah algoritma ini memberikan anonimitas yang cukup untuk sampel data Anda:
Misalnya, jika ambang minimum adalah 3:
sumber
Demikian pula dengan solusi menarik Paulo, bagaimana dengan menggunakan algoritma subdivisi quad tree?
Atur kedalaman yang Anda inginkan untuk quadtree. Anda juga bisa memiliki jumlah poin minimum atau maksimum per sel sehingga beberapa node akan lebih dalam / lebih kecil dari yang lain.
Bagi dunia Anda, buang node kosong. Bilas dan ulangi sampai kriteria terpenuhi.
sumber
Pendekatan lain adalah membuat kisi yang sangat halus, dan menggunakan algoritma max-p. http://pysal.readthedocs.org/en/v1.7/library/region/maxp.html
sumber