R中的netCDF文件

3

我有一个从这里获取的netCDF文件,名为precip.mon.total.v6.nc。我正在使用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中尝试了类似的问题。它可以比R更好地处理netCDF文件的内存问题。但是,由于我不擅长MATLAB,所以改变分辨率仍然是一个问题。如果您能提供任何帮助,我将非常感激。

你的B部分是一个非常大且开放式的问题。你需要考虑降尺度,一个常见的选项是使用失效率 - 为此,你需要一个分辨率与你想要降尺度到的相同的高程网格。 - MikeRSpencer
2个回答

11
当你提取变量时,需要指定你想要的维度。目前你正在请求R获取所有内容,因此我怀疑它正在创建一个可能非常庞大的三维数组。
ncdf4包通常代替ncdf,你应该尝试使用它。你需要决定是按位置读取数据还是按时间步长读取位置。这在一个简单的二维网格上更容易想象:
- 所有时间步骤中的单个单元格 - 所有位置的单个时间步骤
虽然你的是一个通过时间的三维网格(尽管第三个维度只有两个波段),但看起来你的变量没有使用波段维度。以下是基于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")

读取数据(注意,起始点是在维度中开始的索引,计数是从该点开始观察的观察次数,因此在这里我们读取了第一个时间步长的整个网格):

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))

谢谢Mike。我正在使用windows,ncdf4在其中不可用。但我肯定会研究linux。如何解决分辨率问题?(特别是在比较降雨数据的不同分辨率时,例如2.13 * 1.8和1 * 1)。请建议一些阅读材料或网站链接。 - Pankaj
这是我在R中对齐网格的答案: http://gis.stackexchange.com/questions/157557/clip-raster-by-raster-with-data-extraction-and-resolution-change/157597#157597 也许这篇论文对你的降尺度有帮助:http://www.iac.ethz.ch/doc/publications/2007_Schmidli_StatDyn.pdf 如我所说,降尺度是一个很大的话题。 - MikeRSpencer
我整理了一份指南,以便为NetCDF4准备您的Linux系统:https://scottishsnow.wordpress.com/2015/06/08/getting-ready-for-netcdf-4/ 希望对您有所帮助! - MikeRSpencer

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

or

cdo remapnn,r1440x720 in.nc out.nc

但是正如我所说的,如果你想进行插值以与另一个0.25度产品(例如TRMM)进行比较,最好采用另一种方法,将更精细的数据集插值到0.5度。

顺便说一下,2015年发布了GPCC的v7版本,仍然是0.5度。


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