Saya mencoba membuat voronoi poligon di QGIS yang akan mempertimbangkan "lubang" di domain umum. Contohnya adalah:
Saya benar-benar membuat Vorono pada gambar ini menggunakan QGIS melalui perintah GRASS, kemudian menggunakan alat "Perbedaan" untuk membuat lubang. Shapefile poligon terpisah, yang berisi luasan lubang, digunakan sebagai lapisan "Perbedaan". Contoh aplikasi akan membuat poligon di sekitar titik pengambilan sampel yang dikumpulkan antara struktur yang harus dikeluarkan dari analisis.
Dua masalah muncul di sini:
Fungsi "perbedaan" tampaknya tidak berfungsi 100% dengan benar, dengan beberapa batas poligon memanjang ke "lubang". Ini dapat diperbaiki dengan menemukan baris di Tabel Atribut yang tidak memiliki nomor ID poligon (atau ID "0").
Jenis "hole-punch" setelah-fakta ini dapat menghasilkan poligon diskontinyu, seperti yang ditunjukkan oleh panah merah pada gambar.
Pertanyaan saya adalah: apakah ada alat atau plugin Voronoi yang dapat mempertimbangkan keberadaan "lubang" di tengah domain, sebagai proses satu langkah, dan juga menghilangkan generasi poligon terputus-putus? Saya membayangkan bahwa alat seperti itu akan memperluas batas poligon ke persimpangan terdekat dengan batas lain, kecuali jika batas itu membanting terhadap batas "lubang" terlebih dahulu.
sumber
Jawaban:
Ini dimungkinkan menggunakan raster. Konversi poin dan poligon batas Anda terlebih dahulu menjadi raster resolusi tinggi. Tetapkan topeng untuk batas Anda menggunakan
r.mask
. Kemudian, jalankanr.grow.distance
dalam GRASS dan gunakanValue= output
. Ini akan memberi Anda untuk setiap piksel, yang merupakan titik terdekat. Ubah ini kembali menjadi poligon vektor. Mungkin ada langkah-langkah tambahan yang dibutuhkan untuk menyingkirkan sliver poligon.sumber
Ini tentu saja mungkin dengan raster.
Tangkapan layar ini mudah-mudahan menunjukkan masalahnya dengan lebih jelas. Bagian B dari voronoi lebih dekat 'saat gagak terbang' ke pusat voronoi yang asli, tetapi ini tidak memperhitungkan fakta bahwa akan memakan waktu lebih lama untuk berjalan di sekitar gedung. Pemahaman saya tentang pertanyaan OP adalah bahwa voronoi perlu memperhitungkan jarak ekstra ini untuk berjalan di sekitar gedung.
Saya suka saran dari @Guillaume. Namun, ketika saya mencobanya saya punya masalah
r.grow.distance
untuk menghormati topeng (lihat di bawah. Riak-riak seharusnya tidak melewati bangunan).Pengetahuan Rumput saya tidak sekuat yang seharusnya, jadi mungkin saya melakukan sesuatu yang bodoh. Tentunya, periksa saran itu terlebih dahulu karena akan jauh lebih sedikit pekerjaan daripada milik saya ;-)
Langkah 1 - Buat permukaan biaya
Langkah pertama adalah membuat permukaan biaya. Ini hanya perlu dilakukan sekali.
gunakan kalkulator raster untuk mengubahnya menjadi permukaan biaya. Saya akan mengatur 'di luar ruangan' menjadi 1 dan 'di dalam ruangan' ke 9999. Ini akan membuat sulit untuk melewati bangunan.
(("mask @ 1" = 1) * 1) + (("mask @ 1" = 0) * 9999)
Anda bisa mendapatkan lebih banyak hasil 'organik' dengan menambahkan sedikit noise ke permukaan biaya (mis. Gunakan angka acak dari 1 hingga 3, daripada hanya 1 untuk pxiels outdoor.)
Langkah 2. Buat raster biaya kumulatif untuk setiap pusat voronoi
Sekarang kita dapat menjalankan (untuk satu sel voronoi sekaligus) algoritma GRASS
r.cost.coordinates
terhadap lapisan permukaan biaya kami.Untuk mulai berkoordinasi, gunakan pusat vornoi. Untuk koordinat akhir, pilih salah satu sudut area Anda. Saya sarankan menggunakan 'Knights Tour' karena ini memberikan hasil yang lebih halus.
Hasilnya menunjukkan garis waktu perjalanan yang sama dari satu pusat voronoi. Perhatikan bagaimana pita membungkus bangunan.
Tidak yakin cara terbaik untuk mengotomatisasi ini. Mungkin memproses mode batch, atau dilakukan dalam pyqgis.
Langkah 3. Gabungkan raster
Ini mungkin membutuhkan kode. Algoritma akan menjadi
Pendekatan itu harus menghasilkan raster di mana setiap sel dikategorikan oleh pusat voronoi terdekat, dengan mempertimbangkan hambatan.
Anda kemudian dapat menggunakan raster-ke-poligon. Anda kemudian dapat menggunakan plugin Generalize untuk menghapus artefak efek "langkah" dari raster.
Permintaan maaf atas ketidakjelasan pada langkah 2 dan 3 ... Saya berharap seseorang berpadu dengan solusi yang lebih elegan :)
sumber
Catatan # 1 : Saya tidak dapat mereproduksi masalah yang diusulkan karena alat Perbedaan bekerja dengan baik untuk saya dalam beberapa tes yang saya lakukan (mungkin itu karena geometri masalah yang sederhana atau karena alat tersebut telah diperbaiki karena pertanyaannya adalah tanya 1 tahun yang lalu).
Namun, saya mengusulkan solusi di PyQGIS untuk menghindari penggunaan alat Perbedaan . Semuanya didasarkan pada persimpangan lokal antara dua lapisan input (lihat gambar di bawah):
Catatan # 2 : Karena saya tidak ingin menggunakan alat Perbedaan , saya tidak dapat menghindari pembuatan "sliver" (lihat kemudian), jadi saya perlu menjalankan
v.clean
alat untuk menghilangkannya. Selanjutnya, seperti yang dikatakan @Chris W,Setelah tempat yang diperlukan ini, saya memposting kode saya:
yang mengarah ke hasil ini:
Hanya untuk kejelasan, ini akan menjadi hasil tanpa menggunakan
v.clean
alat ini:Perbedaan dengan hasil oleh @LeaningCactus adalah bahwa, sekarang, geometri tidak rusak dan mereka bisa "dibersihkan" tanpa kesalahan .
sumber