Mustahil untuk menjumlahkan raster karena piksel nodata

11

Saya memiliki seperangkat raster (.vrt) dengan data kelembaban tanah harian. Saya ingin menjumlahkan piksel semua raster untuk mengukur berdasarkan bulan. Namun, seluruh dunia tidak tercakup setiap hari, yang menghasilkan nilai nodata di tempat-tempat di mana ada langkah-langkah untuk hari-hari lainnya.

Yang ingin saya lakukan, adalah menjumlahkan nilai-nilai setiap raster. Namun, tampaknya setiap kali sebuah pixel nodata ada dalam penjumlahan, pixel yang dihasilkan langsung dikategorikan sebagai nodata. Saya ingin memiliki yang sebaliknya: mengabaikan semua nilai nodata dan menjumlahkan sisanya.

Saya memikirkan 2 cara untuk memecahkan masalah:

  1. menjumlahkan raster mengabaikan nilai-nilai nodata
  2. mengubah piksel nodata menjadi nilai 0, lalu jumlah semua raster

masukkan deskripsi gambar di sini

Sayangnya, saya tidak dapat menemukan alat apa pun untuk melakukan ini.

Ada yang bisa bantu saya?

Damien
sumber
Saya bertanya-tanya bagaimana interpretasi hasilnya: setelah semua, jumlahnya tidak akan termasuk nilai-nilai untuk hari-hari yang hilang, menunjukkan mereka akan bias rendah dengan berbagai jumlah tergantung pada jumlah data yang hilang. Jika ada jumlah data hilang yang cukup besar, maka Anda sebaiknya mempertimbangkan untuk menghitung atau memprediksi nilai pada sel yang hilang dan kemudian melakukan penjumlahan.
whuber
1
Terima kasih atas komentar ini. Saya bertanya kepada manajer data dan mereka mengatakan mereka menghitung nilai rata-rata dengan menjumlahkan semua data yang tersedia, kemudian membaginya dengan jumlah hari dalam bulan ketika pengamatan tersedia pada piksel itu.
Damien
2
Itu identik dengan rata-rata lokal dari tumpukan raster di mana GIS diinstruksikan hanya untuk mengabaikan semua sel NoData, yang menyarankan cara lain bagi Anda untuk pergi. Omong-omong, prosedur ini masih berpotensi bias ketika pengamatan yang hilang berkorelasi dengan nilai-nilai. Misalnya, ketika Anda kehilangan data karena tutupan awan, masuk akal bahwa pada saat itu kelembaban tanah mungkin lebih tinggi (rata-rata) dari biasanya.
whuber
1
Baiklah, saya baru saja menguji alat statistik sel dengan 'abaikan nodata' diperiksa dan ia melakukan apa yang saya inginkan. Saya menyadari kekurangan dari metode tersebut. Namun, pekerjaan saya pada skala yang agak besar, baik dalam ruang dan waktu, jadi saya berasumsi bahwa bias semacam itu akan kurang penting. Lagi pula, saya tidak punya begitu banyak pilihan data.
Damien
Skala tidak akan terkait dengan jumlah bias. Pentingnya bias tergantung pada ukuran dan sensitivitas aplikasi Anda terhadapnya. Meskipun Anda mungkin tidak dapat melakukan apa-apa tentang data, Anda tidak memiliki kontrol atas prosedur untuk menganalisis mereka. Ada banyak cara untuk meningkatkan yang satu ini. Di antara opsi Anda adalah interpolasi dari waktu ke waktu dan mundur terhadap kovariat yang mungkin berkorelasi dengan kelembaban tanah dan tersedia bahkan pada tanggal yang hilang. (Ada seluruh cabang statistik yang ditujukan untuk "imputing" nilai-nilai yang hilang.)
whuber

Jawaban:

1

Jika Anda memiliki akses ke ArcGIS maka alat Statistik Sel memiliki opsi untuk mengabaikan nodata yang Anda jumlah \ mean \ min \ maks raster Anda.

