【问题标题】:netCDF files in RR中的netCDF文件
【发布时间】:2015-11-17 22:43:52
【问题描述】:

我从here 获得名为 precip.mon.total.v6.nc 的 netCDF 文件。我在 R 中使用ncdf 包来打开和分析文件。

 new <- open.ncdf("precip.mon.total.v6.nc")
    > new
    [1] "file precip.mon.total.v6.nc has 4 dimensions:"
    [1] "lat   Size: 360"
    [1] "lon   Size: 720"
    [1] "nbnds   Size: 2"
    [1] "time   Size: 1320"
    [1] "------------------------"
    [1] "file precip.mon.total.v6.nc has 1 variables:"
    [1] "float precip[lon,lat,time]  Longname:GPCC Monthly total of     precipitation Missval:-9.96920996838687e+36"

但是当我提取变量时,我得到了错误

      > get.var.ncdf(new, "precip")
Error: cannot allocate vector of size 2.5 Gb
In addition: Warning messages:
1: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)
2: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)
3: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)
4: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)

我的问题是: (a) 如何处理内存问题? (b) 如何将此 netCDF 文件的分辨率从 0.5*0.5 更改为 0.25*0.25 数据?我在 MATLAB 中尝试过类似的问题。对于 netCDF 文件,它可以比 R 更好地解决内存问题。但是改变分辨率仍然是一个问题,因为我不擅长 MATLAB。我将非常感谢这方面的任何帮助。

【问题讨论】:

  • 你的 b 部分是一个非常大的开放式问题。您需要查看缩小比例,一个常见的选项是使用延迟率 - 为此,您需要一个您希望缩小到的分辨率的高程网格。

标签: r gis netcdf cdo-climate


【解决方案1】:

(a) 记忆:

如果在 linux 机器上 [sudo apt-get install cdo](或者安装了 cygwin 的 windows),您可以使用 cdo 来帮助您。

例如,如果您只对特定日期感兴趣,则可以先选择该日期以减小文件大小:

cdo seldate,date in.nc out.nc 

或者您可能想查看时间均值:

cdo timmean in.nc out.nc 

这将减小文件大小,然后您可以在 R 中打开它来制作您的绘图(或使用 ncview 进行快速查看调查)。

(b) 重新映射

cdo 还可以将文件内插到 0.25 度,(尽管我不确定您为什么要这样做,因为您没有添加任何信息,而是将文件放大了四倍!!!)

cdo remapcon,r1440x720 in.nc out.nc

cdo remapnn,r1440x720 in.nc out.nc

但正如我所说,如果您想插值以与另一个 0.25 度产品(例如 TRMM)进行比较,最好另辟蹊径,将更精细的数据集插值到 0.5 度。

顺便说一句,2015年发布了GPCC的v7,还是0.5度。

【讨论】:

    【解决方案2】:

    当您提取变量时,您需要指定您想要的维度。目前您要求 R 获取所有内容,因此我怀疑它正在创建一个可能非常庞大的 3D 数组。

    ncdf4 包通常取代 ncdf,您应该尝试使用它。您需要决定是按位置读取时间数据还是按时间步长读取数据。这在普通的 2D 网格上更容易设想:

    • 所有时间步长的单个单元格
    • 所有位置单个时间步长

    你的是一个 3D 网格通过时间(尽管第 3 维只有两个波段),但看起来你的变量没有使用波段维度。这是一个基于 ncdf4 的 2D 工作流程,忽略您的波段:

    包装:

    install.packages("ncdf4")
    library(ncdf4)
    

    打开连接:

    nc = nc_open("~/dir/dir/file.nc")
    

    对于一个时间步长的网格

    读取尺寸:

    precip = list()
    precip$x = ncvar_get(nc, "lon")
    precip$y = ncvar_get(nc, "lat")
    

    读取数据(注意 start 是要开始的维度索引,count 是从该点开始的观察次数,所以这里我们在第一个时间步读取整个网格):

    precip$z = ncvar_get(nc, "precip", start=c(1, 1, 1), count=c(-1, -1, 1))
    # Convert to a raster if required
    precip.r = raster(precip)
    

    在所有时间步读取单个单元格

    您需要找到您的单元格索引,precip$xprecip$y 会有所帮助。一旦你有了它(例如单元格 x=5 和 y=10):

    precip.cell = ncvar_get(nc, "precip", start=c(5, 10, 1), count=c(1, 1, -1))
    

    【讨论】:

    猜你喜欢
    • 2017-12-19
    • 2020-09-16
    • 2017-05-05
    • 2013-12-04
    • 2014-04-12
    • 2015-07-17
    • 1970-01-01
    • 2020-08-07
    • 2018-05-12
    相关资源
    最近更新 更多