我有一个表征海洋深度的光栅文件 (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)
我找不到可以执行此操作的平铺命令。
这可能是一种方法。请注意,在这个玩具示例中,并行计算的开销使其不值得。然而,其想法是将栅格分解为图块,并行地重新分类每个图块,然后将它们全部合并在一起。另请注意: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)