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

如何在R terra包中基于多个SpatRaster生成加权均值SpatRaster

解决SpatRaster逐单元格加权均值问题

你遇到的问题是因为terra::weighted.mean的参数结构和app函数传递数据的方式不兼容——app会把每个位置的所有栅格值打包成一个向量传给自定义函数,但weighted.mean需要分别接收x(值向量)和w(权重向量)两个参数,直接指定fun=terra::weighted.mean时,权重参数无法正确传递。

下面提供两种简单可行的解决方案:

方法一:自定义加权均值函数配合app

自己写一个适配app的函数,手动处理权重计算:

# 加载terra包
library(terra)

# 构造示例SpatRaster
r1 <- rast(nrow=10, ncol=10, vals=rnorm(100))
r2 <- rast(nrow=10, ncol=10, vals=rnorm(100))
r3 <- rast(nrow=10, ncol=10, vals=rnorm(100))

# 定义权重向量
weights <- c(4, 2, 1)
weight_sum <- sum(weights)

# 自定义加权均值函数
weighted_mean_fun <- function(x) {
  sum(x * weights) / weight_sum
}

# 计算加权均值栅格
weighted_mean_raster <- app(c(r1, r2, r3), fun=weighted_mean_fun)

方法二:直接栅格运算(更高效)

因为SpatRaster支持算术运算,直接做线性组合再除以权重总和,这种方法不需要调用app,性能更优:

# 直接计算加权均值
weighted_mean_raster <- (r1*4 + r2*2 + r3*1) / (4+2+1)

如果你的栅格数量较多,也可以用mapply结合权重向量简化代码:

# 栅格列表和权重向量
r_list <- list(r1, r2, r3)
weights <- c(4,2,1)

# 加权求和后除以权重和
weighted_sum <- sum(mapply(function(r, w) r*w, r_list, weights))
weighted_mean_raster <- weighted_sum / sum(weights)

这两种方法都能精准实现你需要的逐单元格加权均值计算,第二种方法在处理大规模栅格时速度更快。

内容的提问来源于stack exchange,提问作者Yuri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:57:19