使用R扩展netCDF文件中的维度

11

我想使用R编写一个带有“无限”维度的netCDF文件,以便稍后可以扩展。

这是我尝试过的:

创建一个netcdf文件

library(ncdf4)

## define lat, lon time dimensions
lat <- ncdim_def("latitude", "degrees_east", vals =  44.0, unlim = TRUE) 
lon <- ncdim_def("longitude", "degrees_north", vals = -88.5, unlim = TRUE)
time <- ncdim_def("time", "days since 0000-01-01", 1:1000)

## define data with these dimensions
x <- ncvar_def("myvar", units = "m2", dim = list(lat, lon, time))

## create, write to, close nc file
nc <- nc_create(filename = "tmp.nc", vars = list(x))

ncvar_put(nc = nc, varid = x, vals = 1:1000)
nc_close(nc = nc)

我想在不同的纬度和经度处添加一个新的向量

## reopen existing file
nc <- nc_open("tmp.nc", write = TRUE)

## define new lat, lon dimensions (keep time dim from above)
lat2 <- ncdim_def("latitude", "degrees_east", vals =  44.5, unlim = TRUE) 
lon2 <- ncdim_def("longitude", "degrees_north", vals = -89.0, unlim = TRUE)

## define, write new dataset at new lat lon coordinates
x2 <- ncvar_def("myvar", units = "m2", dim = list(lat2, lon2, time))
ncvar_put(nc = nc, varid = x2, vals = 11:1011)

我希望找到两个不同的纬度和经度

ncvar_get(nc, 'latitude')
ncvar_get(nc, 'longitude')

ncvar_get(nc, 'myvar')

这些显示该文件是使用第一组纬度/经度和'myvar'值编写的,但未附加新的值集。

我错在哪里了?

我知道可以在netCDF-4中具有多个无限维度,并且可以添加到这些维度的功能。我如何在R中实现这一点?

我意识到自己必须将“尺寸定义”与其他概念混为一谈。但我有点迷失方向。

1个回答

8

是的,我认为您将“维度定义”和维度变量内实际数据混淆了。

如果您运行第一段代码,然后使用ncdump转储NetCDF文件,您会看到:

netcdf tmp {
dimensions:
        latitude = UNLIMITED ; // (1 currently)
        longitude = UNLIMITED ; // (1 currently)
        time = 1000 ;
variables:
        double latitude(latitude) ;
                latitude:units = "degrees_east" ;
                latitude:long_name = "latitude" ;
        double longitude(longitude) ;
                longitude:units = "degrees_north" ;
                longitude:long_name = "longitude" ;
        int time(time) ;
                time:units = "days since 0000-01-01" ;
                time:long_name = "time" ;
        float myvar(time, longitude, latitude) ;
                myvar:units = "m2" ;
data:

 latitude = 44 ;

 longitude = -88.5 ;

 time = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
    20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
    ...
    990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000 ;

 myvar =
  {{1}},
  {{2}},
  {{3}},
  ...
  {{1000}} ;
} 

这个尺寸表格显示,latitudelongitude的值是无限制的,而time维度则从0000-01-01开始固定为1000个点/天。这正是您指定的内容,很好。

所以,要添加另一个纬度和经度,我需要再次打开文件,读取当前数据,将其附加到数据中,然后将其写回。

library(ncdf4)
nc <- nc_open("tmp.nc", write = TRUE)
lat <- ncvar_get(nc, varid='latitude')
lat <- append(lat, 44.5)
ncvar_put(nc, varid='latitude', vals=lat, start=c(1), count=2)
nc_close(nc)

现在,ncdump会向您显示两个纬度:
data:

 latitude = 44, 44.5 ;

 longitude = -88.5 ;

当然,对于大型数据集,您不需要或不想读取所有数据并进行附加操作,您只需告诉NetCDF您想要写入的位置即可。
library(ncdf4)
nc <- nc_open("tmp.nc", write = TRUE)
lon = -89.0
ncvar_put(nc, varid='longitude', vals=lon, start=c(2), count=1)
nc_close(nc)

现在,ncdump将向您展示两个纬度和两个经度:
data:

 latitude = 44, 44.5 ;

 longitude = -88.5, -89 ;

数据表示myvar是一个3D数组,因此我会在初始写入时进行不同的操作。在创建数据和将其写入文件时,我会指定其维度,如下所示:

data <- array(1:1000, c(1,1,1000))
ncvar_put(nc = nc, varid='myvar', vals=data, start=c(1,1,1), count=c(1,1,1000))

然后将第二个纬度和经度添加到其中:
data <- array(11:1011, c(1,1,1000))
ncvar_put(nc = nc, varid='myvar', vals=data, start=c(2,2,1), count=c(1,1,1000))

注意

我认为R包对你隐藏了太多内容。当你使用ncdim_def创建一个维度时,你可以给它赋值。在我看来,这更像是一个三步骤的过程。

  1. 创建维度。
  2. 创建与该维度相关联的变量。
  3. 向此变量添加数据。

希望这可以帮助你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接