Hornbydd
sumber
Jika Anda memodifikasi jawaban ini untuk mengganti "jumlah" dengan "rata-rata," itu akan benar: lihat utas komentar untuk pertanyaan karena alasannya.
whuber
Penjumlahan hanya satu bagian dari masalah saya karena saya ingin mendapatkan nilai rata-rata. Saya baru saja memeriksa, dan alat statistik Cell juga merupakan cara termudah untuk menghitung raster dengan mengabaikan piksel nodata.
Damien
11

Pertama, Anda dapat menggunakan gdal_calc.py untuk mengubah semua -9999 menjadi 0 dan mengatur nilai NoData ke 0.

Contohnya:

gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --calc="A+9999*(A==-9999)" --NoDataValue=0

Kemudian, Anda dapat mengabaikan nilai NoData menggunakan gdal_translate dengan opsi -a_nodata diikuti oleh tidak ada .

Nilai -a_nodata :

Tetapkan nilai nodata yang ditentukan untuk pita keluaran. Dimulai dengan GDAL 1.8.0, dapat diatur ke tidak ada untuk menghindari pengaturan nilai nodata ke file output jika ada untuk file sumber

Contoh:

gdal_translate -a_nodata none input_with_NoData.tif output_without_NoData.tif
Antonio Falciano
sumber
Terima kasih atas tipnya. Saya bermain sedikit dengan parameter -a_nodata, dan saya berhasil memiliki nilai -9999 alih-alih NULL. Namun, saya masih perlu mengubah semua -9999 piksel menjadi 0
Damien
1
Anda dapat menggunakan gdal_calc.py untuk mengubah semua -9999 menjadi 0 sebelum mendaftar gdal_translate -a_nodata none .... Misalnya: gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --type=Int16 --calc="A+9999*(A==-9999)" --NoDataValue=0
Antonio Falciano
Saya mencoba beberapa perintah, tapi saya pikir saya punya masalah dengan gdal_calc.py. Sebagai contoh, saya hanya mencoba menambahkan 1 ke seluruh raster ( i.imgur.com/WiZG7MC.png ) dan saya mendapatkan kesalahan Maxrepeat ini. Saya tidak mengerti, saya menjalankan perintah langsung dari shell OSGeo, dan modul ini tampaknya diinstal dengan benar karena muncul dalam daftar ketika saya membuka shell ( i.imgur.com/fgtMZQZ.png ). Apakah instal saya rusak?
Damien
Sepertinya masalah regex ... Coba ubah direktori kerja Anda menggunakan cdperintah dan coba lagi hanya untuk memilikinya -A test.tif.
Antonio Falciano
1
Ini berfungsi untuk saya, tetapi saya telah menginstal semua ini melalui installer OSGeo4W . Sebagai gantinya, saya melihat bahwa Anda telah menginstal QGIS melalui penginstal mandiri. Jadi cobalah menyegarkan / memperbarui pengaturan Anda.
Antonio Falciano
5

Dalam R:

library(raster)
s <- stack('file1', 'file2', ...)
ss <- sum(s, na.rm=TRUE)
Robert Hijmans
sumber
Bisakah Anda menambahkan penjelasan ke kode ini (jika Anda menulisnya) atau tautan ke tempat Anda menemukannya, dengan ringkasan singkat dari situs ini?
Paul
1
Yang pertama di atas memuat paket raster, kemudian menciptakan "tumpukan" (array 3-dimensi file raster dengan tingkat dan resolusi yang sama, di mana setiap file menjadi sepotong tumpukan ini) yang terdiri dari file-file yang ditunjukkan oleh nama file yang dipisah koma. . Baris terakhir melakukan jumlah sel-bijaksana di semua irisan tumpukan s, dengan argumen yang na.rm=TRUEmengakibatkan NAnilai-nilai diabaikan. Objek output ssadalah rasterobjek yang dapat diekspor dengan writeRaster(lihat ?writeRaster). (@RobertH adalah pencipta rasterpaket R. )
jbaums
1

Alat Bersyarat dalam Analis Tata Ruang adalah cara mudah untuk mengkonversi nilai nol ke nol. Maka mengambil jumlah harus mudah.

