如何在terra包中基于目标栅格分辨率计算aggregate函数的fact参数?
Terra包aggregate函数基于目标栅格设置分辨率的正确方法
问题背景
使用terra包的aggregate()函数聚合栅格时,需通过fact参数指定每个方向上聚合的像元数。若要将多个栅格统一转换为某一目标栅格的分辨率,手动计算fact效率低下,希望直接基于目标栅格自动设置参数。
原始代码示例
library(terra) r1 <- rast(ncol=10,nrow=10) r2 <- rast(ncol=4,nrow=4) values(r1) <- runif(ncell(r1)) values(r2) <- runif(ncell(r2))
尝试代码及报错
执行以下代码:
r3 = aggregate(r1, fact=res(r1)/res(r2))
出现报错:
Error: [aggregate] values in argument 'fact' should be > 0
中文翻译:错误:[aggregate] 参数'fact'的值必须大于0
问题原因
res(r1)/res(r2)计算得到的是小于1的小数(默认坐标系下,r1分辨率为36,r2分辨率为90,36/90=0.4),而aggregate()的fact参数要求是大于0的正整数,代表每个方向上需要聚合的原像元数量,数值必须≥1,因此触发报错。
正确解决方案
方法1:基于目标分辨率计算合法的fact参数
- 确保原栅格与目标栅格空间范围一致,否则聚合结果无法匹配目标栅格
- 用
目标分辨率 / 原分辨率计算fact,再转换为正整数(可根据需求用ceiling()取上整、floor()取下整或round()四舍五入)
示例代码:
library(terra) # 创建范围一致的栅格:基于r2的范围生成r1 r2 <- rast(ncol=4, nrow=4) r1 <- rast(r2, ncol=10, nrow=10) values(r1) <- runif(ncell(r1)) values(r2) <- runif(ncell(r2)) # 计算fact:目标分辨率/原分辨率,取上整得到正整数 fact <- ceiling(res(r2)/res(r1)) # 执行聚合,可指定聚合函数(默认是mean) r3 <- aggregate(r1, fact=fact, fun=mean) # 验证结果是否匹配目标栅格 ext(r3) == ext(r2) # 返回TRUE res(r3) == res(r2) # 返回TRUE
方法2:直接用resample函数匹配目标栅格
如果不需要严格的聚合逻辑,可直接用resample()函数将原栅格重采样到目标栅格的分辨率和范围,支持多种重采样方法:
# 将r1重采样为r2的分辨率,使用均值方法 r3 <- resample(r1, r2, method="mean")
方法3:调整原栅格列数为目标栅格的整数倍
如果需要精确匹配行列数,可先调整原栅格的行列数为目标栅格的整数倍,再计算fact:
# 调整r1的行列数为r2的3倍(4*3=12) r1_adj <- rast(r2, ncol=12, nrow=12) values(r1_adj) <- runif(ncell(r1_adj)) # 计算整数fact fact <- ncol(r1_adj)/ncol(r2) # 12/4=3 # 聚合后完全匹配r2的分辨率和范围 r3 <- aggregate(r1_adj, fact=fact)
内容的提问来源于stack exchange,提问作者Herman Toothrot
相关产品推荐
相关产品推荐

