爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4384|回复: 2

[混合编程] IDL读取nc/netCDF文件遇空变量报错的解决办法

[复制链接]

新浪微博达人勋

发表于 2019-11-18 10:49:03 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
附件有2个nc文件,其中以“*N01V1.NC”结尾的文件中没有空变量,以“*N07V1.NC”结尾的文件中有空变量
用函数ncdf_varget,file_id,var_id,var将文件id为file_id、变量id为var_id的量赋给var时会报错,程序会当掉!
下面我使用捕捉程序错误的方法跳过这个异常:

pro read_nc
  ;nc文件所在目录:
  fold='C:\Users\Administrator\Desktop\nc\'
  ;准备一个存在非空变量的nc文件:
  goodfile=fold+'FY4A-_LMI---_N_REGX_1047E_L2-_LMIE_SING_NUL_20180728000000_20180728000449_7800M_N01V1.NC'
  ;该文件ID:
  goodfile_id = ncdf_open(goodfile, /nowrite )
  ;如果第一个变量非空,就用这个变量:
  good_var=ncdf_varinq(goodfile_id,0)
  ;非空变量的ID:
  good_var_id= ncdf_varid(goodfile_ID,good_var.name)
  ;至此,正常文件的id和变量的id已获取,后面如遇到空变量,就用这2个量顶替

  ;可能存在空变量的待处理文件:
  file=fold+'FY4A-_LMI---_N_REGX_1047E_L2-_LMIE_SING_NUL_20180728003510_20180728004449_7800M_N07V1.nc'
  ;获取文件ID:
  file_id = ncdf_open(file,/nowrite)

  ;下面需要获取结构体变量名,根据名字把数据读出来
  ;返回值file_info是个结构体,给出了维度数、变量数,根据变量数我们进行循环:
  file_info=ncdf_inquire(file_id)
  ;变量个数:
  var_num=file_info.nvars
  FOR varid=0,var_num-1 DO BEGIN;
    var = ncdf_varinq( file_id,varid)
    var_id=ncdf_varid(file_ID,var.name)
    ;看一下此次循环会获取的变量名:
    print,'准备获取变量:',var.name

    ;用ncdf_varget函数获取变量的中间量:文件id和变量id
    ;之所以用中间量是为了在出错时替换之:
    file_id2=file_id
    var_id2=var_id

    ;判断变量是否空,默认非空:
    ;后面如果error=1变量就按原量赋之,如果error=0变量就赋NaN:
    error=1

    ;找异常,出现异常时用前面准备的文件ID和变量ID顶替,这样程序就不会停了:
    CATCH, Error_status
    IF Error_status NE 0 THEN BEGIN
      print,'出现空变量:',var.name
      PRINT, 'Error index:', Error_status
      PRINT, 'Error message:', !ERROR_STATE.MSG
      file_id2=goodfile_id
      var_id2=good_var_id
      error=0
      CATCH, /CANCEL
    ENDIF
    ;获取变量:
    ncdf_varget,file_id2,var_id2,mid_var
    ;如果变量空,mid_var就赋NaN:
    if error eq 0 then mid_var=!values.f_nan
    ;把文件中每个量,赋给相同名字的变量
    (scope_varfetch(var.name,/enter))=mid_var
  ENDFOR
  help,lon,lat,OBIType
end


输出:
准备获取变量:LON
出现空变量:LON
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:LAT
出现空变量:LAT
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:ETT
出现空变量:ETT
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:EOT
出现空变量:EOT
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:ER
出现空变量:ER
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:EFP
出现空变量:EFP
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:EA
出现空变量:EA
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:EGA
出现空变量:EGA
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:EXP
出现空变量:EXP
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:EYP
出现空变量:EYP
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:DQF
出现空变量:DQF
Error index:        -176
Error message:
Array dimensions must be greater than 0.
准备获取变量:nominal_satellite_subpoint_lat
准备获取变量:nominal_satellite_subpoint_lon
准备获取变量:nominal_satellite_height
准备获取变量:geospatial_lat_lon_extent
准备获取变量:OBIType
准备获取变量:processing_parm_version_container
准备获取变量:algorithm_product_version_container
LON             FLOAT     =           NaN
LAT             FLOAT     =           NaN
OBITYPE         LONG      =            0


FY4A-_LMI---_N_REGX_1047E_L2-_LMIE_SING_NUL_20180728000000_20180728000449_7800M_N01V1.NC

92 KB, 下载次数: 1, 下载积分: 金钱 -5

FY4A-_LMI---_N_REGX_1047E_L2-_LMIE_SING_NUL_20180728003510_20180728004449_7800M_N07V1.NC

69.49 KB, 下载次数: 1, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-11-19 14:59:23 | 显示全部楼层
{:eb334:}{:eb334:}楼主的知识面还是广,很多次忽略的纠错函数catch。这次学习到了。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-11-19 15:20:29 | 显示全部楼层
ANDYKYLE 发表于 2019-11-19 14:59
楼主的知识面还是广,很多次忽略的纠错函数catch。这次学习到了。

交流学习,共同进步!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表