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

如何基于另一栅格索引对栅格图层进行条件化子集划分与汇总?

基于像元级索引栅格的条件化栅格统计实现

要实现每个像元基于自定义起始/结束图层的统计,terra::tapp无法直接满足(它的索引是全局统一的),可以用terra::app结合自定义函数来逐像元处理,具体步骤如下:

1. 准备示例数据

沿用你提供的示例数据:

library(terra)

# 生成示例栅格(5个图层)
s <- rast(nrow=4, ncol=3, nlyrs=5)
n <- ncell(s)
values(s[[1]]) <- sample(1:100, n, replace=T)
values(s[[2]]) <- sample(1:10, n, replace=T)
values(s[[3]]) <- sample(1:10, n, replace=T)
values(s[[4]]) <- sample(1:10, n, replace=T)
# 修改第5层数据,区分两种情况
values(s[[5]]) <- c(sample(1:10, n/2, replace=T),
                    sample(1:100, n/2, replace=T))

# 定义每个像元的起始/结束图层索引栅格
idx_start <- rast(nrow=4, ncol=3, vals=rep(2, n))
idx_end <- rast(nrow=4, ncol=3)
values(idx_end) <- c(rep(4, n/2), rep(5, n/2))

2. 定义自定义统计函数

这个函数会接收单个像元的所有图层值、对应的起始图层号、结束图层号,计算指定时段的平均值:

cell_mean <- function(x, start, end) {
  # x:单个像元的所有图层值向量
  # start:该像元的起始图层号
  # end:该像元的结束图层号
  subset_vals <- x[start:end]
  mean(subset_vals, na.rm = TRUE) # 可根据需求调整na.rm参数
}

3. 应用函数到所有像元

用app函数将自定义函数批量应用到每个像元,同时传入起始和结束索引栅格:

# 合并需要处理的栅格,将起始/结束索引栅格作为额外参数传入
result <- app(c(s, idx_start, idx_end), 
              function(x) {
                # 前5个值是s的图层值,第6个是start,第7个是end
                cell_mean(x[1:5], x[6], x[7])
              })

# 查看结果
plot(result)

关键说明

  • app函数会逐像元处理所有输入栅格的对应值,这里我们把原始数据栅格s和索引栅格idx_start、idx_end合并传入,确保每个像元的图层值和对应的索引一一对应。
  • 自定义函数里可以根据需求修改统计逻辑,比如计算总和、中位数等,只需替换mean为对应的统计函数即可。
  • 如果需要保留非目标时段的统计结果(比如示例中的第1层平均值),可以扩展自定义函数,返回多个值,最终输出多图层栅格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:55:10