通过均值 (R) 将大栅格聚合到分辨率较低的栅格

Aggregate large raster to raster with lower resolution via mean (R)

我有一个相当大的光栅文件,分辨率为 0.9 arcsec x 0.9 arcsec,其值介于 0 和 100(NA 为 255)之间,称为 forest1。我想将此栅格聚合到另一个栅格(称为 dfr_2010_crop)的分辨率,该栅格使用值的平均值具有 0.5° x 0.5° 的分辨率。不幸的是,我目前使用的策略需要太多内存。也就是说,我正在使用

TreeCover = rasterToPoints(forest1, fun=NULL, spatial=T) 
TreeCoverPercent <- rasterize(TreeCover, dfr_2010_crop, fun=function(x,...) {sum(x, na.rm=T)/(4*10^4)}, field=g )

其中 g 是我之前保存的正确字段。 4*10^4 是 0.5° x 0.5° 单元格中 0.9 arcsec x 0.9 arcsec 的数量。 R 告诉我他不能在第一行 运行 之后分配一个大小为 7.9GB 的向量。我尝试通过以下方式解决这个问题:

rasterOptions(maxmemory=1e+08)

而且,在这不起作用之后,我尝试分块工作。我尝试按照此处 ([https://strimas.com/post/processing-large-rasters-in-r/][1]) 给出的方法进行操作,他们在块中工作时使用 calc() 函数。但是,我无法将其自定义为我的设置,因为我不知道如何在循环内将块称为光栅文件。然而,这是我的尝试:

canProcessInMemory(forest1, 1, TRUE)
#working in block
f_in <- f
f_out <- tempfile(fileext = ".tif")

# input and output rasters
r_in <- stack(f_in)
r_out <- raster(r_in)

# blocks
b <- blockSize(r_in)
print(b)

r_in <- readStart(r_in)
r_out <- writeStart(r_out, filename = f_out)

# loop over blocks
for (i in seq_along(b$row)) {
  # read values for block
  # format is a matrix with rows the cells values and columns the layers
  v <- getValues(r_in, row = b$row[i], nrows = b$nrows[i])
  
  # mean cell value across layers
  v <- rasterToPoints(v, fun=NULL, spatial=T)
  
  # write to output file
  r_out <- writeValues(r_out, v, b$row[i])
}

# close files
r_out <- writeStop(r_out)
r_in <- readStop(r_in)

期待任何建议并感谢您的帮助。

你的分辨率的比率结果是一个精确的整数:

res1 = 0.9/(60*60) # resolution converted to degrees
res2 = 0.5
res.factor = res2 / res1
res.factor
# [1] 2000

您可以使用 res.factor = res(forest1) / res(dfr_2010_crop) 与您的实际光栅仔细检查 - 我不能这样做,因为您没有提供 reproducible example.

这意味着您可以简单地使用 raster::aggregate 来更改分辨率。

TreeCoverPercent = aggregate(forest1, res.factor)

如果您的 res.factor 不是一个精确的整数,那么您仍然可以通过四舍五入到最接近的整数来使用此方法,然后重新采样到最终所需的分辨率。

TreeCoverPercent = aggregate(forest1, round(res.factor))
TreeCoverPercent = resample(TreeCoverPercent, dfr_2010_crop)