如何使用 terra r 包创建最大价值复合材料?

How to create maximum value composite using terra r package?

我想通过从栅格堆栈的每个波段中获取最大值来创建最大值复合栅格。我正在使用以下代码

library(terra)
library(RStoolbox)

rast1 <- rast(lsat)

#Create two raster stacks
rast2 <- rast(lsat)
random_nums <- runif(length(rast2), min = 0.3, max = 0.5) # a set of random numbers the size of the image
rast2[] <- rast2[] + random_nums 

rast3 <- rast(lsat)
random_nums <- runif(length(rast3), min = 0.1, max = 0.4) # a set of random numbers the size of the image
rast3[] <- rast3[] - random_nums 

#Create a stack of all the rasters
s <- c(rast1, rast2, rast3)

#Create a maximum value composite 
b1 <- tapp(s, index=c(1,8,15,2,9,16,3,10,17,4,11,18,5,12,19,6,13,20,7,14,21), 
           fun=max)
b1

现在它给了我 21 层。但是输出应该有 7 个波段,每个波段由 rast1、rast2 和 rast3 中的最大值组成,即 b1 的 band1 应该取 rast1、2 和 3 的 band1 中的最大值。b2 到 b7 也是如此。

示例数据

library(terra)
r1 <- rast(ncol=10, nrow=10, nlyr=7)
set.seed(1)
r1 <- init(r1, runif)
r2 <- init(r1, runif)
r3 <- init(r1, runif)

获得平行最大像元值(SpatRaster 中每个像元和每一层的最大值)的最直接方法:

m1 <- max(r1, r2, r3)

或者创建一个 SpatRasterDataset 并使用 app

d <- sds(r1, r2, r3)
m2 <- app(d, max)

我不推荐它,因为它不必要地复杂,但是你 可以 也可以用 tapp 这样做:

i <- rep(1:7, 3)
i
# [1] 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7
s <- c(r1, r2, r3)
m3 <- tapp(s, i, fun=max)

m3
#class       : SpatRaster 
#dimensions  : 10, 10, 7  (nrow, ncol, nlyr)
#resolution  : 36, 18  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84 
#source      : memory 
#names       :             X1,             X2,             X3,             X4,             X5,             X6, ... 
#min values  :   1.808664e-01,   0.000000e+00,  2.803072e-309, -6.884876e-311,   0.000000e+00,   0.000000e+00, ... 
#max values  :   9.926841e-01,  3.131513e-294,  1.536768e+277,  3.202245e+307,  3.046950e+294,  1.047578e+296, ... 

请注意,具有相同索引的层被分组。所以对于你想要的,你应该只有七个数字,每个出现三次。