R中使用terra包聚合细栅格为1值占比粗分辨率栅格方法
R terra包实现二值(1/NA)栅格聚合为占比栅格
你的原始栅格为100m分辨率,目标10km分辨率对应聚合因子为10000/100 = 100,即每个粗分辨率像元覆盖100*100个原始细分辨率像元。由于原始像元仅存在1(有效值)和NA(无值/非目标区)两类取值,要计算聚合后每个像元内值为1的像元占比,可按以下方法实现:
核心实现代码
library(terra) # 1. 预处理:将原始栅格的NA替换为0,此时栅格取值仅为0和1 r1_binary <- subst(raster1, NA, 0) # 2. 聚合计算,聚合因子设为100,聚合函数取均值即为1的占比 # 均值计算逻辑:窗口内所有值求和 / 窗口总像元数 = 1的个数 / 总像元数 = 1的占比 r_10km <- aggregate(r1_binary, fact = 100, fun = mean, na.rm = FALSE)
常见踩坑提示
不要直接对原始含NA的栅格使用
aggregate(..., fun = mean, na.rm = TRUE)计算:该参数会将NA排除在统计分母外,例如窗口内仅存在1个1、其余9999个都是NA时,计算结果会返回1,完全不符合占比计算逻辑。
格网对齐修正(可选)
如果聚合后栅格和你需要的标准10km格网范围不对齐,可先创建目标分辨率模板栅格,再通过重采样保证对齐:
# 生成和原始栅格坐标系、范围一致的10km分辨率模板 template_10km <- rast(ext(raster1), res = 10000, crs = crs(raster1)) # 以平均值方法重采样得到对齐后的占比栅格 r_10km_aligned <- resample(r1_binary, template_10km, method = "average")
结果说明
最终输出栅格的像元值范围为0-1:
- 值为1:对应10km格网内全部是原始值为1的像元
- 值为0:对应10km格网内没有原始值为1的像元
- 0-1之间的数值:对应格网内值为1的像元占比
原始栅格参数
raster1 class : SpatRaster dimensions : 33301, 32538, 1 (nrow, ncol, nlyr) resolution : 100, 100 (x, y) extent : 7590450, 10844250, 902100, 4232200 (xmin, xmax, ymin, ymax) coord. ref. : WGS 84 / Pseudo-Mercator (EPSG:3857) source : spat_PDvNPPxCooNIh09_2584.tif name : pred min value : 1 max value : 1
内容的提问来源于stack exchange,提问作者tg110
相关产品推荐
相关产品推荐

