Saya ingin membuat dataset vektor titik 10.000 poin (atau lebih besar) dalam raster biner, di mana titik harus dibatasi ke area di mana nilai raster adalah 1.
Saya mencoba langkah-langkah berikut.
- Polygonize raster
- QGIS: Vektor -> Alat Penelitian -> Poin Acak
Ini berfungsi dengan baik hingga 2000 poin tetapi apa pun di atas hanya menyebabkan QGIS lumpuh.
Apakah ada cara untuk membuat dataset vektor dengan sejumlah besar fitur titik yang dikekang oleh biner raster (atau versi poligonnya)?
Alat-alat berikut ini siap membantu saya, peringkat dari yang paling tidak menguntungkan: QGIS, Python, R, ArcGIS
Ini yang saya maksudkan, hanya dengan fitur 10x poin.
qgis
arcgis-desktop
python
r
point-in-polygon
Kersten
sumber
sumber
Jawaban:
Berikut cara di R:
Buat raster pengujian, 20x30 sel, buat 1/10 dari sel-sel diatur ke 1, plot:
Untuk raster yang ada dalam file, misalnya geoTIFF, Anda bisa melakukan:
Sekarang dapatkan matriks koordinat xy dari 1 sel, plot titik-titik itu, dan kami melihat kami memiliki pusat sel:
Langkah 1. Hasilkan 1000 (xo, yo) pasangan yang berpusat pada 0 dalam kotak ukuran sel tunggal. Perhatikan penggunaan
res
untuk mendapatkan ukuran sel:Langkah 2. Tentukan sel mana dari masing-masing poin di atas yang masuk secara acak dengan mengambil 1000 nilai dari 1 hingga jumlah 1 sel:
Akhirnya hitung koordinat dengan menambahkan pusat sel ke offset. Plot untuk memeriksa:
Berikut 10.000 poin (ganti 1000 di atas dengan 10.000), diplot dengan
pch="."
:Cukup instan untuk 10.000 poin pada raster 200x300 dengan setengah poin sebagai raster. Akan bertambah waktu secara linear dengan berapa banyak yang ada di raster, saya pikir.
Untuk menyimpan sebagai shapefile, konversikan ke
SpatialPoints
objek, berikan referensi sistem koordinat yang tepat (sama seperti raster Anda) dan simpan:Itu akan membuat shapefile yang menyertakan nomor sel dan offset sebagai atribut.
sumber
Setiap kali saya bekerja dengan dataset besar, saya suka menjalankan alat / perintah di luar QGIS seperti dari skrip mandiri atau dari OSGeo4W Shell . Bukan karena QGIS lumpuh (walaupun dikatakan "Tidak merespons", mungkin masih memproses data yang dapat Anda periksa dari Task Manager ), tetapi karena lebih banyak sumber daya CPU seperti RAM tersedia untuk memproses data. QGIS sendiri menghabiskan banyak memori untuk dijalankan.
Bagaimanapun, untuk menjalankan alat di luar QGIS ( Anda perlu menginstal QGIS melalui installer OSGeo4W ), ikuti 2 langkah pertama seperti yang dijelaskan oleh @ gcarrillo di posting ini: Masalah dengan impor qgis.core saat menulis skrip PyQGIS yang berdiri sendiri (Saya sarankan untuk mengunduh dan menggunakan file .batnya).
Setelah PATHS diatur, ketikkan
python
ke dalam baris perintah. Untuk kenyamanan, salin kode berikut ke editor teks seperti Notepad, edit parameter seperti pathname dari shapefile Anda dll. Dan kemudian rekatkan semuanya ke baris perintah dengan Klik kanan> Tempel :Dengan menggunakan skrip, saya menjalankan titik Acak di alat batas lapisan untuk shapefile yang cukup besar dan butuh waktu di bawah 20 detik untuk menghasilkan 10k poin. Menjalankannya di dalam QGIS membutuhkan waktu hampir 2 menit sehingga setidaknya bagi saya, ada perbedaan yang signifikan.
sumber
Anda juga dapat menggunakan GRASS GIS secara langsung untuk pekerjaan ini - Pengambilan sampel acak bertingkat: Pengambilan sampel acak dari peta vektor dengan batasan spasial :
https://grass.osgeo.org/grass72/manuals/v.random.html#stratified-random-sampling:-random-sampling-from-vector-map-with-spatial-constraints
Selain itu, pengambilan sampel acak dari peta vektor berdasarkan atribut dan beberapa metode lain diimplementasikan dalam perintah.
Catatan: Versi v.random yang diekspos di QGIS melalui pemrosesan tidak mencerminkan fungsionalitas penuh tetapi hanya tampilan yang disederhanakan.
sumber