R语言 按元素方式添加两个栅格堆栈的图层并存储在新堆栈中

cbjzeqam  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(82)

我有两个光栅堆栈,每个堆栈大约有80000层。堆栈具有相同的范围,相同的CRS,相同的分辨率和相同的层数。我想将堆栈元素的层添加到彼此(例如stack 3 n <-stack 1 n+ stack 2 n)。到目前为止,我尝试了以下方法:
1.使用循环,这应该工作,但需要超过80000层太长的方式。

library(terra)
nlayers <- nlyr(stack1)
stack3 <- rast()
for (layer_index in 1:nlayers){
    res <- stack1[[layer_index]]+stack2[[layer_index]]
    stack3[[layer_index]] <- res
}

字符串
1.使用简单的“+”。此操作不会产生所需的结果。

stack3 <- stack1+stack2
identical(stack3[[1]],stack1[[1]]+stack2[[1]])
[1] FALSE


1.使用terra::app()抛出错误消息:

stack3 <- rast()
sum_layers <- function(layer1, layer2) {
   layer1 + layer2
}

stack3 <- app(stack1,stack2, sum_layers)

[1] Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'fun' of mode 'function' was not found


任何帮助,技巧和建议赞赏!

bvhaajcl

bvhaajcl1#

最简单的方法是使用+

library(terra)
r1 <- rast(system.file("ex/logo.tif", package="terra"))   
r2 <- r1 / 2
x <- r1 + r2

字符串
这确实有效:

y <- r1[[1]] + r2[[1]]
all.equal(x[[1]], y)
#[1] TRUE

# no differences in the values
plot(x[[1]] - y)


另一种方法是

s <- sds(r1, r2)
a <- app(s, sum)


我认为base::identical方法在封装的C++对象中看到了差异(它不是 * 相同的指针 *)。您可以使用isTRUE(all.equal(x, y))代替。为了避免混淆,我现在还在terra 1.7-67中添加了一个专用的identical<SpatRaster,SpatRaster>方法。

相关问题