Impossível somar rasters por causa de pixels nodata

11

Eu tenho um conjunto de rasters (.vrt) com dados diários de umidade do solo. Quero somar os pixels de todos os rasters para ter uma medida por mês. No entanto, o mundo inteiro não é coberto todos os dias, o que resulta em valores nodata em locais onde as medidas existem nos outros dias.

O que eu quero fazer é somar os valores de cada raster. No entanto, parece que cada vez que um pixel nodata está na soma, o pixel resultante é categorizado diretamente como nodata. Eu gostaria de ter o oposto: ignorando todos os valores nodata e somando o resto.

Pensei em duas maneiras de resolver o problema:

  1. somando rasters ignorando valores nodata
  2. conversão de pixels nodata no valor 0 e, em seguida, somar todas as rasters

insira a descrição da imagem aqui

Infelizmente, não consigo encontrar nenhuma ferramenta para fazer isso.

Alguém pode me ajudar?

Damien
fonte
Eu me pergunto o quão interpretável será o resultado: afinal, as somas não incluirão os valores para os dias ausentes, indicando que eles terão um viés baixo em várias quantidades, dependendo da quantidade de dados ausentes. Se houver uma quantidade considerável de dados ausentes, considere imputar ou prever os valores nas células ausentes e executar a soma.
whuber
1
Obrigado por este comentário. Perguntei aos gerentes dos dados e eles disseram que calculavam o valor médio somando todos os dados disponíveis, depois dividiam pelo número de dias no mês em que as observações estavam disponíveis naquele pixel.
Damien
2
Isso é idêntico à média local de uma pilha de rasters em que o GIS é instruído apenas para ignorar todas as células NoData, o que sugere outro caminho a seguir. A propósito, esse procedimento ainda é potencialmente tendencioso quando as observações ausentes são correlacionadas com os valores. Por exemplo, quando faltam dados devido à cobertura de nuvens, é plausível que nesses dias a umidade do solo possa ser maior (em média) do que o normal.
whuber
1
Tudo bem, eu apenas testei a ferramenta de estatística de células com o 'ignorar nodata' marcado e ele faz exatamente o que eu queria. Estou ciente das deficiências desse método. No entanto, meu trabalho é em grande escala, tanto no espaço quanto no tempo, então suponho que esses vieses serão menos importantes. De qualquer forma, eu realmente não tenho muita escolha de dados.
Damien
A escala não estará relacionada à quantidade de viés. A importância do viés depende do tamanho e da sensibilidade da sua aplicação. Embora você possa não ser capaz de fazer qualquer coisa sobre os dados, você não tem controle sobre os procedimentos para analisá-los. Existem várias maneiras de melhorar este. Entre suas opções, estão interpolando ao longo do tempo e regredindo contra covariáveis ​​que podem estar correlacionadas com a umidade do solo e estão disponíveis mesmo nas datas que faltam. (Há todo um ramo de estatísticas dedicadas a "imputação" valores perdidos.)
whuber

Respostas:

1

Se você tiver acesso ao ArcGIS, a ferramenta Cell Statistics tem o opcional de ignorar os nodata que você soma \ mean \ min \ max suas rasters.

Hornbydd
fonte
Se você modificar esta resposta para substituir "soma" por "média", ela estará correta: consulte o tópico de comentários da pergunta pelo motivo.
whuber
A soma foi apenas uma parte do meu problema, pois quero obter o valor médio. Acabei de verificar e a ferramenta de estatística Cell também é a maneira mais fácil de somar rasters, independentemente dos pixels dos nodatas.
Damien
11

Primeiramente, você pode usar gdal_calc.py para alterar todos -9999 para 0 e definir o valor NoData como 0.

Por exemplo:

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

Em seguida, você pode ignorar o valor NoData usando gdal_translate com a opção -a_nodata seguida por none .

-a_nodata value :

Atribua um valor nodata especificado às bandas de saída. A partir do GDAL 1.8.0, pode ser definido como nenhum para evitar a configuração de um valor nodata no arquivo de saída, se houver algum para o arquivo de origem

Exemplo:

gdal_translate -a_nodata none input_with_NoData.tif output_without_NoData.tif
Antonio Falciano
fonte
Obrigado pela dica. Joguei um pouco com o parâmetro -a_nodata e consigo ter o valor de -9999 em vez de NULL. No entanto, ainda preciso alterar todos os -9999 pixels para 0 #
Damien
1
Você pode usar o gdal_calc.py para alterar todos os -9999 para 0 antes de aplicar gdal_translate -a_nodata none .... Por exemplo: gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --type=Int16 --calc="A+9999*(A==-9999)" --NoDataValue=0
Antonio Falciano 16/10
Eu tentei vários comandos, mas realmente acho que tenho um problema com o gdal_calc.py. Por exemplo, tentei adicionar 1 a toda a varredura ( i.imgur.com/WiZG7MC.png ) e obtive esse erro do Maxrepeat. Não entendi, executei o comando diretamente do shell OSGeo e este módulo parece estar corretamente instalado, pois aparece na lista quando abro o shell ( i.imgur.com/fgtMZQZ.png ). Minha instalação está quebrada?
11138 Damien
Parece um problema de regex ... Tente alterar seu diretório de trabalho usando o cdcomando e tente novamente apenas para ter -A test.tif.
Antonio Falciano 16/10
1
Funciona para mim, mas eu instalei tudo isso através do instalador do OSGeo4W . Em vez disso, vejo que você instalou o QGIS por meio do instalador independente. Portanto, tente atualizar / atualizar sua configuração.
Antonio Falciano 16/10
5

