Menggunakan ArcGIS 10, saya memiliki raster di mana saya ingin mencari pixel dengan nilai maksimum di raster dan mengembalikan lokasinya (pusat pixel) dalam derajat desimal. Saya ingin mengulangi melalui proses ini mengembalikan lokasi nilai tertinggi kedua dari raster, kemudian ketiga, dan seterusnya sehingga pada akhirnya saya memiliki daftar lokasi N yang memiliki nilai tertinggi dalam raster secara berurutan.
Saya membayangkan bahwa ini mungkin paling mudah dilakukan dengan menggunakan skrip Python tapi saya terbuka untuk ide lain jika ada cara yang lebih baik.
Jawaban:
Jika Anda senang menggunakan R , ada paket yang disebut raster . Anda dapat membaca dalam raster menggunakan perintah berikut:
Kemudian, saat Anda melihatnya (dengan mengetik
test
), Anda dapat melihat info berikut:Mungkin ada cara yang lebih baik untuk memanipulasi raster, tetapi salah satu cara menemukan info yang Anda inginkan adalah menemukan nilai tertinggi, dan mendapatkan lokasi matriksnya, lalu menambahkannya ke tingkat yang lebih rendah.
sumber
R
, Anda dapat menggunakanR
fungsi standar ataugetValues
metode untuk mengakses nilai sel. Dari sana mudah untuk mengidentifikasi nilai tertinggi dan lokasi mereka.Jawabannya dapat diperoleh dengan menggabungkan kisi indikator dari 1% nilai teratas dengan kisi lintang dan bujur. Kuncinya terletak pada pembuatan kisi indikator ini, karena ArcGIS (masih! Setelah 40 tahun!) Tidak memiliki prosedur untuk memeringkat data raster.
Salah satu solusi untuk raster floating-point adalah iteratif, tetapi untungnya cepat . Biarkan n menjadi jumlah sel data. The distribusi kumulatif empiris dari nilai-nilai terdiri dari semua pasangan (z, n (z)) di mana z adalah nilai dalam grid dan n (z) adalah jumlah sel di grid dengan nilai kurang dari atau sama dengan z . Kita mendapatkan kurva yang menghubungkan (-infinity, 0) ke (+ infinity, n) dari urutan simpul-simpul ini yang dipesan oleh z . Dengan demikian mendefinisikan fungsi f , di mana (z, f (z)) selalu terletak pada kurva. Anda ingin menemukan titik (z0, 0,99 * n) pada kurva ini.
Dengan kata lain, tugasnya adalah menemukan nol dari f (z) - (1-0.01) * n . Lakukan ini dengan rutinitas nol-temuan (yang dapat menangani fungsi sewenang-wenang: yang ini tidak dapat dibedakan). Yang paling sederhana, yang seringkali efisien, adalah menebak-dan-periksa: awalnya Anda tahu z0 terletak antara nilai minimum zMin dan zMax maksimum. Tebak nilai wajar apa pun di antara keduanya. Jika tebakannya terlalu rendah, atur zMin = z0; jika tidak, atur zMax = z0. Sekarang ulangi. Anda akan segera menyatu dengan solusi; Anda cukup dekat ketika zMax dan zMin cukup dekat. Agar konservatif, pilih nilai akhir zMin sebagai solusinya: mungkin mengambil beberapa poin tambahan yang dapat Anda buang nanti. Untuk pendekatan yang lebih canggih, lihat Bab 9 dari Resep Numerik (tautan menuju ke versi gratis yang lebih lama).
Melihat kembali algoritma ini menunjukkan Anda hanya perlu melakukan dua jenis operasi raster : (1) pilih semua sel kurang dari atau sama dengan beberapa nilai target dan (2) hitung sel yang dipilih. Itu adalah salah satu operasi paling sederhana dan tercepat di sekitar. (2) dapat diperoleh sebagai hitungan zonal atau dengan membaca satu catatan dari tabel atribut dari kisi pilihan.
sumber
Saya melakukan ini beberapa waktu yang lalu, meskipun solusi saya menggunakan GDAL (jadi, ini bukan hanya untuk ArcGIS). Saya pikir Anda bisa mendapatkan array NumPy dari raster di ArcGIS 10, tapi saya tidak tahu pasti. NumPy memasok pengindeksan array yang sederhana dan kuat, seperti
argsort
dan lainnya. Contoh ini tidak menangani NODATA atau mengubah koordinat dari yang diproyeksikan ke lat / long (tapi ini tidak sulit dilakukan dengan osgeo.osr, disediakan dengan GDAL)Menampilkan berikut ini untuk file raster pengujian saya:
sumber
NODATA = rast_band.GetNoDataValue()
, kemudian dengan menggunakan nilai NaN (rast[rast == NODATA] = np.nan
) atau dengan menggunakan array masked (rast = np.ma.array(rast, mask=(rast == NODATA))
). Trik yang lebih rumit adalahargsort
entah bagaimana menghapus nilai-nilai NODATA dari analisis, atau cukup lewati saja di for-loop jika mereka NaN / masked.