Почему слот @ data @ values ​​для RasterLayer содержит только логические (0), а не фактические значения?

12

Попытка понять, почему, когда я читаю в растре NDVI, слот @ data @ values ​​не содержит фактических значений, пока я не установлю их вручную. Например:

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

Этого не произошло с другими растрами, которые я загружал тем же способом, поэтому я запутался. Я хотел бы быть более конкретным, но я не помню, чтобы что-то делал иначе. Достаточно просто получить значения вручную, используя:

    NDVI1@data@values <- getValues(NDVI19east)

Но все равно это сложно сделать для каждого файла. Итак, вопрос из двух частей:

  1. Почему это произошло в первую очередь? Я понимаю, что это может быть связано с тем, как хранится растровый файл (т.е. находится ли он в памяти или нет), но я не могу понять, как это меняет методы, которые я должен использовать для доступа к данным ...

  2. Есть ли способ автоматизировать этот процесс (возможно, используя метод, аналогичный lapply) для чтения файлов как RasterLayers и доступа к значениям для этих файлов? Мой текущий проект предполагает чтение 6-10 файлов одновременно для NDVI, Rainfall и других переменных среды, чтобы объединить их и выполнить некоторые взвешенные наложения. Было бы полезно автоматизировать процесс импорта данных.

Генри Хокинс Уэллс
источник
6
Не используйте @, если вы не разрабатываете внутренний код - используйте readAll (NDVI). Это происходит в качестве метода повышения эффективности памяти, вы можете открывать очень большие сетки как своего рода обещание - растр обещает получить данные (через rgdal, через GDAL в данном случае), когда вам действительно нужны числа. Если вам нужно сохранить объект как отдельный объект R, не привязанный к файлу, readAll - способ сделать это. См. Растр «Во многих случаях ... не содержит (изначально) значений ячеек (пикселей) в (RAM)»
mdsumner
2
logical(0)в действительности значение для любого растрового * объект , созданный из файла. В любом случае, как говорит @mdsumner, не читайте эти значения напрямую и, конечно, не устанавливайте их! (хотя NDVI1@data@values <- getValues(NDVI19east)это ни на что не повлияет , эти значения игнорируются). Вероятно, дальше по сценарию вы не понимаете, как эффективно использовать эти объекты. Вы можете использовать getValues, но даже это редко необходимо. Предоставьте простой, автономный пример того, чего вы пытаетесь достичь.
Роберт Хейманс
2
Спасибо всем большое. Я закончил тем, что выполнил то, что мне нужно было с readAll (), как сказал mdsumner, так что спасибо за это - это был хороший совет! Я был новичком в растровом пакете с недавнего времени, поэтому я, честно говоря, еще не знал об этой функции и необходимости использовать ее для доступа к фактическим значениям больших файлов.
Генри Хокинс Уэллс

Ответы:

3

На этот вопрос ответили в комментариях (от mdsummer ). Это просто способ привести эти идеи в порядок и вывести этот вопрос из очереди без ответа.

Здесь вы можете скачать NVDI jpg по всему миру из НАСА .

Здесь у вас есть код и растровый файл для тестирования .

Как показано в вопросе, загрузка растра в R с помощью функции raster () не загружает фактические значения в память.

введите описание изображения здесь

Как вы видите, NVDI @ data @ values ​​не имеет значений, в то время как график может быть отображен, показывая эти «скрытые» значения. Вы можете видеть, что, если вы загружаете файл в QGIS, значения фактически читаются.

введите описание изображения здесь

Итак, вы должны использовать функцию readAll () из растрового пакета (как сказано в комментариях mdsummer ). Вот код:

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)

Используя эту функцию, вы теперь можете получить доступ к значениям растра в файле.

введите описание изображения здесь

Сезар Аркеро
источник