如何在terra包project函数中把NA视为0进行内存安全的栅格投影
问题:高分辨率栅格重采样时将NA视为0计算平均值(内存安全实现)
我尝试以低分辨率栅格为模板,对高分辨率栅格进行重采样/投影,代码如下:
library("terra") high_res <- rast(ncol = 2, nrow = 2, vals = c(1, NA, NA, NA)) low_res <- rast(nrow = 1, ncol = 1) new_rast <- project(high_res, low_res, method = "average")
当前代码运行正常,但新栅格的单元格值为1,因为函数仅计算了高分辨率栅格中非NA单元格的平均值。我希望将NA值视为0,得到的结果应为0.25而非1。所用方法必须具备内存安全性,因为我将处理超大型栅格(如覆盖整个国家的5米分辨率栅格),请问是否有巧妙的实现方法?
解决方案
要实现内存安全的处理,无需预先将所有NA替换为0(这会占用额外内存),可通过分别计算总和与总像素数,再相除得到目标平均值:
计算高分辨率栅格投影到低分辨率模板后的像素总和(将NA视为0):
sum_rast <- project(high_res, low_res, method = "sum", na.rm = FALSE)示例中该总和为1+0+0+0=1。
创建与高分辨率栅格同范围的全1栅格,投影后得到对应低分辨率单元格的总像素数:
count_rast <- project(rast(high_res, vals = 1), low_res, method = "sum")示例中总像素数为4。
总和除以总像素数得到目标平均值:
new_rast <- sum_rast / count_rast示例中结果为1/4=0.25,符合预期。
这种方法完全基于terra的内存安全机制,所有步骤均采用分块处理,不会一次性加载全部栅格数据到内存,适配超大范围高分辨率栅格的处理需求。
简洁写法:
new_rast <- project(high_res, low_res, method = "sum", na.rm = FALSE) / project(rast(high_res, vals = 1), low_res, method = "sum")
内容的提问来源于stack exchange,提问作者TheRealJimShady
相关产品推荐
相关产品推荐

