首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用terra软件包的lapp功能并行处理栅格集

利用terra软件包的lapp功能并行处理栅格集
EN

Stack Overflow用户
提问于 2022-11-25 18:16:00
回答 1查看 41关注 0票数 1

我有一组光栅,我想在上面运行一个函数,我想可能是使用{terra}包中的lapp函数吗?下面是一个简单的例子,它使用了我希望完成的“风格”玩具数据。

代码语言:javascript
复制
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)

## In real world each of these lists would have rasters with different data in

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)

## If working on windows, this might be better to try and run as proof of concept
# mapply(lapp,
#         input_raster_lists,
#         function(a,b,c,d,e,f,g,h){(a+b-c) / (d+e+f+g+h)})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-25 22:44:19

简化数据,使其更易于阅读

代码语言:javascript
复制
library("terra")
r10 = rast(nrow = 10, ncol = 10, vals = 10)
r20 = rast(nrow = 10, ncol = 10, vals = 20)
r50 = rast(nrow = 10, ncol = 10, vals = 50)
group <- c(r10, r20, r50)
input <- list(group, group, group)

您可以使用lapply按顺序计算列表。

代码语言:javascript
复制
x <- lapply(input, \(i) sum(i))
y <- lapply(input, \(i) app(i, sum))
z <- lapply(input, \(i) lapp(i, function(a,b,c){a+b+c}))

要使用并行化,可以使用例如parallel::parLapplyparallel::mcmapply

SpatRaster对象持有指向不能传递给工作人员的C++对象的指针(引用)。因此,您需要使用wrapunwrap,如下所示。我使用proxy=TRUE不强制内存值。

代码语言:javascript
复制
library(parallel)
inp <- lapply(input, \(x) wrap(x, proxy=TRUE))
f <- \(i) { unwrap(i) |> sum() |> wrap(proxy=TRUE)}
b <- mcmapply(f, inp)
out <- lapply(b, unwrap)

这种方法在某些情况下可能是有用的,例如,当您必须在一个相对较小的栅格(即内存)上进行许多模拟时。

在大多数情况下,您会进行并行化,因为您正在处理磁盘上的大型光栅。在这种情况下,您只需将文件名发送给工作人员,并在那里创建SpatRasters (并将输出写入磁盘)。

还有更多的讨论,here

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74576602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档