为什么我们使用函数calc和stack来做栅格计算?这比直接使用我们的欲望函数更好吗?

问题描述

最近,我需要计算 12 个世界气候栅格图层的平均值。我们有两种方法可以做到。第一个更直接:

mean.layer <- mean(L1,L2,......,L12) # L1 means the first layer

mean.layer <- (L1+L2+......+L12)/12

一个对我来说是新的:

layer.stack <- stack(L1,L12)
mean.layer <- calc(layer.stack,mean,na.rm = T)

有人可以解释一下使用 calcstack 而不是直接使用 mean 函数的优势吗?据我所知,我们可以直接操作相同分辨率和扩展名的栅格数据


2021.7.10 已编辑。我重写了第二种方法来纠正一些错误输入。

解决方法

请务必包含一些示例数据

library(raster)
b <- stack(system.file("external/rlogo.grd",package="raster"))

这两个语句是等价的

x <- mean(b)
y <- calc(b,mean)

但是 calc 有一个文件名参数,因此您可以一步将结果保存到磁盘。

calc 在处理大型栅格和更复杂的函数时特别有利。例如

z1 <- calc(b,function(i) 100 - sqrt(mean(i + 10)))

相当于这个

z2 <- 100 - sqrt(mean(b + 10))

但是后者可能需要写4个临时文件来存储这些值,而前者只需要1个这样的文件。

你应该避免像这样获得均值的方法

 mean.layer <- (L1+L2+......+L12)/12

编写起来很麻烦,容易出错,而且无法缩放(想象一下,为 1200 个栅格执行此操作!)。

我不知道您在哪里找到了问题中带有 calc 的公式,但这毫无意义,而且不起作用。