Saya memiliki fitur poligon dan ingin dapat menghasilkan poin di dalamnya. Saya memerlukan ini untuk satu tugas klasifikasi.
Menghasilkan titik acak sampai ada di dalam poligon tidak akan berhasil karena itu benar-benar tidak dapat diprediksi waktu yang diperlukan.
Jawaban:
Mulailah dengan mendekomposisi poligon menjadi segitiga, lalu hasilkan poin di dalamnya . (Untuk distribusi yang seragam, timbang setiap segitiga berdasarkan wilayahnya.)
sumber
Saat Anda memasang tag QGIS pada pertanyaan ini: Alat Poin Acak dapat digunakan dengan lapisan batas.
Jika Anda mencari kode, kode sumber plugin yang mendasarinya harus membantu.
sumber
Anda bisa menentukan tingkat poligon, lalu membatasi pembangkitan angka acak untuk nilai X dan Y dalam luasan tersebut.
Proses dasar: 1) Tentukan maxx, maxy, minx, miny dari simpul poligon, 2) Hasilkan titik acak menggunakan nilai-nilai ini sebagai batas 3) Uji setiap titik untuk persimpangan dengan poligon Anda, 4) Berhenti menghasilkan ketika Anda memiliki cukup poin memenuhi persimpangan uji
Berikut ini adalah algoritma (C #) untuk tes persimpangan:
sumber
Ada beberapa perpustakaan bagus di luar sana yang melakukan sebagian besar pekerjaan berat untuk Anda.
Contoh menggunakan [rupawan] [1] dalam python.
Atau gunakan
.representative_point()
untuk mendapatkan titik di dalam objek (seperti yang disebutkan oleh dain):sumber
representative_point
metode ini: shapely.readthedocs.io/en/latest/…Jika R adalah opsi, lihat
?spsample
dalamsp
paket. Poligon dapat dibaca dari format apa pun yang didukung GDAL yang dibangun ke dalam paket rgdal, dan kemudianspsample
bekerja langsung pada objek yang diimpor dengan berbagai opsi pengambilan sampel.sumber
Saya ingin menawarkan solusi yang membutuhkan sangat sedikit dalam hal analisis GIS. Secara khusus, tidak memerlukan triangulasi poligon apa pun.
Algoritme berikut, diberikan dalam pseudocode, merujuk pada beberapa operasi sederhana selain kemampuan penanganan daftar dasar (membuat, menemukan panjang, menambahkan, mengurutkan, mengekstrak sublists, dan menyatukan) dan generasi float acak dalam interval [0, 1):
Ini semua tersedia di hampir semua SIG atau lingkungan pemrograman grafis (dan mudah dikodekan jika tidak).
Clip
tidak boleh mengembalikan poligon yang merosot (yaitu, yang tidak memiliki luas).Prosedur secara
SimpleRandomSample
efisien mendapatkan daftar titik yang didistribusikan secara acak dalam poligon. Ini adalah pembungkus untukSRS
, yang memecah poligon menjadi potongan-potongan kecil sampai masing-masing potongan cukup kompak untuk disampel secara efisien. Untuk melakukan ini, ia menggunakan daftar angka acak yang telah dihitung untuk memutuskan berapa banyak poin yang dialokasikan untuk masing-masing bagian.SRS dapat "disetel" dengan mengubah parameter
t
. Ini adalah kotak batas maksimum: rasio area poligon yang dapat ditoleransi. Menjadikannya kecil (tetapi lebih besar dari 1) akan menyebabkan sebagian besar poligon terpecah menjadi banyak; membuatnya besar dapat menyebabkan banyak poin percobaan ditolak untuk beberapa poligon (berliku-liku, dengan sliver, atau penuh lubang). Ini menjamin bahwa waktu maksimum untuk mengambil sampel poligon asli dapat diprediksi.Prosedur selanjutnya menyebut dirinya secara rekursif jika perlu. Ekspresi misterius secara
t*N + 5*Sqrt(t*N)
konservatif memperkirakan batas atas berapa banyak poin yang akan dibutuhkan, yang memperhitungkan variabilitas kesempatan. Kemungkinan bahwa ini akan gagal hanya 0,3 per juta panggilan prosedur. Tingkatkan 5 hingga 6 atau bahkan 7 untuk mengurangi kemungkinan ini jika Anda mau.sumber
Jika poligon Anda adalah cembung dan Anda tahu semua simpul, Anda mungkin ingin mempertimbangkan untuk melakukan pembobotan cembung "acak" dari simpul untuk sampel titik baru yang dijamin terletak di dalam cembung cembung (poligon dalam kasus ini).
Misalnya, Anda memiliki poligon cembung sisi N dengan simpul
Kemudian menghasilkan bobot N cembung secara acak
Titik sampel acak kemudian diberikan oleh
Mungkin ada cara berbeda untuk sampel bobot N cembung
Ketika poligon Anda tidak terlalu non-cembung, Anda dapat mempertimbangkan untuk mengubahnya menjadi lambung cembung. Setidaknya ini harus membatasi jumlah titik yang berada di luar poligon Anda untuk sebagian besar.
sumber
Tugas ini sangat mudah diselesaikan dalam GRASS GIS (satu perintah) menggunakan v.random .
Di bawah ini adalah contoh tentang cara menambahkan 3 titik acak ke dalam poligon yang dipilih (di sini area kode ZIP kota Raleigh, NC) dari halaman manual. Dengan memodifikasi pernyataan SQL "where", poligon dapat dipilih.
sumber
Tautan jawaban
https://gis.stackexchange.com/a/307204/103524
Tiga algoritma menggunakan pendekatan yang berbeda.
Git Repo Link
Fungsi ================================================= ==================
Gunakan fungsi dengan kueri sederhana, geometri harus valid dan poligon, multi-poligon, atau amplop
SELECT I_Grid_Point_Distance(geom, 50, 61) from polygons limit 1;
Hasil ================================================= =====================
Fungsi kedua berdasarkan algoritma Nicklas Avén . Sudah mencoba menangani SRID apa pun.
Saya telah menerapkan perubahan berikut dalam algoritma.
Fungsi ================================================= ==================
Gunakan dengan kueri sederhana.
SELECT I_Grid_Point(geom, 22, 15, false) from polygons;
Hasil ================================================= ==================
Fungsi ================================================= =================
Gunakan dengan kueri sederhana.
SELECT I_Grid_Point_Series(geom, 22, 15, false) from polygons;
Hasil ================================================= =========================sumber