Dlaczego szczelina @ data @ wartości dla RasterLayer zawiera tylko logiczne (0), a nie rzeczywiste wartości?

12

Próbuję zrozumieć, dlaczego, kiedy czytam w rastrze NDVI, gniazdo @ data @ wartości nie zawiera rzeczywistych wartości, dopóki nie ustawię ich ręcznie. Na przykład:

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

Nie stało się tak z innymi rastrami, które załadowałem tą samą metodą, więc jestem zdezorientowany. Chciałbym być bardziej konkretny, ale nie pamiętam, żeby robić wcześniej inaczej. Łatwo jest uzyskać wartości ręcznie, używając:

    NDVI1@data@values <- getValues(NDVI19east)

Ale wciąż jest to trudne, gdy trzeba to zrobić dla każdego pliku. Pytanie dwuczęściowe:

  1. Dlaczego tak się stało? Rozumiem, że to może mieć coś wspólnego ze sposobem przechowywania pliku rastrowego (tj. Czy jest w pamięci, czy nie), ale tak naprawdę nie rozumiem, jak to zmienia metody dostępu do danych ...

  2. Czy istnieje sposób na zautomatyzowanie tego procesu (być może przy użyciu metody podobnej do lapply) do odczytu plików jako RasterLayers i uzyskiwania dostępu do wartości dla tych plików? Mój obecny projekt polega na czytaniu 6–10 plików jednocześnie dla NDVI, opadów deszczu i innych zmiennych środowiskowych, w celu ich połączenia i wykonania ważonych nakładek. Pomocne byłoby zautomatyzowanie procesu importowania danych.

Henry Hawkins Wells
źródło
6
Nie używaj @, chyba że tworzysz wewnętrzny kod - użyj readAll (NDVI). Zdarza się to jako technika wydajności pamięci, możesz otwierać bardzo duże siatki jako rodzaj obietnicy - raster obiecuje pobrać dane (w tym przypadku rgdal, przez GDAL), kiedy faktycznie potrzebujesz liczb. Jeśli chcesz zapisać obiekt jako samodzielny obiekt R niepowiązany z plikiem, readAll jest na to sposobem. Zobacz? Raster „W wielu przypadkach (początkowo) nie zawiera żadnych wartości komórek (pikseli) w (RAM)”
mdsumner
2
logical(0)jest w rzeczywistości wartość dla każdej Raster * obiektu utworzonego z pliku. Tak czy inaczej, jak mówi @mdsumner, nie czytaj bezpośrednio tych wartości, a na pewno ich nie ustawiaj! (chociaż NDVI1@data@values <- getValues(NDVI19east)nie wpłyniesz na nic , te wartości są ignorowane). Prawdopodobnie w dalszej części skryptu nie rozumiesz, jak skutecznie korzystać z tych obiektów. Możesz użyć getValues, ale nawet to rzadko jest konieczne. Podaj prosty, samodzielny przykład tego, co próbujesz osiągnąć.
Robert Hijmans
2
Dziękuję bardzo. Skończyło się to tym, czego potrzebowałem za pomocą readAll (), jak powiedział mdsumner, więc dzięki za to - to była dobra rada! Od niedawna jestem nowy w pakiecie rastrowym, więc szczerze mówiąc, nie byłem jeszcze świadomy tej funkcji i potrzeby używania jej do uzyskiwania dostępu do rzeczywistych wartości dużych plików.
Henry Hawkins Wells,

Odpowiedzi:

3

Odpowiedź na to pytanie znajduje się w komentarzach (autor: mdsummer ). To tylko sposób na uporządkowanie tych pomysłów i usunięcie tego pytania z kolejki bez odpowiedzi.

Tutaj możesz pobrać NVDI z całego świata z jpg z nasa .

Tutaj masz kod i plik rastrowy do wypróbowania .

Jak pokazano w pytaniu, załadowanie rastra do R za pomocą funkcji raster () nie powoduje załadowania rzeczywistych wartości do pamięci.

wprowadź opis zdjęcia tutaj

Jak widać, wartości NVDI @ data @ nie mają żadnych wartości, podczas gdy wykres można renderować z pokazaniem tych „ukrytych” wartości. Możesz zobaczyć, że jeśli załadujesz plik do QGIS, wartości zostaną odczytane.

wprowadź opis zdjęcia tutaj

Musisz więc użyć funkcji readAll () z pakietu rastrowego (jak mdsummer powiedział w komentarzach). Oto kod:

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)

Za pomocą tej funkcji można teraz uzyskać dostęp do wartości rastrowych w pliku.

wprowadź opis zdjęcia tutaj

César Arquero
źródło