如何高效将25m分辨率栅格聚合为100m分辨率栅格?
高效聚合多类别栅格至低分辨率占比栅格(R语言)
问题场景
拥有一份25m分辨率、包含21个类别的英国土地覆盖栅格,需要转换为100m分辨率的栅格,每个单元格存储对应范围内各类别的占比。当前采用Terra包拆分单个类别栅格后逐个聚合再堆叠的方式,效率较低;而exactextractr依赖多边形图层,计算量偏大,寻求更高效的处理方案。
当前低效示例代码:
library(terra) ## Example data Land_cover <- rast(nrow=100, ncol=100, res=25, ext=c(0,2500,0,2500), crs="local") values(Land_cover) <- sample(2, 10000, replace=TRUE) Broadleaf <- Land_cover == 1 Coniferous <- Land_cover == 2 broadleaf100 <- aggregate(Broadleaf, fact = 4, fun = mean) coniferous100 <- aggregate(Coniferous, fact = 4, fun = mean) broadcon <- c(broadleaf100, coniferous100)
高效解决方案
直接使用terra::aggregate配合自定义函数,一次性计算聚合窗口内所有类别的占比,无需拆分单个类别栅格,大幅提升效率:
library(terra) # 构造25m分辨率、含21个类别的示例栅格 set.seed(123) Land_cover <- rast(nrow=100, ncol=100, res=25, ext=c(0,2500,0,2500), crs="local") values(Land_cover) <- sample(1:21, ncell(Land_cover), replace=TRUE) # 定义聚合函数:计算窗口内每个类别的占比 calc_class_proportion <- function(x) { # 用factor强制覆盖所有21个类别,避免缺失类别时返回结果不完整 class_counts <- table(factor(x, levels = 1:21)) # 转换为占比(总单元格数为length(x),即4*4=16个25m单元格) class_props <- as.numeric(class_counts) / length(x) return(class_props) } # 聚合至100m分辨率(fact=4对应25*4=100) land_cover_proportions <- aggregate(Land_cover, fact = 4, fun = calc_class_proportion) # 为图层命名,方便识别各类别占比 names(land_cover_proportions) <- paste0("class_", 1:21)
方案优势
- 无需循环拆分每个类别,一次性完成所有21个类别的占比计算,减少重复IO和内存开销
- 自定义函数通过
factor强制包含所有类别,确保返回的栅格图层数量与原类别数一致,避免遗漏 - 计算逻辑直接基于栅格聚合窗口,无需依赖额外多边形图层,比
exactextractr更轻量化
内容的提问来源于stack exchange,提问作者Oatman
相关产品推荐
相关产品推荐

