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

基于SpatRaster的加权平均计算:步骤2与3问题求助

问题解决:基于不同分辨率SpatRaster的加权平均计算

步骤2错误原因与修正

报错[mask] number of rows and/or columns do not match的核心原因是:投影后的layer2与layer1未对齐(分辨率、行列数不一致),terra::mask要求输入的两个栅格必须具有完全相同的地理范围、分辨率和坐标系。

正确的处理流程是先将layer2重采样匹配layer1的栅格结构,再进行掩膜,代码如下:

# 直接将layer2重采样至layer1的栅格结构(匹配分辨率、范围、行列数)
r <- terra::resample(layer2, layer1, method = "bilinear") # 分类数据可改用"near"方法
# 此时r已与layer1完全对齐,直接执行掩膜
r <- terra::mask(r, layer1)

若坚持先裁剪再重采样,也可使用以下代码:

# 先裁剪layer2到layer1的大致范围
r_crop <- terra::crop(layer2, ext(layer1))
# 将裁剪后的栅格重采样至layer1的结构
r <- terra::resample(r_crop, layer1, method = "bilinear")
# 执行掩膜
r <- terra::mask(r, layer1)

步骤3代码的疑问解答

你的代码r_disagg <- disaggregate(r, fact = 30)/30存在逻辑偏差:

  1. 经过步骤2修正后,r已经是与layer1分辨率完全一致的栅格,无需再执行disaggregate——resample操作已经完成了低分辨率到高分辨率的匹配。
  2. 若在未修正步骤2的场景下,disaggregate(r, fact=30)确实能将低分辨率(0.008333度)转为高分辨率(0.0002777度),但除以30是否合理取决于权重定义:
    • 若希望每个高分辨率栅格的权重是对应低分辨率收入的1/30(平均分配父栅格收入到子栅格),除以30是正确的;
    • 若希望权重直接使用收入值本身(子栅格继承父栅格收入值),则无需除以30,直接用disaggregate(r, fact=30, method="near")即可。

完整加权平均计算流程

基于修正后的步骤,完整代码如下:

# 注:layer2与layer1均为WGS84坐标系,统一投影步骤可省略;若坐标系不同则保留
# layer2 <- project(layer2, crs(layer1))

# 对齐layer2到layer1的栅格结构并掩膜
r <- terra::resample(layer2, layer1, method = "bilinear")
r <- terra::mask(r, layer1)

# 计算权重栅格(收入值除以总和,排除空值)
r_wt <- r / sum(values(r), na.rm = TRUE)

# 计算加权平均
weighted_mean <- sum(values(layer1 * r_wt), na.rm = TRUE)

关键说明

  • 重采样方法选择:连续型数据(如收入)用bilinear双线性插值更平滑,分类数据用near最近邻插值避免类别失真。
  • 权重计算时必须用na.rm = TRUE排除掩膜后的空值,避免结果偏差。

内容的提问来源于stack exchange,提问作者89_Simple

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:57:17