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

如何高效将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 21:47:28