使用terra处理栅格栈:将两层计算结果存入第三层的实现问题
问题分析与修正代码
你的代码无法正常运行的核心原因:
- 你创建了空图层
c,但合并栅格栈时只把a和b合并成了z,z中不存在layer_three图层,后续赋值操作自然无效; app函数的使用可以更精准,只需针对需要计算的前两个图层。
修正方案1:直接计算新图层后合并(推荐)
无需提前创建空图层,直接通过计算生成第三个图层再合并,流程更简洁:
library(terra) # 创建并初始化图层a a <- rast(ncol = 10, nrow = 10) values(a) <- rep(5, 100) names(a) <- "layer_one" # 创建并初始化图层b b <- rast(ncol = 10, nrow = 10) values(b) <- rep(10, 100) names(b) <- "layer_two" # 定义自定义计算函数 raster_fun <- function(x, y) { x * y + 30/10 } # 基于a和b计算第三个图层 layer_three <- lapp(c(a, b), raster_fun) names(layer_three) <- "layer_three" # 合并三个图层为完整栅格栈 z <- c(a, b, layer_three) # 查看结果 z
修正方案2:先包含空图层再赋值
如果要先创建空图层再填充计算结果,需确保栅格栈z包含该空图层:
library(terra) a <- rast(ncol = 10, nrow = 10) values(a) <- rep(5, 100) names(a) <- "layer_one" b <- rast(ncol = 10, nrow = 10) values(b) <- rep(10, 100) names(b) <- "layer_two" c <- rast(ncol = 10, nrow = 10) values(c) <- rep(NA, 100) names(c) <- "layer_three" # 合并a、b、c三个图层到z,此时z包含layer_three z <- c(a, b, c) # 定义计算函数,接收每个像元的多图层值向量 raster_fun <- function(i) { i[1] * i[2] + 30/10 } # 仅用前两个图层计算,结果赋值给layer_three z[["layer_three"]] <- app(z[[1:2]], raster_fun) # 查看结果 z
运行任意一种方案后,z都会包含三个图层,其中layer_three的计算值为5*10 + 3 = 53,符合公式预期。
内容的提问来源于stack exchange,提问作者TheRealJimShady
相关产品推荐
相关产品推荐

