通过光栅砖循环

时间:2017-03-01 03:10:54

标签: r raster r-raster

我知道这里有很多关于循环栅格砖的问题,但是它们都没有提供我正在寻找的答案/建议。

我有一个大型(17.2GB,7901图层)netcdf文件,我已导入R作为RasterBrick

> KK10Brick
class       : RasterBrick 
dimensions  : 2160, 4320, 9331200, 7901  (nrow, ncol, ncell, nlayers)
resolution  : 0.08333333, 0.08333333  (x, y)
extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : D:\LandUse\KK10.nc 
names       : X8000, X7999, X7998, X7997, X7996, X7995, X7994, X7993, X7992, X7991, X7990, X7989, X7988, X7987, X7986, ... 
z-value     : 100, 8000 (min, max)
varname     : land_use

文件中的每一层代表1年,我需要创建砖中每个像素的时间移动平均值。即使变量看起来很明确(land_use),但它实际上是%覆盖。

我想建立一个30年的移动平均线,有10年的推拉窗口。例如第一个窗口将生成层1:30的平均值的栅格,下一个窗口将生成另一个来自层11:40 ... 7871:7901的平均值的栅格。

我认为for循环可能是实现这一目标的最好方法,但我不确定我是否会走向正确的道路,例如。

for (i in 1:7901){
subsetLayers <- code to subset relevant layers
out <- stackApply(KK10Brick, indices = subsetLayers, fun = "mean", na.rm = TRUE, filename = paste("./Output/", "meanLU_window_", i, ".tif", sep = ""))
rm(out)}

我陷入困境的是编写代码以生成subsetLayers的序列。任何帮助都将非常感激。

EDIT。

library(raster)
exBrick <- brick(nrow = 180, ncol = 360, nl = 100)
values(exBrick) <- runif(ncell(exBrick) * nlayers(exBrick))
crs(exBrick) <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" 
exBrick

1 个答案:

答案 0 :(得分:1)

这应该适用于您的示例数据。我不确定它在速度和RAM使用方面能够扩展到非常大的netcdf数据 - 请告诉我它是否适用于大数据。

starts = seq(1, nlayers(exBrick)-30, 10)
nout = length(starts)
out = brick(nrow = 180, ncol = 360, nl = nout)
values(out) = NA
crs(out) = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" 

for (i in 1:nout) {
  start = starts[i]
  out[[i]] = mean(exBrick[[start:(start+30)]]) 
}

如果RAM使用是分配大块砖来存储结果的限制因素,我们可以通过将每个结果层保存到磁盘(一次只有一个栅格)来节省一些速度:

for (i in starts) {
  out = mean(exBrick[[i:(i+30)]]) 
  writeRaster(out, filename=paste0("out",i,".grd"), overwrite=TRUE)
}