Mendefinisikan ulang nilai nodata menjadi nol di QGIS?

7

Saya memiliki gambar yang saya klip dengan poligon AOI. Area kontur ditetapkan ke nilai piksel = 0 dan saya memiliki nilai nodata -32768. Saya ingin mendefinisikan kembali nilai nodata menjadi nol. Saya biasa melakukan ini dengan ArcMap dengan mudah di kalkulator raster, tetapi di QGIS saya tidak melihat bagaimana saya bisa melakukannya. Ada ide?

vascobnunes
sumber
2
Apakah Anda menginginkannya murni untuk visualisasi atau Anda perlu mengaturnya ke nol di mana Anda akan melakukan perhitungan raster lebih lanjut?
Maning

Jawaban:

13

Di QGIS, Anda dapat menggunakan Kalkulator Raster dengan perhitungan berikut:

("your_raster" != -32768) * "your_raster"

Dengan perhitungan ini, jika nilai sel -32768 Anda akan mendapatkan 0 di sel itu dan jika berbeda dari -32768 sel akan menyimpan nilai yang dimilikinya.

Egidi
sumber
1
Solusi yang bagus. Hanya catatan untuk orang lain yang mencoba ini: Di ​​QGIS, nilai nodata untuk layer dapat ditemukan di bawah Properties layer, lalu Information (item atas), lalu gulir ke bawah ke Bands.
Yohanes
Perhatikan bahwa ini tidak bekerja untuk nilai seperti -3,40282e + 38.
geordie
12

Saya menemukan solusi untuk ini. Pertama saya mengonversi gambar menjadi lapisan vrt (gdalbuildvrt) dengan -srcnodata 0, kemudian saya menerjemahkannya kembali menjadi file tif dengan gdal_translate -a_nodata. Bekerja dengan baik! :)

vascobnunes
sumber
12

Satu langkah paling sederhana dan, IMO, solusi yang paling dapat diandalkan secara konsisten untuk mengklasifikasi NoData ke nol adalah dengan menggunakan alat Reklasifikasi Nilai Grid (SAGA) dalam kotak peralatan pemrosesan.

Setelah memilih raster untuk direklasifikasi, cukup gulir ke bagian bawah dialog, pastikan kotak replace no data valueskotak dicentang. Nilai defaultnya adalah nol (tapi tentu saja Anda bisa mengganti yang lain). Kemudian hapus centang pada replace other valueskotak dan biarkan semua bidang lain sendirian (jadi semua yang Anda lakukan adalah memastikan satu kotak dicentang dan tidak mencentang yang lain - tidak diperlukan pengaturan lain).

MappaGnosis
sumber
1
Saya setuju. Tidak ada yang benar-benar bekerja untuk saya (nilai nodata saya kira-kira -3.4e + 38)
ArMoraer
Memiliki masalah yang persis sama dengan @ArMoraer. Ini adalah solusi termudah, bekerja dengan sempurna.
Rauni
Saya memperbaiki nodata ke masalah nilai 0, tetapi pada saat itu ia menerapkan sedikit perubahan pada nilai raster saya yang lain
ZKB
Sayangnya metode ini tidak lagi berfungsi di QGIS 3.8. Formulir pemrosesan tidak akan dieksekusi tanpa mengubah semua pengaturan lainnya. Kesalahan: "Nilai parameter salah atau hilang: ...."
geordie
9

Saya kira Anda bisa melakukannya dengan kalkulator raster .

Jika tidak dengan bantuan plugin GRASS dan r.null Anda akan melakukannya dengan mudah. Opsi itu berarti Anda harus terlebih dahulu membuat mapset GRASS untuk mengimpor raster Anda.

simo
sumber
5
dapatkah Anda menguraikan cara melakukannya dengan kalkulator raster?
rudivonstaden
1
r.nullmelakukannya untukku.
metasequoia
1
Sepakat. Ini adalah solusi sederhana dalam QGIS untuk mengganti nodata dengan nilai dan sebaliknya.
Eli S
8

Memiliki masalah yang sama, pada akhirnya saya menggunakan Python secara langsung - Anda mungkin harus menyesuaikan numpy.where untuk tujuan spesifik Anda. Dalam kasus di bawah ini, nilai-nilai piksel dijaga sebagaimana adanya jika mereka adalah> = 0, semua piksel lainnya - dalam hal ini hanya yang memiliki nilai tanpa data - yang disetel ke "0"

import gdal, gdalconst, numpy
maskfile = gdal.Open('C:\Users\max\Desktop\Baltic2.tif', gdalconst.GA_Update)
maskraster = maskfile.ReadAsArray()
maskraster = numpy.where((maskraster >= 0), maskraster, 0 ) 
maskband = maskfile.GetRasterBand(1)
maskband.WriteArray( maskraster )
maskband.FlushCache()
Maks
sumber
1

Saya telah mencoba menggunakan plugin rastercalc dan Raster Calculator dan tidak berhasil - Kesalahan sintaksis. Apa yang berhasil adalah alat Warp dan menentukan nilai nodata sumber dan tujuan (lihat jawaban underdark untuk pertanyaan serupa Bagaimana mengecualikan nilai yang hilang dari lapisan raster? )

Firenze
sumber
1

Apa yang berhasil bagi saya adalah mengekspor raster sebagai file .asc, kemudian membuka editor teks dan menggunakan find and replace untuk mengganti nilai NoData lama dengan nilai yang saya inginkan.

Daniel Moraes
sumber
1

Dalam kasus saya, itu adalah citra satelit yang perlu saya konversikan menjadi 8 bit dan terus menghasilkan nilai data saat menggunakan -scale di gdal_translate.

Saya dapat menyelesaikan masalah ini dengan mengekspor raster (lapisan klik kanan -> ekspor -> simpan lapisan sebagai ...) ke file baru sebagai data yang diberikan (centang di bagian atas jendela dialog).

bartek2101
sumber
0

Untuk skrip python Anda dapat menggunakan baris berikut sebelum WriteArray.

maskband.SetNoDataValue(0)
Shiuli Pervin
sumber