Perché lo slot @ data @ valori per RasterLayer contiene solo i valori logici (0) e non i valori effettivi?


12

Cercando di arrivare alla fine del perché, quando leggo in un raster di NDVI, lo slot @ data @ valori non contiene i valori effettivi fino a quando non li imposto manualmente. Per esempio:

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

Questo non è accaduto con altri raster che avevo caricato con lo stesso metodo, quindi sono confuso. Vorrei poter essere più specifico, ma non ricordo di aver fatto diversamente prima. È abbastanza facile ottenere i valori manualmente, usando:

    NDVI1@data@values <- getValues(NDVI19east)

Ma è ancora difficile doverlo fare per ogni file. Quindi, domanda in due parti:

  1. Perché questo è accaduto in primo luogo? Capisco che potrebbe avere qualcosa a che fare con il modo in cui viene archiviato il file raster (ovvero se è in memoria o meno) ma non riesco davvero a capire come ciò cambi i metodi che dovrei usare per accedere ai dati ...

  2. C'è un modo per automatizzare questo processo (forse usando un metodo simile a lapply) per leggere i file come RasterLayer e accedere ai valori per quei file? Il mio progetto attuale prevede la lettura di 6-10 file alla volta per NDVI, Rainfall e altre variabili ambientali, al fine di combinarli ed eseguire sovrapposizioni ponderate. Sarebbe utile automatizzare il processo di importazione dei dati.


6
Non usare @ a meno che tu non stia sviluppando codice interno - usa readAll (NDVI). Succede come una tecnica di efficienza della memoria, puoi aprire griglie molto grandi come un tipo di promessa - il raster promette di inserire i dati (via rgdal, in questo caso GDAL) quando hai effettivamente bisogno dei numeri. Se hai bisogno di salvare l'oggetto come un oggetto R autonomo non legato a un file readAll è il modo di farlo. Vedi? Raster "In molti casi ... inizialmente non contiene alcun valore di cella (pixel) in (RAM)"
mdsumner,

2
il logical(0)è infatti il valore di qualsiasi * oggetto raster creato da un file. Ad ogni modo, come dice @mdsumner, non leggi direttamente questi valori e certamente non li settano! (anche se il tuo NDVI1@data@values <- getValues(NDVI19east)non influirà su nulla , questi valori vengono ignorati). Probabilmente è più in basso nello script in cui non si capisce come utilizzare in modo efficace questi oggetti. Puoi usare getValues, ma anche raramente è necessario. Fornisci un esempio semplice e autonomo di ciò che stai cercando di ottenere.
Robert Hijmans,

2
Grazie mille. Ho finito per realizzare ciò di cui avevo bisogno con readAll () come ha detto mdsumner, quindi grazie per quello - è stato un buon consiglio! Recentemente ero stato nuovo nel pacchetto raster, quindi onestamente non ero ancora a conoscenza di quella funzione e della necessità di usarla per accedere ai valori effettivi di file di grandi dimensioni.
Henry Hawkins Wells,

Risposte:


3

A questa domanda è stata data risposta nei commenti (di mdsummer ). Questo è solo un modo per mettere in ordine queste idee e far uscire questa domanda dalla coda senza risposta.

Qui è possibile scaricare NVDI jpg in tutto il mondo dalla NASA .

Qui hai il codice e un file raster da provare .

Come mostrato nella domanda, il caricamento del raster in R con la funzione raster () non carica i valori effettivi in ​​memoria.

inserisci qui la descrizione dell'immagine

Come vedi, i valori NVDI @ data @ non hanno valori mentre il grafico può essere visualizzato mostrando quei valori "hiden". Puoi vedere che, se carichi il file in QGIS, i valori vengono effettivamente letti.

inserisci qui la descrizione dell'immagine

Quindi, devi usare la funzione readAll () dal pacchetto raster (come ha detto mdsummer nei commenti). Ecco il codice:

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)

Utilizzando questa funzione è ora possibile accedere ai valori raster all'interno del file.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.