粗分辨率火烧面积栅格向高分辨率可燃烧栅格条件分解的问题排查
解决流程与修正步骤
1. 修复「extents do not match」错误
terra::zonal要求区域栅格(BurntArea)与值栅格(binary_raster)的范围、分辨率完全匹配,而你提供的两个栅格范围存在差异,因此先将高分辨率二元栅格裁剪到粗分辨率火烧面积栅格的范围:
# 裁剪二元栅格至BurntArea的范围,保证两者范围一致 binary_cropped <- terra::crop(binary_raster, BurntArea)
再执行分区统计,计算每个粗像元内的可燃烧像素总数:
count_brpixel <- terra::zonal(binary_cropped, BurntArea, fun = "sum", as.raster = TRUE)
2. 计算单个可燃烧像素的火烧面积(处理除以0异常)
直接除法会导致无任何可燃烧像素的粗像元(count_brpixel=0)出现Inf或NA,需提前修正:
burnt_per_pixel <- BurntArea / count_brpixel # 将无限值、NA替换为0(无火烧面积可分配) burnt_per_pixel[is.infinite(burnt_per_pixel) | is.na(burnt_per_pixel)] <- 0
3. 匹配高分辨率(替换disagg为resample)
两个栅格的分辨率为非整数倍关系(506.25倍),terra::disagg仅支持整数分解倍数,因此改用resample实现分辨率匹配,选择最近邻插值保证粗像元值完整分配到对应细像元:
# 将粗分辨率结果重采样到二元栅格的分辨率 burnt_per_pixel_disagg <- terra::resample(burnt_per_pixel, binary_cropped, method = "near")
4. 生成最终高分辨率火烧面积栅格
若需要覆盖原始二元栅格的全范围(-180至180,-90至90),先将重采样后的栅格扩展到全范围并填充0,再与原始二元栅格相乘:
# 扩展到原始二元栅格的范围,超出BurntArea的区域填充0 burnt_per_pixel_disagg_full <- terra::extend(burnt_per_pixel_disagg, binary_raster, fill = 0) # 仅给可燃烧像素分配火烧面积 final_file <- burnt_per_pixel_disagg_full * binary_raster
逻辑验证
- 最终每个可燃烧像素的火烧面积 = 粗像元火烧面积比例 / 粗像元内可燃烧像素总数,符合均等分配需求
- 不可燃烧像素(值为0)的最终火烧面积为0,符合规则
- 扩展操作保证结果覆盖原始二元栅格的完整范围
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

