爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7106|回复: 6

OMI Ozone 数据转为GrADS二进制数据

[复制链接]

新浪微博达人勋

发表于 2012-5-31 14:46:30 | 显示全部楼层 |阅读模式

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

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

x
卫星臭氧观测数据OMI Ozone Level 3 Data可以在此网站上下载:http://ozoneaq.gsfc.nasa.gov/OMIOzone.md。数据的分辨率是1度*1度或0.25度*0.25度,每天一个数据文件,文件是文本格式,这里以1度*1度的数据为例。为了更方便地处理该数据,可以将多个时次的文本数据文件合并为一个GrADS二进制文件,脚本程序如下(需要MeteoInfo最新文件,见置顶帖子):
  1. #--------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2012-5-30                                                
  4. # Purpose: Convert OMI ozon data to GrADS binary data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------     
  7. import clr
  8. from System import *
  9. clr.AddReference("MeteoInfoC.dll")
  10. from MeteoInfoC import *
  11. from MeteoInfoC.Data import *
  12. from MeteoInfoC.Data.MeteoData import *

  13. import os.path

  14. #---- Set data folders
  15. baseDir = 'F:\\Temp\\satellite\\'
  16. dataDir = baseDir + 'OMI_ozone_201201\\'

  17. #---- Set output data file
  18. outCtlFile = baseDir + 'omi_ozone_201201.ctl'
  19. outDataFile = baseDir + 'omi_ozone_201201.dat'

  20. #---- Set start/end time
  21. sTime = DateTime(2012, 1, 1)
  22. eTime = DateTime(2012, 1, 31)
  23. tNum = (eTime - sTime).Days + 1
  24. print 'Start time: ' + sTime.ToString("yyyy-MM-dd")
  25. print 'End time: ' + eTime.ToString("yyyy-MM-dd")
  26. print 'Time Number: ' + str(tNum)

  27. #---- Define and set output GrADS data info
  28. gDataInfo = GrADSDataInfo()
  29. gDataInfo.FileName = outCtlFile
  30. gDataInfo.DSET = outDataFile
  31. gDataInfo.TITLE = 'OMI Ozone data'
  32. gDataInfo.DTYPE = 'GRIDDED'
  33. gDataInfo.XDEF.Type = 'LINEAR'
  34. gDataInfo.XDEF.XNum = 360
  35. gDataInfo.XDEF.XMin = -179.5
  36. gDataInfo.XDEF.XDelt = 1.0
  37. gDataInfo.YDEF.Type = 'LINEAR'
  38. gDataInfo.YDEF.YNum = 180
  39. gDataInfo.YDEF.YMin = -89.5
  40. gDataInfo.YDEF.YDelt = 1.0
  41. gDataInfo.ZDEF.Type = 'LINEAR'
  42. gDataInfo.ZDEF.ZNum = 1
  43. gDataInfo.ZDEF.SLevel = 1
  44. gDataInfo.ZDEF.ZDelt = 1
  45. gDataInfo.TDEF.Type = 'LINEAR'
  46. gDataInfo.TDEF.TNum = tNum
  47. gDataInfo.TDEF.STime = sTime
  48. gDataInfo.TDEF.TDelt = '1dy'
  49. aVar = VAR()
  50. aVar.VName = 'ozone'
  51. aVar.LevelNum = 0
  52. aVar.Units = '99'
  53. aVar.Description = 'OMI Ozone'
  54. gDataInfo.VARDEF.AddVar(aVar)

  55. #---- Write GrADS data file
  56. gDataInfo.CreateDataFile(outDataFile)
  57. aTime = sTime
  58. for t in range(0, tNum):
  59.         print aTime.ToString("yyyy-MM-dd")
  60.         inFilePath = dataDir + 'L3_ozone_omi_' + aTime.ToString("yyyyMMdd") + '.txt'
  61.         if os.path.isfile(inFilePath):
  62.                 print inFilePath
  63. #---- Read grid data form OMI Ozone data file
  64.                 gData = Array.CreateInstance(Double, 180, 360)
  65.                 dataFile = open(inFilePath)
  66.                 lineNum = 0
  67.                 dataStr = ''
  68.                 yIdx = 0
  69.                 xIdx = 0
  70.                 for aLine in dataFile.readlines():
  71.                         lineNum += 1
  72.                         if lineNum <= 3:
  73.                                 continue
  74.                                
  75.                         aLine = aLine[1:]
  76.                         dataStr = dataStr + aLine
  77.                         for i in range(0, 25):
  78.                                 if xIdx == 360:
  79.                                         xIdx = 0
  80.                                         yIdx += 1
  81.                                         break
  82.                                
  83.                                 dStr = aLine[i * 3:i * 3 + 3]
  84.                                 if dStr == '  0':
  85.                                         gData[yIdx, xIdx] = gDataInfo.UNDEF
  86.                                 else:
  87.                                         gData[yIdx, xIdx] = float(dStr) / 10
  88.                                 xIdx += 1
  89.                        
  90.                 dataFile.close()
  91.                 gDataInfo.WriteGridData(gData)
  92.         else:
  93.                 gDataInfo.WriteGridData_Null()
  94.                 print 'Null'
  95.        
  96.         aTime = aTime.AddDays(1)

  97. gDataInfo.CloseDataFile()

  98. #---- Write GrADS control file
  99. gDataInfo.WriteGrADSCTLFile()

  100. print 'Finished...'
复制代码

转换后的GrADS二进制数据可以用MeteoInfo绘图,或用脚本进行月平均之类的统计计算,也可以插值到站点和地面观测进行对比分析,图示如下:
Image00161.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-5-31 14:51:24 | 显示全部楼层
木有用过  支持一下
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-5-31 15:20:06 | 显示全部楼层
王老师,太有用了,谢谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-5-31 16:20:28 | 显示全部楼层
没用过这个数据,不过看起来挺漂亮的,牛逼~~~~王老师~~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-6-2 08:48:46 | 显示全部楼层
强烈支持!!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-29 20:24:35 | 显示全部楼层
谢谢老师
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2017-3-29 20:24:41 | 显示全部楼层
谢谢老师
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

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

本版积分规则

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

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

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