按元素添加两个栅格堆栈的层并存储在新堆栈中

问题描述 投票:0回答:1

我有两个光栅堆栈,每个都有大约。 80000层。这些堆栈具有相同的范围、相同的 CRS、相同的分辨率和相同的层数。我想将堆栈的各层按元素方式相互添加(例如 stack3[[n]] <- stack1[[n]]+stack2[[n]]). I tried the following approaches so far:

  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

任何帮助、技巧和建议表示赞赏!

r raster terra
1个回答
0
投票

最简单的方法是使用

+

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)

我认为

base::identical
方法在封装的C++对象中看到了差异(它不是相同的指针)。

另一种方法是

s <- sds(r1, r2)
a <- app(s, sum)
© www.soinside.com 2019 - 2024. All rights reserved.