Pourquoi l'emplacement @ data @ values ​​pour RasterLayer contient-il uniquement des valeurs logiques (0) et non les valeurs réelles?

12

En essayant de comprendre pourquoi, lorsque je lis dans un raster de NDVI, l'emplacement @ data @ values ​​ne contient pas les valeurs réelles jusqu'à ce que je les définisse manuellement. Par exemple:

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

Cela ne s'est pas produit avec d'autres rasters que j'avais chargés par la même méthode, donc je suis confus. J'aimerais pouvoir être plus précis mais je ne me souviens pas avoir fait autre chose auparavant. Il est assez facile d'obtenir les valeurs manuellement en utilisant:

    NDVI1@data@values <- getValues(NDVI19east)

Mais c'est toujours pénible de devoir le faire pour chaque fichier. Donc, question en deux parties:

  1. Pourquoi est-ce arrivé en premier lieu? Je comprends que cela pourrait avoir quelque chose à voir avec la façon dont le fichier raster est stocké (c'est-à-dire s'il est en mémoire ou non) mais je ne comprends pas vraiment comment cela change les méthodes que je devrais utiliser pour accéder aux données ...

  2. Existe-t-il un moyen d'automatiser ce processus (peut-être en utilisant une méthode similaire à lapply) pour lire des fichiers en tant que RasterLayers et accéder aux valeurs de ces fichiers? Mon projet actuel consiste à lire 6 à 10 fichiers à la fois pour NDVI, Rainfall et d'autres variables environnementales, afin de les combiner et d'effectuer des superpositions pondérées. Il serait utile d'automatiser le processus d'importation des données.

Henry Hawkins Wells
la source
6
N'utilisez @ que si vous développez du code interne - utilisez readAll (NDVI). Cela se produit comme une technique d'efficacité de la mémoire, vous pouvez ouvrir de très grandes grilles comme une sorte de promesse - le raster promet de récupérer les données (via rgdal, via GDAL dans ce cas) lorsque vous avez réellement besoin des chiffres. Si vous devez enregistrer l'objet en tant qu'objet R autonome non lié à un fichier, readAll est le moyen de le faire. Voir? Raster "Dans de nombreux cas ... ne contient (initialement) aucune valeur de cellule (pixel) dans (RAM)"
mdsumner
2
l' logical(0)est en fait la valeur de tout objet * raster créé à partir d' un fichier. Quoi qu'il en soit, comme le dit @mdsumner, ne lisez pas directement ces valeurs et ne les définissez certainement pas! (bien que NDVI1@data@values <- getValues(NDVI19east)cela n'affecte rien , ces valeurs sont ignorées). C'est probablement plus loin dans votre script que vous ne comprenez pas comment utiliser efficacement ces objets. Vous pouvez utiliser getValues, mais même cela est rarement nécessaire. Donnez un exemple simple et autonome de ce que vous essayez d'accomplir.
Robert Hijmans
2
Merci beaucoup. J'ai fini par accomplir ce dont j'avais besoin avec readAll () comme l'a dit mdsumner, alors merci pour cela - c'était un bon conseil! Je connaissais récemment le paquetage raster, donc honnêtement, je n'étais pas encore au courant de cette fonction et de la nécessité de l'utiliser pour accéder aux valeurs réelles des fichiers volumineux.
Henry Hawkins Wells

Réponses:

3

Cette question a été répondue dans les commentaires (par mdsummer ). C'est juste un moyen de mettre ces idées en ordre et de sortir cette question de la file d'attente sans réponse.

Ici vous pouvez télécharger le NVDI mondial de jpg de la nasa .

Ici, vous avez le code et un fichier raster à essayer .

Comme indiqué en question, le chargement du raster dans R avec la fonction raster () ne charge pas les valeurs réelles en mémoire.

entrez la description de l'image ici

Comme vous le voyez, NVDI @ data @ values ​​n'a aucune valeur tandis que le tracé peut être rendu en montrant ces valeurs "cachées". Vous pouvez voir que si vous chargez le fichier dans QGIS, les valeurs sont réellement lues.

entrez la description de l'image ici

Donc, vous devez utiliser la fonction readAll () du package raster (comme l' a dit mdsummer dans les commentaires). Voici le code:

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)

En utilisant cette fonction, vous pouvez maintenant accéder aux valeurs raster dans le fichier.

entrez la description de l'image ici

César Arquero
la source