聚合高分辨率 (300m*300m) 栅格(栅格::聚合和 velox 无法很好地处理此分辨率)

Aggregate high resolution (300m*300m) raster (raster::aggregate and velox not able to handle well this resolution)

我正在尝试将全球范围的栅格 r 从 ~300m*300m(10 弧秒,7.4GB)分辨率聚合到 ~10km 分辨率(0.083333 十进制),即因子 30。 来自 raster 和 velox 包的聚合函数似乎都无法处理如此大的数据集。非常欢迎推荐!

# sample rasters
r <- raster(extent(-180,180, -90 , 90))
res(r)<-c(0.5/6/30, 0.5/6/30)
r <- setValues(r, runif(ncell(r))) # Error: cannot allocate vector of size 62.6 Gb

# velox example
devtools::install_github('hunzikp/velox')
library(velox)
vx <- velox(r) # the process aborts in linux
vx$aggregate(factor=30, aggtype='mean')

# raster example
r_agg <- aggregate(r, fact=30)

你说 raster 无法处理这样的大光栅,但事实并非如此。问题是您正试图在内存中创建一个非常大的数据集——比您的计算机可用的内存还多。您可以改用 init 函数。我在下面展示但不使用全局 300 米栅格来使示例 运行 快一点。

library(raster)
r <- raster(ymn=80, res=0.5/6/30)
r <- init(r, "col")
r_agg <- aggregate(r, fact=30)

使用 terra

可以获得更好的里程数
library(terra)
rr <- rast(ymin=80, res= 0.5/6/30)
rr <- init(rr, "col")
rr_agg <- aggregate(rr, fact=30)

除了 Robert 的建议之外,我还会用模板对 rast 重新采样,这样 ext 和 crs 就会很精确。

r <- terra::rast("your_rast.tif") %>%

aggregate(., fact = 30) %>%

resample(., template_rast, filename ="sth.tif", wopt = list(gdal = c("COMPRESS=LZW", "TFW=YES", "BIGTIFF=YES"), tempdir = "somewhere_you_have_a_lot_of_space", todisk = TRUE))

这些 wopt 选项可能对您处理大型栅格有很大帮助。