Redefinindo o valor nodata em zero no QGIS?


7

Eu tenho uma imagem que eu recortei com um polígono AOI. A área de contorno foi definida como valor de pixel = 0 e eu tenho um valor nodata de -32768. Eu quero redefinir o valor nodata em zero. Eu costumava fazer isso com o ArcMap facilmente na calculadora raster, mas no QGIS não vejo como eu poderia fazê-lo. Alguma ideia?


2
Você deseja apenas para visualização ou precisa defini-lo como nulo, para realizar cálculos mais rasterizados?
maning

Respostas:


13

No QGIS, você pode usar a Calculadora de varredura com o seguinte cálculo:

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

Com este cálculo, se o valor da célula for -32768, você receberá um 0 nessa célula e se for diferente de -32768, a célula manterá o valor que tinha.


1
Ótima solução. Apenas uma observação para outras pessoas que tentam o seguinte: No QGIS, o valor nodata para uma camada pode ser encontrado sob a camada Propriedades, depois em Informações (item superior) e role para baixo até Bandas.
John John

Observe que isso não funciona para valores como -3.40282e + 38.
geordie 8/03

12

A solução de uma etapa mais simples e, IMO, mais consistente e confiável para reclassificar NoData para zero é usar a ferramenta Reclassify Grid Values ​​(SAGA) na caixa de ferramentas de processamento.

Depois de selecionar a varredura a ser reclassificada, simplesmente role até a parte inferior da caixa de diálogo, verifique se a caixa de seleção replace no data valuesestá marcada. O valor padrão é zero (mas você pode substituir outra coisa, é claro). Em seguida, desmarque a replace other valuescaixa e deixe todos os outros campos em paz (tudo o que você está fazendo é garantir que uma caixa esteja marcada e desmarcar outra - nenhuma outra configuração é necessária).


1
Concordo. Nada realmente funcionou para mim (meu valor nodata era algo como -3,4e + 38).
ArMoraer

Tinha exatamente o mesmo problema que o @ArMoraer. Esta foi a solução mais fácil, funcionou perfeitamente.
Rauni

I fixou o NODATA a 0 questão de valor, mas pelo tempo médio aplicou pequenas mudanças aos meus outros valores raster
ZKB

Infelizmente, esse método não parece mais funcionar no QGIS 3.8. O formulário de processamento não será executado sem ajustar todas as outras configurações. Erro: "Valor do parâmetro incorreto ou ausente: ...."
geordie

11

Eu encontrei uma solução para isso. Primeiro, converto a imagem em uma camada vrt (gdalbuildvrt) com -srcnodata 0, depois a converto novamente em um arquivo tif com gdal_translate -a_nodata. Funcionou bem! :)


8

Eu acho que você pode fazer isso com a calculadora raster .

Caso contrário, com a ajuda do plugin GRASS e do r.null, você o fará facilmente. Essa opção significa que você precisará primeiro criar um conjunto de mapas GRASS para importar sua varredura.


5
você poderia elaborar como fazer isso com a calculadora raster?
Rudivonstaden

1
r.nullfez isso por mim.
metasequoia

8

Tendo o mesmo problema, no final, usei o Python diretamente - você pode precisar ajustar o numpy.where para seu objetivo específico. No caso abaixo, os valores de pixel são mantidos como são se forem> = 0, todos os outros pixels - nesse caso, são apenas os que possuem o valor sem dados - são definidos como "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()


1

O que funcionou para mim foi exportar a varredura como arquivo .asc, abrir em um editor de texto e usar localizar e substituir para substituir o antigo valor NoData pelo valor que eu queria.


1

No meu caso, era uma imagem de satélite que eu precisava converter para 8 bits e não produzia nenhum valor de dados ao usar -scale no gdal_translate.

Consegui resolver o problema exportando a varredura (camada com o botão direito do mouse -> exportar -> salvar camada como ...) para um novo arquivo como dados renderizados (caixa de seleção na parte superior da janela da caixa de diálogo).


0

Para script python, você pode usar a seguinte linha antes do WriteArray.

maskband.SetNoDataValue(0)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.