- 积分
- 3051
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-5-14
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
这是我自己用的IDL读取nc文件的代码,分享给大家,再跟大家讨论下其中的一些问题。
pro readncHGT
cdfid=ncdf_open('d:/data/ncep/hgt.mon.mean.nc',/nowrite)
data=make_array(144,73,17,810,/float)
varid=ncdf_varid(cdfid,'hgt') ;与grads的ctl里看到的变量名一致
ncdf_varget,cdfid,varid,data
ncdf_attget,cdfid,varid,'scale_factor',a ;系数
ncdf_attget,cdfid,varid,'add_offset',b ;偏值
ncdf_close,cdfid
hgtdata=fltarr(144,73,17,810) ;设置一个新变量
hgtdata=reverse(data,2)*a+b ;先南北反转,再乘加系数
end
经过这一步后,hgtdata就成功的获取到了hgt的所有数据。
其中,需要reverse这一步,2表示将第二维进行反转操作,因为IDL读到的顺序跟nc文件存储的不一样,这个有点费解。
第二个问题是系数和偏值的问题。有不少文章解释,直接读取到的值,需要乘以系数和偏值,才能作为真实值。但我在读一些nc文件时,只有在读取hgt.mon.mean.nc文件时,才能读出这个系数和偏值,而且系数a=1,偏值=0,也就意味着读出来的值就是正常值。而读air气温数据、uwnd、vwnd时,会出现错误提示:
% NCDF_ATTGET: Attribute inquiry failed, name "scale_factor" not found.
% NCDF_ATTGET: Attribute read failed, name "scale_factor" not found.
% NCDF_ATTGET: Attribute inquiry failed, name "add_offset" not found.
% NCDF_ATTGET: Attribute read failed, name "add_offset" not found.
此时,a和b会变成随机数组,经常是4个长度的随机数组,这样再与data相乘,就会出现可怕的灾难,所有数据瞬间变成长度只有4的数组了......所以最好先调试下看,自己的nc文件是否能正常读出系数和偏值,再进行纠正,否则,会出现意想不到的问题。
经过检验,原值与用grads绘制出来的图形完全一样。
IDL我也不是很熟,抛砖引玉,看看大家有什么看法
|
|