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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:15:36