Em R:

library(raster)
s <- stack('file1', 'file2', ...)
ss <- sum(s, na.rm=TRUE)
Robert Hijmans
fonte
Você poderia adicionar uma explicação a este código (se você o escreveu) ou um link para onde o encontrou, com um breve resumo do site?
Paul
1
O exemplo acima carrega primeiro o pacote raster e, em seguida, cria uma "pilha" (uma matriz tridimensional de arquivos raster de extensão e resolução idênticas, onde cada arquivo se torna uma fatia dessa pilha), compreendendo os arquivos indicados pelos nomes de arquivo separados por vírgula . A linha final executa somas por célula em todas as fatias da pilha s, com o argumento na.rm=TRUEresultando em NAvalores sendo ignorados. Objeto de saída ssé um rasterobjeto que pode ser exportado com writeRaster(consulte ?writeRaster). (@RobertH é o criador do R rasterpacote.)
jbaums
1

A Ferramenta Condicional no Spatial Analyst é uma maneira fácil de converter valores nulos em zeros. Então, tomar as somas deve ser rápido.

brock
fonte
Obrigado por sua resposta. Segui este post: support.esri.com/fr/knowledgebase/techarticles/detail/34932 e consegui converter todos os pixels nulos em 0. No entanto, eu gostaria de poder fazer essa operação para todas as rasters dentro de um diretório. Os 'Reclassificar valores da grade' no QGIS parecem capazes de fazer isso, mas tudo o que não sei como funciona. Eu escolho o método "Tabela simples" e peço que defina nulo como 0 e não altere outros valores, mas a varredura resultante varia de -0,99 a 0,08, enquanto originalmente se estende de 428 a 3491
Damien
Você pode postar um trecho da sua varredura original em algum lugar, para que possamos dar uma olhada?
Til15 15/10
2
Se você clicar com o botão direito na ferramenta, poderá executar um processo em lote em quantos arquivos desejar, ou seja, em um diretório inteiro.
brock
Obrigado pela sua resposta. No entanto, posso converter todos os NULLs em 0 para um único arquivo usando 'analista espacial / álgebra de mapas / calculadora Raster'. Se eu clicar com o botão direito nessa ferramenta, posso criar um diretório em lote, mas qual será a sintaxe para levar em conta cada arquivo automaticamente? ( i.imgur.com/aYaUCzz.png )
Damien
Dei uma olhada na ferramenta 'analista espacial / Reclass / Reclassify' e ela faz exatamente o que eu quero. Consegui usar a janela de lote para processar vários arquivos de uma só vez. Tenho um último problema: se clicar com o botão direito do mouse / preencher o 'output raster', ele copiará os mesmos arquivos de saída para todos os rasters de entrada. Como posso fazer para criar uma saída diferente para cada entrada? ( i.imgur.com/jzTI2x9.png )
Damien
1

Eu tive o mesmo problema há um tempo atrás e consegui resolvê-lo.

Assim como uma observação sobre a exibição dos valores de nodata no QGIS: os valores de nodata são sempre mostrados como valores de nodata na janela do mapa e ao usar a ferramenta "informações do objeto", não importa se eles realmente têm o valor -9999, 0, NULL etc. Portanto, após a reclassificação dos valores de nodata para 0, se você selecionar as configurações da camada, encontrará nos metadados que os nodata têm o valor 0.

Finalmente encontrei a ferramenta perfeita para a missão, o GRASS r.series. Com a configuração "operação agregada" "máximo" e os "NULLs de propagação" desmarcados, a ferramenta criará uma Camada que atenda às suas necessidades.

Miron
fonte
0

Lembro-me de ter esse problema há um tempo. Como solução, acho que fiz +1 em todas as células da varredura, adicionei os rasters juntos e fiz uma subtração final (de quantos + 1s você adicionou). É bem grosseiro, mas se o trabalho for feito ...!

Como alternativa, use os 'Reclassificar valores da grade' na caixa de ferramentas Processando no QGIS para converter seus valores nulos em zero.

Rob Lodge
fonte
Olá, tentei várias maneiras de usar a ferramenta 'reclassificar valores de grade' sem sucesso. Comecei em uma varredura onde converti todos os pixels NULL para -9999. Tentei reclassificar usando o método [0] single e defina 'old value = -9999', 'new value = 0.0', 'operator: [0] =', mas tudo o que recebo é uma varredura cheia de 'nan' píxeis. O que estou fazendo de errado?
Damien