基于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存在逻辑偏差:
- 经过步骤2修正后,
r已经是与layer1分辨率完全一致的栅格,无需再执行disaggregate——resample操作已经完成了低分辨率到高分辨率的匹配。 - 若在未修正步骤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
相关产品推荐
相关产品推荐

