如何基于另一栅格索引对栅格图层进行条件化子集划分与汇总?
基于像元级索引栅格的条件化栅格统计实现
要实现每个像元基于自定义起始/结束图层的统计,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
相关产品推荐
相关产品推荐

