将 RasterBrick 尺寸从 TXY 更改为 XYT

Change RasterBrick dimensions from TXY to XYT

我正在尝试将 netCDF 文件导入 R 中的 RasterBricknetCDF 文件有 3 个维度。

library(ncdf)
nc <- open.ncdf("fm100_2003.nc");
print(nc)
[1] "file fm100_2003.nc has 3 dimensions:"
[1] "lon   Size: 1386"
[1] "lat   Size: 585"
[1] "day   Size: 365"
[1] "------------------------"
[1] "file fm100_2003.nc has 1 variables:"
[1] "short dead_fuel_moisture_100hr[day,lon,lat]  Longname:dead_fuel_moisture_100hr Missval:-9999"

日维度的大小对应一年(365天)的每日燃料水分。我想将这些导入 RasterBrick 以进行额外的分析,这非常简单

r <- "fm100_2003.nc"
b <- brick(r,varname="dead_fuel_moisture_100hr")

但是,问题是 RasterBrick 中的 ncolnlayers 被调换了,这导致砖块中的每一层的 rasterLayer 都不正确。 RasterBrick 的尺寸应显示为 1386、585、505890、365 而不是以下尺寸:

class       : RasterBrick 
dimensions  : 1386, 365, 505890, 585  (nrow, ncol, ncell, nlayers)
resolution  : 1, 0.04166667  (x, y)
extent      : 37619.5, 37984.5, -124.793, -67.043  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : fm100_2003.nc 
names       : X49.3960227966309, X49.3543561299642, X49.3126894632975, X49.2710227966309, X49.2293561299642, X49.1876894632975, X49.1460227966309, X49.1043561299642, X49.0626894632975, X49.0210227966309, X48.9793561299642, X48.9376894632975, X48.8960227966309, X48.8543561299642, X48.8126894632975, ... 
degrees_north: 25.0626894632975, 49.3960227966309 (min, max)
varname     : dead_fuel_moisture_100hr 

我想知道在创建RasterBrick时是否有任何方法可以指定维度来避免这个问题?

奇怪,为什么尺寸不对。您可以使用以下命令探索您的 ncdf 文件:

# Open your dimension
# following by '$' you can use tab to see the next available command (R Studio)
r$dim

# REad value for each dimension
lon = get.var.ncdf(r, varid='lon')
lat = get.var.ncdf(r, varid='lat')
time = get.var.ncdf(r, varid='day')

我能够找到解决上述问题的方法(或者可能是变通方法)。

我首先将 netCDF 文件导入到 R 中的数组中。

dname <- "dead_fuel_moisture_100hr"
array1 <- get.var.ncdf(nc, dname) 
dim(array1)
[1]  365 1386  585

array1 的维度是:天数、列数、行数。但是,我可以更改数组的维度:

array2<-aperm(array1, c(3, 2, 1))
dim(array2)
[1]  585 1386  365

现在数组已正确组织:行、列、天。此时我可以访问我需要的深度范围(第 1 天到第 365 天)作为矩阵:

fm.day.001<-array2[,,1]
...
fm.day.365<-array2[,,365]

矩阵也可以转换为栅格:

r2<-raster(nrow=585,ncol=1386,vals=fm.day.001, xmn=-124.7722, xmx=-67.06383,  ymn=25.06269, ymx=49.39602)  

你可以试试dims的说法。类似于:

b <- brick("fm100_2003.nc", varname="dead_fuel_moisture_100hr", dims=3:1)

这是实验性的。即使它创建了正确的对象,该对象也可能无法用于后续操作。