0

我想读取两个 netcdf 文件(两年的气候数据)并将一个网格(lon [15] 和 lat[15])的数据组合到一个数组(名为 prec_year),脚本如下。

我收到一个错误:

"Error in R_nc_get_vara_double: NetCDF: Index exceeds dimension bound
Var: precip  Ndims: 3   Start: 0,4294967284,59Count: 366,1,1Error in get.var.ncdf   (ex.nc, "precip", start = c(lon[1], lat[15], 1),  : 

C 函数 R_nc_get_vara_double 返回错误"

但是当我不指定 lat[],例如说“start = c(lon[1], 1,1)”时,它工作得很好。请帮助(1)为什么我得到这个错误,以及(2)如何解决它?

非常感谢!--------------------

setwd ("D://Historic Climate data/Aphrodyte/Prec_025/join 2 years")
Prec_origin <- c(1:2)
filenames <- list.files(pattern = NULL, all.files = FALSE)
 for(i in filenames){
filepath <- file.path("D://Historic Climate data/Aphrodyte/Prec_025/join 2 years/",paste    (i,sep=""))
    ex.nc = open.ncdf (filepath, readunlim=FALSE)
    lon = get.var.ncdf( ex.nc, "longitude")          # coordinate variable
  lat = get.var.ncdf( ex.nc, "latitude")          # coordinate variable
  day =  get.var.ncdf( ex.nc, "time")            # time variable
  #change lon[x] and lat[y] to select different files/locations for comparison
  prec_year = get.var.ncdf(ex.nc, "precip", start = c(lon[1],lat[15],1), count = c(1,1,-1))
    Prec_origin <- c(Prec_origin, prec_year)  #combine all data into one array
  close.ncdf (ex.nc)
 }
 Prec_origin <- Prec_origin[-(1:2)] # delete first two rows-
--------------
[1] "file D://Historic Climate data/Aphrodyte/Prec_025/join 2     years//APHRO_MA_025deg_V1003R1.1952.nc has 3 dimensions:"
[1] "time   Size: 366"
[1] "longitude   Size: 360"
[1] "latitude   Size: 280"
[1] "------------------------"
[1] "file D://Historic Climate data/Aphrodyte/Prec_025/join 2 years//APHRO_MA_025deg_V1003R1.1952.nc has 2 variables:"
[1] "float precip[longitude,latitude,time]  Longname:daily precipitation analysis interpolated onto 0.25deg grids [mm/day] Missval:-99.9000015258789"
[1] "float rstn[longitude,latitude,time]  Longname:ratio of 0.05deg-grids with station [%]     Missval:-99.9000015258789"
4

1 回答 1

2

在“开始”函数中,您需要定义索引号,而不是您希望开始的实际值。

我相信这正是您正在寻找的:

prec_year = get.var.ncdf(ex.nc, "precip", start = c(1,15,1), count = c(1,1,-1))

lon[1] 可能不会产生错误,因为它为您提供了一个可以作为索引的坐标(对于经度;1:360)。但是,输出不是您想要的(如果我理解得很好,您是个问题)。

作为信息,如果您想根据预先选择的坐标选择一个区域,您可以按如下方式执行此操作(可能不是最短的代码):

lon_select=which(x<=10 & x>=20)
lat_select=which(y<=40 & y>=50)

precip=get.var.ncdf(ex.nc,"precip",start=c(lon_select[1],lat_select[1],1), count=c(length(lon_select),length(lat_select),-1))
于 2013-09-26T14:56:37.660 回答