Por que o slot @ data @ values ​​do RasterLayer contém apenas valores lógicos (0) e não os reais?

12

Tentando entender o porquê, quando leio em uma varredura de NDVI, o slot @ data @ values ​​não contém os valores reais até que eu os defina manualmente. Por exemplo:

    NDVI <- raster("./filename.tif", crs="+proj=longlat +datum=WGS84")
    NDVI@data@values
            ## returns: logical(0)

Isso não aconteceu com outros rasters carregados pelo mesmo método, por isso estou confuso. Gostaria de poder ser mais específico, mas não me lembro de ter feito algo diferente antes. É fácil obter os valores manualmente, usando:

    NDVI1@data@values <- getValues(NDVI19east)

Mas ainda é difícil ter que fazer isso para cada arquivo. Então, pergunta em duas partes:

  1. Por que isso aconteceu em primeiro lugar? Entendo que poderia ter algo a ver com o armazenamento do arquivo raster (ou seja, na memória ou não), mas não consigo entender como isso altera os métodos que devo usar para acessar os dados ...

  2. Existe uma maneira de automatizar esse processo (talvez usando um método semelhante ao lapply) para ler arquivos como RasterLayers e acessar valores para esses arquivos? Meu projeto atual envolve a leitura de 6 a 10 arquivos por vez para NDVI, Rainfall e outras variáveis ​​ambientais, a fim de combiná-los e executar algumas sobreposições ponderadas. Seria útil automatizar o processo de importação dos dados.

Henry Hawkins Wells
fonte
6
Não use @, a menos que esteja desenvolvendo código interno - use readAll (NDVI). Isso acontece como uma técnica de eficiência de memória; você pode abrir grades muito grandes como uma promessa - a varredura promete extrair os dados (via rgdal, via GDAL neste caso) quando você realmente precisar dos números. Se você precisar salvar o objeto como um objeto R independente, não vinculado a um arquivo readAll, é a maneira de fazê-lo. Veja? Raster "Em muitos casos ... (inicialmente) não contém nenhum valor de célula (pixel) em (RAM)"
mdsumner 12/06/2015
2
de logical(0)fato, é o valor para qualquer objeto Raster * criado a partir de um arquivo. De qualquer forma, como diz o @mdsumner, não leia esses valores diretamente e certamente não os defina! (embora você NDVI1@data@values <- getValues(NDVI19east)não afete nada , esses valores são ignorados). Provavelmente é mais abaixo do seu script que você não entende como usar efetivamente esses objetos. Você pode usar getValues, mas mesmo isso raramente é necessário. Forneça um exemplo simples e independente do que você está tentando alcançar.
Robert Hijmans
2
Muito obrigado a todos. Acabei realizando o que precisava com readAll () como o mdsumner disse, então obrigado por isso - foi um bom conselho! Eu era novo no pacote raster recentemente, então sinceramente ainda não estava ciente dessa função e da necessidade de usá-la para acessar os valores reais de arquivos grandes.
Henry Hawkins Wells

Respostas:

3

Esta pergunta foi respondida nos comentários (por mdsummer ). Essa é apenas uma maneira de colocar essas idéias em ordem e tirar essa pergunta da fila sem resposta.

Aqui você pode baixar o NVDI de jpg do mundo inteiro da NASA .

Aqui você tem o código e um arquivo raster para testar .

Como mostrado na pergunta, carregar a varredura no R com a função raster () não carrega os valores reais na memória.

insira a descrição da imagem aqui

Como você vê, os valores NVDI @ data @ não têm valores enquanto a plotagem pode ser renderizada mostrando esses valores "hiden". Você pode ver que, se você carregar o arquivo no QGIS, os valores serão realmente lidos.

insira a descrição da imagem aqui

Portanto, você precisa usar a função readAll () do pacote raster (como mdsummer disse nos comentários). Aqui está o código:

library(raster)

NDVI <- raster("./RenderData.tif", crs="+proj=longlat +datum=WGS84")
NDVI@data@values
str(NDVI)
plot(NDVI)

NDVI.all <- readAll(NDVI)
head(NDVI.all@data@values)

Usando esta função, agora você pode acessar os valores de varredura no arquivo.

insira a descrição da imagem aqui

César Arquero
fonte