为什么RasterLayer的@ data @ values插槽仅包含逻辑(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,降雨和其他环境变量,以将它们组合并执行一些加权叠加。自动化导入数据的过程将很有帮助。


6
除非正在开发内部代码,否则不要使用@-使用readAll(NDVI)。它作为一种内存效率技术发生,您可以打开一个非常大的网格,这是一个承诺-光栅承诺在您实际需要数字时(通过rgdal,在这种情况下,通过GDAL)拉入数据。如果需要将对象另存为独立的R对象而不与文件绑定,则readAll是这样做的方法。请参阅?raster“在许多情况下
……

2
logical(0)实际上,这是从文件创建的任何 Raster *对象的值。就像@mdsumner所说的那样,无论哪种方式都不要直接读取这些值,当然也不要设置它们!(尽管您NDVI1@data@values <- getValues(NDVI19east)不会影响任何值,但这些值将被忽略)。可能是在脚本的更深处,您不了解如何有效使用这些对象。您可以使用getValues,但即使那样也很少需要。提供一个简单,独立的示例,说明您要实现的目标。
罗伯特·希曼斯

2
非常感谢。正如mdsumner所说,我最终用readAll()完成了所需的工作,因此,谢谢您-这是一个很好的建议!我最近刚接触光栅包,所以老实说我还不知道该功能以及使用它访问大型文件实际值的需要。
亨利·霍金斯·韦尔斯2015年

Answers:


3

这个问题已经在注释中得到了回答(由mdsummer回答)。这只是使这些想法井井有条,使这个问题脱离未解决的队列的一种方法。

在这里,您可以从nasa下载world.jpg的NVDI

在这里,您有代码和要试用的栅格文件

如问题所示,使用raster()函数将栅格加载到R中不会将实际值加载到内存中。

在此处输入图片说明

如您所见,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)

使用此功能,您现在可以访问文件中的栅格值。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.