getting raster brick averages from multiple subdirectories

时间:2018-03-23 00:41:58

标签: r image-processing raster

Is there a simple way to get rasters from a set of subdirectories into brick() objects from which I can calculate layers (1 per brick) of their mean values?

I think the second part is easier but funneling everything from the subdirectories is harder for me.

dirs <- list.dirs("C:/Data/PROJECTS/Rasters", full.names = T, recursive = T) %>% 
  as.tibble # this list the subdirectories which may contain one or more rasters that i want to get an average value from. 

for(i in 1:length(dirs)){
  setwd(dirs[i])
  f <- list.files(getwd(), pattern = "\\.tif$",recursive = TRUE) 
  BRICK1[i] <- brick(f) # here is the troublesome part for me: I want to add rasters into a brick if the raster is from the same subdirectory defined in my dirs list.
  means[[i]] <- calc(BRICK1, fun = mean, na.rm = T)
}

1 个答案:

答案 0 :(得分:0)

直接的方法是将lapply作为单独的列表项处理每个目录,并将您的函数应用于它。 这假设您在每个子目录中找到的所有栅格都兼容堆叠在一起(范围,分辨率,原点等)。

这是一个可重复的例子:

library(raster)

dirs <- rep(system.file("external/", package="raster"),10)

dirs[1]
#[1] "/usr/local/lib/R/site-library/raster/external/"


brks <- lapply(dirs,function(d) do.call(brick,
                                lapply(list.files(d,'test.grd',full.names = T,recursive = T),
                                       function(r) raster(r))))

乍一看这看起来有点令人困惑,但它只是一个嵌套的lapply调用:

  • 首先,您为lapply使用dirs,其中d代表单个目录
  • 对于每个d列出目录中包含的栅格(在这种情况下,模式为test.grd。在您的示例中,您将模式更改为.tif$,不需要逃离时期。
  • 接下来,您再次使用lapply为每个list.files的栅格d返回(因为它可能是多个)并将它们加载到raster对象
  • 我们使用do.call对第二个brick调用返回的所有栅格对象应用lapply,最终为第一个lapply的每个列表元素留下一块砖call,对应于您的目录dirs

这是brks的前两个元素的样子:

> brks[1:2]
[[1]]
class       : RasterBrick 
dimensions  : 115, 80, 9200, 1  (nrow, ncol, ncell, nlayers)
resolution  : 40, 40  (x, y)
extent      : 178400, 181600, 329400, 334000  (xmin, xmax, ymin, ymax)
coord. ref. : +init=epsg:28992 +towgs84=565.237,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs 
data source : in memory
names       :    test 
min values  : 128.434 
max values  : 1805.78 


[[2]]
class       : RasterBrick 
dimensions  : 115, 80, 9200, 1  (nrow, ncol, ncell, nlayers)
resolution  : 40, 40  (x, y)
extent      : 178400, 181600, 329400, 334000  (xmin, xmax, ymin, ymax)
coord. ref. : +init=epsg:28992 +towgs84=565.237,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs 
data source : in memory
names       :    test 
min values  : 128.434 
max values  : 1805.78 

如果您想现在计算均值,您可以使用另一个lapply来电:

mns <- lapply(brks,mean)

您可以看到brks中的砖块是相同的,但这只是因为它们具有相同的输入。此外,只有一个图层,因为包目录中只有一个test.grd栅格。

如果目录中有多个栅格,此示例也可以使用。请注意,上面的代码假设您加载的每个栅格只有单层(否则raster函数只会加载第一个)。如果您要处理多层栅格,则需要在第二次raster调用中将stack替换为lapply