Чому слот @ data @ значень для RasterLayer містить лише логічні (0), а не фактичні значення?


12

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

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

Це не сталося з іншими растрами, які я завантажував тим самим методом, тому я плутаюся. Я б хотів, щоб я був більш конкретним, але не пам’ятаю, що раніше робив щось інакше. Досить просто отримати значення вручну, використовуючи:

    NDVI1@data@values <- getValues(NDVI19east)

Але все ж болісно робити це для кожного файлу. Отже, запитання з двох частин:

  1. Чому це сталося в першу чергу? Я розумію, що це може мати щось спільне з тим, як зберігається растровий файл (тобто, чи є він у пам'яті чи ні), але я не можу реально зрозуміти, як це змінює методи, які я повинен використовувати для доступу до даних ...

  2. Чи є спосіб автоматизувати цей процес (можливо, використовуючи метод, схожий на помилково) для читання файлів як RasterLayers та доступу до значень для цих файлів? Мій поточний проект передбачає читання 6-10 файлів одночасно для NDVI, Rainfall та інших змінних довкілля, щоб поєднати їх та виконати кілька зважених накладок. Було б корисно автоматизувати процес імпорту даних.


6
Не використовуйте @, якщо ви не розробляєте внутрішній код - використовуйте readAll (NDVI). Це відбувається як техніка ефективності пам’яті, ви можете відкривати дуже великі сітки як вид обіцянки - растрові обіцяє втягувати дані (через rgdal, через GDAL в цьому випадку), коли вам справді потрібні цифри. Якщо вам потрібно зберегти об'єкт як окремий об'єкт R, не прив'язаний до файлу readAll, це зробити це. Дивіться? Растр "У багатьох випадках ... не містить (спочатку) ніяких значень комірок (пікселів) у (ОЗУ)"
mdsumner

2
logical(0)в дійсності значення для будь-якого растрового * об'єкт , створений з файлу. Так чи інакше, як говорить @mdsumner, не читайте безпосередньо ці значення і, звичайно, не встановлюйте їх! (хоча ваш NDVI1@data@values <- getValues(NDVI19east)вплив нічого не вплине , ці значення ігноруються). Це, мабуть, далі ваш сценарій, де ви не розумієте, як ефективно використовувати ці об'єкти. Ви можете використовувати getValues, але навіть це рідко потрібно. Наведіть простий, самодостатній приклад того, чого ви намагаєтесь досягти.
Роберт Хіджманс

2
Велике спасибі всім Я закінчив виконати те, що мені потрібно було з readAll (), як сказав mdsumner, тож спасибі за це - це була гарна порада! Нещодавно я був новаком у растровому пакеті, тому, чесно кажучи, ще не знав про цю функцію та необхідність використовувати її для доступу до фактичних значень великих файлів.
Генрі Хокінс Уеллс

Відповіді:


3

На це запитання відповіли в коментарях ( mdsummer ). Це лише спосіб впорядкувати ці ідеї і вивести це питання з черги без відповіді.

Тут ви можете завантажити NVDI по всьому світу jpg від nasa .

Тут ви маєте код та растровий файл для випробування .

Як показано в питанні, завантаження растра в R за допомогою функції raster () не завантажує фактичні значення в пам'ять.

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

Як бачите, значення NVDI @ data @ не мають значень, в той час як графік може бути відображений, показуючи ці "приховані" значення. Ви можете бачити, що якщо ви завантажуєте файл у 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)

За допомогою цієї функції тепер ви можете отримати доступ до значень растру у файлі.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.