如何使用terra包的lapp函数并行处理多组栅格数据?
使用terra包的lapp函数批量处理多组栅格数据
我有多组栅格数据需要通过自定义函数处理,计划借助{terra}包的lapp()函数实现需求,以下是用模拟数据演示预期实现方式的代码:
library("terra") rp10val = 106520 rp20val = 106520 rp50val = 154250 rp100val = 154250 rp200val = 154250 rp500val = 154250 rp1500val = 154250 sopval = 200 rp_10_vul = rast(nrow = 10, ncol = 10, vals = rep(rp10val, 10)) rp_20_vul = rast(nrow = 10, ncol = 10, vals = rep(rp20val, 10)) rp_50_vul = rast(nrow = 10, ncol = 10, vals = rep(rp50val, 10)) rp_100_vul = rast(nrow = 10, ncol = 10, vals = rep(rp100val, 10)) rp_200_vul = rast(nrow = 10, ncol = 10, vals = rep(rp200val, 10)) rp_500_vul = rast(nrow = 10, ncol = 10, vals = rep(rp500val, 10)) rp_1500_vul = rast(nrow = 10, ncol = 10, vals = rep(rp1500val, 10)) sop_tile = rast(nrow = 10, ncol = 10, vals = rep(sopval, 10)) input_raster_group <- c(rp_10_vul, rp_20_vul, rp_50_vul, rp_100_vul, rp_200_vul, rp_500_vul, rp_1500_vul, sop_tile) ## 实际场景中,每个列表中的栅格数据内容各不相同 input_raster_lists <- list(list(input_raster_group), list(input_raster_group), list(input_raster_group)) mcmapply(lapp, input_raster_lists, function(a,b,c,d,e,f,g,h){a+b+c+d+e+f+g+h}, mc.cores = 2) ## 若在Windows系统运行,可尝试以下代码作为概念验证 # mapply(lapp, # input_raster_lists, # function(a,b,c,d,e,f,g,h){(a+b-c) / (d+e+f+g+h)})
代码修正说明
原代码中的input_raster_lists采用嵌套列表结构(每个元素是包含单个多图层栅格的列表),会导致lapp()无法正确识别输入。可以调整为直接存储多图层栅格对象的列表,再结合mapply/mcmapply批量处理:
# 调整列表结构:直接存储多图层SpatRaster对象 input_raster_lists <- list(input_raster_group, input_raster_group, input_raster_group) # Linux/macOS下并行处理 result <- mcmapply( FUN = function(raster_stack) { lapp(raster_stack, function(a,b,c,d,e,f,g,h) { (a+b-c) / (d+e+f+g+h) }) }, input_raster_lists, mc.cores = 2 ) # Windows下使用普通mapply # result <- mapply( # FUN = function(raster_stack) { # lapp(raster_stack, function(a,b,c,d,e,f,g,h) { # (a+b-c) / (d+e+f+g+h) # }) # }, # input_raster_lists # )
关键要点
lapp()用于对单个多图层栅格(SpatRaster)的每个像元应用自定义函数,函数的参数数量需要与栅格的图层数完全匹配- 批量处理多组栅格时,需将每组栅格整理为独立的SpatRaster对象,放入列表后用
mapply/mcmapply循环处理 - Windows系统不支持
parallel包的分叉式并行,因此需改用mapply而非mcmapply
内容的提问来源于stack exchange,提问作者TheRealJimShady
相关产品推荐
相关产品推荐

