【问题标题】:How to loop through multiple RasterBrick to create one large RasterBrick?如何循环通过多个 RasterBrick 来创建一个大的 RasterBrick?
【发布时间】:2016-10-17 11:14:25
【问题描述】:

我的问题进一步建立在较早的帖子 How to extract data from a RasterBrick? 之上。我有多个 netCDF 文件,其中包含不同时间段(每个 6 个月)的纬度、经度和深度的温度数据。我也有一个带有纬度、经度和时间的数据框,我想从 netcdf 文件中提取海面温度数据。在我提取这些数据之前,我想将所有 netcdf 文件转换并合并到一个 RaterBrick(更易于使用)。当我使用循环“砖”和“合并”文件时,它会创建一个只有一层的 RasterLayer 对象,而不是我期望的 Raster Brick。我已经搜索了互联网,但到目前为止我找不到解决这个问题的正确方法。

我对使用循环不熟悉,所以如果我问一个答案很简单的问题,我很抱歉,但我真的可以使用一些建议。

这是我到目前为止所做的:

创建所有 netcdf 文件的文件列表。

#Open all files, creats a list of 12 files
    files= list.files('copernicus/daily_temp/',pattern='*.nc', full.names=TRUE)

尝试循环遍历文件列表来创建积木。将这些多层砖合并在一起,形成一个大的 RasterBrick,每天有海面(level=1)温度数据。

# Loop over files to creat a RasterBrick of temp at SST
for(i in 1:length(files)) {
  temp <- brick(files[i], varname="votemper",level=1)
  temp.brick<-merge(temp)}

# Look what one brick is build out of
> temp
class       : RasterBrick 
dimensions  : 375, 297, 111375, 184  (nrow, ncol, ncell, nlayers)
resolution  : 0.11111, 0.06667  (x, y)
extent      : -19.94444, 13.05523, 40.03333, 65.03459  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : C:\Users\PFA\Dropbox\HOM\copernicus\daily_temp\daily_temp_2003_2.nc 
names       : X2003.07.01, X2003.07.02, X2003.07.03, X2003.07.04, X2003.07.05, X2003.07.06, X2003.07.07, X2003.07.08, X2003.07.09, X2003.07.10, X2003.07.11, X2003.07.12, X2003.07.13, X2003.07.14, X2003.07.15, ... 
Date        : 2003-07-01, 2003-12-31 (min, max)
varname     : votemper 
level       : 1 

   # Look at what the merged bricks are build out of 
class       : RasterLayer 
dimensions  : 375, 297, 111375  (nrow, ncol, ncell)
resolution  : 0.11111, 0.06667  (x, y)
extent      : -19.94444, 13.05523, 40.03333, 65.03459  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : in memory
names       : layer 
values      : 280.677, 297.669  (min, max)

【问题讨论】:

  • nlayers(temp) 说什么?
  • nlayers 在这种情况下是 184。每个文件的层数为 184 或 181,两个文件为一年。
  • 我认为您需要提供两个或更多 RasterBrick 才能真正合并它们。您的代码实际上只是合并了一个对象,这可能不会像您认为的那样。
  • 感谢罗马的回复。但是,您将如何循环执行此操作?

标签: r loops netcdf r-raster


【解决方案1】:

您可以尝试手动创建第一块积木,然后遍历其余文件,合并它们。如果这不适合您的 RAM,您可能需要切换到使用硬盘驱动器上的文件。请参阅最后一个 ?merge 示例以了解如何执行此操作。

tmp <- brick(files[1], ...) # create first brick
for (i in 2:length(files)) {
  newbrick <- brick(files[i], ...) # this will be the second file in first iteration
  # on first iteration, it will merge file 1 and 2
  # on second interation, merged file (1,2) and file 3
  # on third iteration, merged file (1,2,3) and file 4
  # ...
  mergedbrick <- merge(tmp, newbrick) 

}

【讨论】:

  • 效果很好。谢谢!不过,它有一个小缺点。它还更改了图层名称,几乎不可能将日期/时间图层链接到我想要获取温度数据的数据框日期。 ('names : Sea.Water//perature.1, Sea.Water//perature.2, Sea.Water//perature.3, ....') 有没有办法保留原来的图层名称?
  • 最简单的方法是在循环时创建原始名称的数组(例如,在每个循环中添加最后一个文件的名称的“增长”数组)。然后在循环结束时使用它来替换“错误”的。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
相关资源
最近更新 更多