Warum enthält der Slot @ data @ values ​​für RasterLayer nur logische (0) und nicht die tatsächlichen Werte?

12

Ich versuche herauszufinden, warum der Slot @ data @ values ​​beim Einlesen eines NDVI-Rasters erst dann die tatsächlichen Werte enthält, wenn ich sie manuell einstelle. Beispielsweise:

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

Dies ist bei anderen Rastern, die ich mit der gleichen Methode geladen habe, nicht geschehen, daher bin ich verwirrt. Ich wünschte, ich könnte spezifischer sein, aber ich erinnere mich nicht, dass ich vorher etwas anderes gemacht hätte. Es ist einfach genug, die Werte manuell abzurufen, indem Sie Folgendes verwenden:

    NDVI1@data@values <- getValues(NDVI19east)

Aber es ist immer noch eine Qual, dies für jede Datei tun zu müssen. Also, zweiteilige Frage:

  1. Warum geschah das überhaupt? Ich verstehe, dass es etwas damit zu tun haben könnte, wie die Rasterdatei gespeichert wird (dh ob sie sich im Speicher befindet oder nicht), aber ich kann nicht wirklich verstehen, wie dies die Methoden ändert, die ich für den Zugriff auf die Daten verwenden sollte ...

  2. Gibt es eine Möglichkeit, diesen Prozess zu automatisieren (möglicherweise mithilfe einer ähnlichen Methode wie lapply), um Dateien als RasterLayers zu lesen und auf Werte für diese Dateien zuzugreifen? In meinem aktuellen Projekt werden jeweils 6-10 Dateien für NDVI, Rainfall und andere Umgebungsvariablen gelesen, um sie zu kombinieren und einige gewichtete Überlagerungen durchzuführen. Es wäre hilfreich, den Import der Daten zu automatisieren.

Henry Hawkins Wells
quelle
6
Verwenden Sie @ nur, wenn Sie internen Code entwickeln - verwenden Sie readAll (NDVI). Dies geschieht als Speichereffizienz-Technik. Sie können sehr große Raster als eine Art Versprechen öffnen - Raster verspricht, die Daten (in diesem Fall über rgdal, über GDAL) einzuholen, wenn Sie die Zahlen tatsächlich benötigen. Wenn Sie das Objekt als eigenständiges R-Objekt speichern müssen, das nicht an eine Datei gebunden ist, können Sie dies mit readAll tun. Siehe? Raster "In vielen Fällen ... enthält (anfangs) keine Zellen- (Pixel-) Werte in (RAM)"
mdsumner
2
das logical(0)ist der Wert für in der Tat jeder Raster * Objekt aus einer Datei erstellt. Wie @mdsumner sagt, lesen Sie diese Werte in beiden Fällen nicht direkt und setzen Sie sie auf keinen Fall! (obwohl Ihr NDVI1@data@values <- getValues(NDVI19east)keinen Einfluss auf irgendetwas , werden diese Werte ignoriert). Es ist wahrscheinlich weiter unten in Ihrem Skript, wo Sie nicht verstehen, wie Sie diese Objekte effektiv verwenden können. Sie können getValues ​​verwenden, aber auch das ist selten notwendig. Geben Sie ein einfaches, in sich geschlossenes Beispiel für das, was Sie erreichen möchten.
Robert Hijmans
2
Vielen Dank an alle. Am Ende habe ich mit readAll () das erreicht, was ich brauchte, wie mdsumner sagte. Vielen Dank dafür - es war ein guter Rat! Ich war seit kurzem neu im Raster-Paket, daher war mir diese Funktion und die Notwendigkeit, sie für den Zugriff auf die tatsächlichen Werte großer Dateien zu verwenden, noch nicht bewusst.
Henry Hawkins Wells

Antworten:

3

Diese Frage wurde in den Kommentaren beantwortet (von mdsummer ). Dies ist nur ein Weg, um diese Ideen in Ordnung zu bringen und diese Frage aus der unbeantworteten Warteschlange zu bekommen.

Hier können Sie die NVDI von jpg von der NASA herunterladen .

Hier haben Sie den Code und eine Rasterdatei zum Ausprobieren .

Wie in Frage gezeigt, werden beim Laden des Rasters in R mit der Funktion raster () die tatsächlichen Werte nicht in den Speicher geladen.

Bildbeschreibung hier eingeben

Wie Sie sehen, hat NVDI @ data @ -Werte keine Werte, während der Plot mit diesen "erweiterten" Werten gerendert werden kann. Sie sehen, dass beim Laden der Datei in QGIS die Werte tatsächlich gelesen werden.

Bildbeschreibung hier eingeben

Sie müssen also die Funktion readAll () aus dem Raster-Paket verwenden (wie in den Kommentaren von mdsummer angegeben ). Hier ist der 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)

Mit dieser Funktion können Sie jetzt auf die Rasterwerte in der Datei zugreifen.

Bildbeschreibung hier eingeben

César Arquero
quelle