爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 8933|回复: 0

[其他] 编写netCDF

[复制链接]

新浪微博达人勋

发表于 2019-1-17 15:53:16 | 显示全部楼层 |阅读模式

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

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

x
怎么使用filedimdef函数?
打算提取MOD04_L2的数据,其中设置新的文件,重新编写nc文件。但是编写.nc文件时一直出错,也搞不懂官网上的filedimdef函数,希望大神指教一下。

load "$NCARG_ROOT/lib/ncarg/nclex/gsun/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"

begin
diri="H:/MYD/china/MOD04_2L/20181124/"
fili = systemfunc("cd "+diri+" ; ls MOD04*.hdf");
nfil = dimsizes(fili)
print("nfil="+nfil)
;  Time=new(dimsizes(fili(0)),string) ;/Time     ->string
;  header = (/"                 file                       aod"/)
;  head   = [/header/]
;  write_table("./aod_L2_bj_combined.txt", "w", head, "%s")

m = 0
p = 0
; 设置AOD数组属性,lat2d,lon2d 经纬度属性
k = ispan(0,8019,1)    ; 8020数组值多
q = ispan(0,4034,1)

lat2d = new((/8020,4035/),float)
lat2d!0 = "k"
lat2d!1 = "q"
lat2d&k = k
lat2d&q = q
lat2d@units = "Degrees_north"
lat2d@long_name = "Geodetic Latitude"
lat2d@_FillValue = -999

lon2d = new((/8020,4035/),float)
lon2d!0 = "k"
lon2d!1 = "q"
lon2d&k = k
lon2d&q = q
lon2d@long_name = "Degrees_east"
lon2d@units = "Geodetic Longitude"
lon2d@_FillValue = -999

AOD = new((/8020,4035/),double)
AOD!0 = "k"
AOD!1 = "q"
AOD&k = k
AOD&q = q
AOD@units = "None"
AOD@long_name = "Combined Dark Target, Deep Blue AOT at 0.55 micron for land and ocean."
AOD@_FillValue = -9999

do nf=0,nfil-1
f = addfile(diri+fili(nf), "r")
  printVarSummary(f)
  x = f->AOD_550_Dark_Target_Deep_Blue_Combined            ;读取AOD变量

   printVarSummary(x)
  aod=x@scale_factor*1.d * (x-x@add_offset)
  lat = f->Latitude
  lon = f->Longitude
  printVarSummary(lat)
  printVarSummary(lon)
  printVarSummary(aod)


do i=0,202
  do j=0,134
     if(ismissing(lat(i,j)))then
     else
    if(ismissing(lon(i,j)))then
     else
if((lat(i,j).gt.24).and.(lat(i,j).lt.37).and.(lon(i,j).gt.107.5).and.(lon(i,j).lt.117.5))then
  lat2d(p,m) = lat(i,j)
  lon2d(p,m) = lon(i,j)
  ;print(lat2d)
  if(ismissing(aod(i,j)))then
  else
   AOD(p,m) = aod(i,j)  ;;让符合经纬度的数据写入AOD
      print(AOD(p,m))
      m = m+1
    end if
   end if
  end if
end if
    end do
     p = p+1
   end do  
end do
printVarSummary(AOD)
outfile = "daymod04.nc"
if (isfilepresent(outfile))then
    system("rm -f " + outfile)
end if
fout = addfile(outfile,"c")
nlat2d = dimsizes(lat2d)
nlon2d = dimsizes(lon2d)
print(dimsizes(AOD))
   setfileoption(fout,"DefineMode",True) ; 写入nc的模式使用DefineMode,摘抄样本
  fAtt               =  True       ;-- assign file attributes
                                   ;设置fout文件的属性
  fAtt@title         = "A Day of MODIS04_L2"  
  fAtt@source_file   =  fili
  fAtt@creation_date =  systemfunc ("date")        
  fAtt@history       = "modis04l2"
  fAtt@platform = "MOD04_L2"
  fileattdef(fout,fAtt)            ;-- copy file attributes   
  
dim_names = (/ "lat2d", "lon2d"/)   
  dim_sizes = (/  nlat2d, nlon2d/)        
  dimUnlim = (/ False, False/)      
  filedimdef(fout,dim_names,dim_sizes,dimUnlim)

  filevardef(fout, "lat2d"  ,typeof(lat2d), getvardims(lat2d))                          
  filevardef(fout, "lon2d"  ,typeof(lon2d), getvardims(lon2d))                          
  filevardef(fout, "AOD"   ,typeof(AOD),  getvardims(AOD))
  filevarattdef(fout,"lat2d"  ,lat2d)    ;-- copy lat attributes
  filevarattdef(fout,"lon2d"  ,lon2d)    ;-- copy lon attributes
  filevarattdef(fout,"AOD",   AOD)     ;-- copy AODattributes
  setfileoption(fout,"DefineMode",False)
  fout->lat2d    =  (/lat2d/)         ;-- write lat to new netCDF file
  fout->lon2d    =  (/lon2d/)         ;-- write lon to new netCDF file
  fout->AOD     =  (/AOD/)        ;-- write variable to new netCDF file
end

运行后显示错误

运行后显示错误

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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