bangsat
sumber
Terimakasih atas balasan anda. Saya mengikuti posting ini: support.esri.com/fr/knowledgebase/techarticles/detail/34932 dan dapat mengubah semua piksel nol menjadi 0. Namun, saya ingin dapat melakukan operasi ini untuk semua raster dalam sebuah direktori. 'Reklasifikasi nilai kisi' di QGIS tampaknya dapat melakukan ini, tetapi yang saya tidak tahu cara kerjanya. Saya memilih metode "Tabel sederhana", dan memintanya untuk menetapkan nol ke 0, dan tidak mengubah nilai-nilai lain, tetapi raster yang dihasilkan berkisar antara -0,99 hingga 0,08 sementara awalnya mencakup dari 428 hingga 3491
Damien
Bisakah Anda memposting kutipan raster asli Anda di suatu tempat, sehingga kami dapat melihatnya?
til_b
2
Jika Anda mengklik kanan pada alat Anda dapat menjalankan proses batch pada banyak file yang Anda inginkan, yaitu seluruh direktori.
brock
Terima kasih atas jawaban anda. Namun, saya dapat mengonversi semua NULL menjadi 0 untuk satu file menggunakan 'analis spasial / aljabar Peta / kalkulator Raster'. Jika saya benar klik pada alat ini, saya bisa batch direktori, tetapi apa yang akan menjadi sintaks untuk memperhitungkan setiap file secara otomatis? ( i.imgur.com/aYaUCzz.png )
Damien
Saya telah melihat alat 'analis spasial / Reklas / Reklasifikasi' dan melakukan apa yang saya inginkan. Saya berhasil menggunakan jendela batch untuk memproses beberapa file sekaligus. Saya memiliki masalah terakhir: jika saya klik kanan / isi 'output raster', itu menyalin file output yang sama untuk semua raster input. Bagaimana saya bisa membuatnya untuk membuat output yang berbeda untuk setiap input? ( i.imgur.com/jzTI2x9.png )
Damien
1

Saya memiliki masalah yang sama beberapa waktu lalu dan saya berhasil menyelesaikannya.

Sama seperti catatan tentang tampilan nilai nodata di QGIS: nilai nodata selalu ditampilkan sebagai nilai nodata di jendela peta dan ketika menggunakan alat "informasi objek", tidak masalah jika mereka benar-benar memiliki nilai -9999, 0, NULL dll Jadi setelah reklasifikasi nilai nodata ke 0, jika Anda masuk dalam pengaturan layer Anda akan menemukan di Metadata bahwa nodata memiliki nilai 0.

Saya akhirnya menemukan alat yang sempurna untuk pencarian, GRASS r.series. Dengan pengaturan "operasi agregat" "maksimum" dan "propagate NULLs" tidak dicentang, alat akan membuat Layer yang sesuai dengan kebutuhan Anda.

Miron
sumber
0

Saya ingat memiliki masalah ini beberapa waktu lalu. Sebagai solusi, saya pikir saya memberi +1 ke semua sel dalam raster, menambahkan raster bersama, lalu melakukan pengurangan akhir (dari banyaknya +1 yang Anda tambahkan). Ini sangat kasar tetapi jika itu menyelesaikan pekerjaan ...!

Atau, gunakan 'Reklasifikasi nilai kisi' di kotak alat Pemrosesan di QGIS untuk mengonversi nilai nol Anda menjadi nol.

Rob Lodge
sumber
Hai, saya mencoba banyak cara menggunakan alat 'mereklasifikasi nilai grid' tanpa hasil. Saya memulai raster tempat saya mengonversi semua piksel NULL menjadi -9999. Saya mencoba untuk mengklasifikasikan menggunakan metode [0] tunggal, dan menetapkan 'nilai lama = -9999', 'nilai baru = 0,0', 'operator: [0] =', tetapi yang saya dapatkan adalah raster yang penuh dengan 'nan' piksel. Apa yang saya lakukan salah?
Damien