通过平铺并行处理栅格?

问题描述 投票:0回答:1

我有一个表征海洋深度的光栅文件 (TIFF)。我想将此栅格分割成多个图块,每个图块都可以并行处理,以将深度超过 7m 的深度重新分类为 NA。然后我想将这些文件重新组合成一个更大的 tiff。这可能或实用吗?

我当前的代码对整个 TIFF 文件的深度进行了重新分类,并且需要很长时间才能完成。我真的很想学习如何并行执行此操作,但无法找到好的指南。

这是我当前的代码:

Hawaii_Bathymetry <- raster(here("2_output", "modified_rasters", "Hawaii_Bathymetry.tif"))

#### Save depths from -7 to 2 m
vals <- cbind(-Inf, -7, NA) #Replace all elevations less than -7 m with NA

Bathymetry_reclass <- reclassify(Hawaii_Bathymetry, rcl = vals)

vals <- cbind(1, Inf, NA) #Replace all elevations more than 1 m with NA
Bathymetry_reclass <- reclassify(Bathymetry_reclass, rcl = vals)

writeRaster(Bathymetry_reclass, file=here("2_output", "modified_rasters", "Hawaii_Bathymetry_-7_to_1.tif"), format="GTiff", overwrite=TRUE)

我找不到可以执行此操作的平铺命令。

r geospatial raster r-raster terra
1个回答
0
投票

这可能是一种方法。请注意,在这个玩具示例中,并行计算的开销使其不值得。然而,其想法是将栅格分解为图块,并行地重新分类每个图块,然后将它们全部合并在一起。另请注意:SpatRast 无法序列化,因此您必须在合并之前

wrap
每个图块并取消
wrap
它们。

library(terra)
library(foreach)
library(doParallel)

f <- system.file("ex/elev.tif", package="terra")
r <- rast(f)
vals <- cbind(300, Inf, NA) #Replace all elevations less than -7 m with NA
x <- rast(ncol=4,nrow=4,extent=ext(r))
tl <- makeTiles(r,x,overwrite=T,extend=T)

cl <- parallel::makeCluster(length(tl))
registerDoParallel(cl)

reclassed <- foreach(i = 1:length(tl),
                .packages = "terra") %dopar% {
                  crp <- wrap(terra::classify(rast(tl[i]),rcl=vals))
                  return(crp)
                }
stopCluster(cl)

merged <- do.call(terra::merge,lapply(reclassed,terra::rast))
plot(merged)
© www.soinside.com 2019 - 2024. All rights reserved.