You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:35:12