爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
楼主: MeteoInfo

GRIB格式转为ARL格式

[复制链接]

新浪微博达人勋

发表于 2013-1-16 10:30:01 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-1-16 14:01:59 | 显示全部楼层
本帖最后由 MeteoInfo 于 2013-1-16 14:03 编辑
dolces 发表于 2013-1-16 10:30
太谢谢了王老师

下了个0.5度的数据试了试,现在应该可以了,需要MeteoInfo最新文件(见置顶帖子,或者在www.meteothinker.com上下载更新文件)。示例脚本程序如下,脚本中读取0.5度ARL数据,挑出一些高度层数据输出。

  1. #-----------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2013-1-16                                               
  4. # Purpose: Read and write ARL data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------
  7. import clr
  8. from System import *
  9. from System.Collections.Generic import *
  10. clr.AddReference("MeteoInfoC.dll")
  11. from MeteoInfoC import *
  12. from MeteoInfoC.Data import *
  13. from MeteoInfoC.Data.MeteoData import *

  14. #---- Set directories
  15. dataDir = "D:\\SampleData"

  16. #---- Set output data file
  17. outFile = dataDir + '\\test.arl'

  18. #---- Read a GRIB data file
  19. mydata = MeteoDataInfo()
  20. infile = dataDir + '\\20130113_gdas0p5'
  21. mydata.OpenARLData(infile)
  22. inarlDI = mydata.DataInfo

  23. #---- Set output ARL data info
  24. arlDI = ARLDataInfo()

  25. #---- Set variable and level list
  26. arlDI.X = mydata.GetX()
  27. arlDI.Y = mydata.GetY()
  28. arlDI.levels.Add(inarlDI.levels[0])
  29. arlDI.LevelVarList.Add(inarlDI.LevelVarList[0])
  30. for lidx in range(1, inarlDI.levels.Count, 2):
  31.    arlDI.levels.Add(inarlDI.levels[lidx])
  32.    arlDI.LevelVarList.Add(inarlDI.LevelVarList[lidx])

  33. #---- Write ARL data file
  34. arlDI.CreateDataFile(outFile)
  35. tNum = mydata.GetTimeNumber()
  36. for t in range(0, tNum):
  37.     mydata.TimeIndex = t
  38.     atime = mydata.GetTime(t)
  39.     print atime.ToString("yyyy-MM-dd HH")
  40.     aDH = arlDI.GetDataHead(mydata.ProjInfo, 'GDAS', 4)
  41.     arlDI.WriteIndexRecord(atime, aDH)
  42.     lidx = 0
  43.     for l in arlDI.levels:
  44.         print l
  45.         nlidx = inarlDI.levels.IndexOf(l)
  46.         if nlidx > 0:
  47.             nlidx -= 1
  48.         print nlidx
  49.         mydata.LevelIndex = nlidx
  50.         for v in arlDI.LevelVarList[lidx]:   
  51.             print v
  52.             gData = mydata.GetGridData(v)
  53.             aDL = DataLabel(atime)
  54.             aDL.Level = lidx
  55.             aDL.Variable = v
  56.             aDL.Grid = 99
  57.             aDL.Forecast = 0
  58.             arlDI.WriteGridData(aDL, gData)
  59.         lidx += 1

  60. arlDI.CloseDataFile()

  61. print 'Finished!'

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

新浪微博达人勋

发表于 2013-1-17 13:30:49 | 显示全部楼层
本帖最后由 dolces 于 2013-1-17 13:42 编辑
MeteoInfo 发表于 2013-1-16 14:01
下了个0.5度的数据试了试,现在应该可以了,需要MeteoInfo最新文件(见置顶帖子,或者在www.meteothinker ...

王老师,我用这个script转0.5度的数据,不间隔取层数,就是说56层全部重写到新文件里的话,出来的数据是1.7G,但是原数据只有479M,你测试的时候有没有出现这样的情况?

另外,把新写的数据放到HYSPLIT里算轨迹出错了,出错信息如下:
*ERROR* metset: 2nd time period INDX record missing
Calculation Started ... please be patient
*ERROR* metpos: start point not within (x,y,t) any data file
  - start time before start of meteorology data
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-1-17 13:54:55 | 显示全部楼层
本帖最后由 dolces 于 2013-1-17 14:59 编辑
dolces 发表于 2013-1-17 13:30
王老师,我用这个script转0.5度的数据,不间隔取层数,就是说56层全部重写到新文件里的话,出来的数据是1 ...

我查看了原数据和新数据的信息,有几个参数的值不同,不知道对你有没有用:
原数据:
File Name: E:\test\20110101_gdas0p5
File Start Time: 2011-01-01 00:00
File End Time: 2011-01-01 21:00
Record Length Bytes: 259970
Meteo Data Model: GHDA
Xsize = 720  Ysize = 361  Zsize = 56  Tsize = 8
Record Per Time: 236
Pole pnt lat/lon: 90  359.5
Reference pnt lat/lon: 0.5  0.5
Grid Size: 0
Orientation: 0
Tan lat/cone: 0
Syn pnt x/y: 1  1
Syn pnt lat/lon: -90  0

新数据:
File Name: E:\test\test.arl
File Start Time: 2011-01-01 00:00
File End Time: 2011-01-01 21:00
Record Length Bytes: 259970
Meteo Data Model: GDAS
Xsize = 720  Ysize = 361  Zsize = 56  Tsize = 8
Record Per Time: 841
Pole pnt lat/lon: 90  0
Reference pnt lat/lon: 0.5  0.5
Grid Size: 0
Orientation: 0
Tan lat/cone: 0
Syn pnt x/y: 1  1
Syn pnt lat/lon: -90  0

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

新浪微博达人勋

发表于 2013-1-17 13:57:17 | 显示全部楼层
Record Per Time: 841 这个参数应该是新数据大小是原数据大概3.6倍的原因
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-1-17 16:27:20 | 显示全部楼层
dolces 发表于 2013-1-17 13:57
Record Per Time: 841 这个参数应该是新数据大小是原数据大概3.6倍的原因

我试了试,所有层都输出和源文件大小是一样的,估计你的script程序改得有问题。你依据下面的script程序重新转一下,然后用HYSPLIT测试一下吧。
  1. #-----------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2013-1-16                                               
  4. # Purpose: Read and write ARL data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------
  7. import clr
  8. from System import *
  9. from System.Collections.Generic import *
  10. clr.AddReference("MeteoInfoC.dll")
  11. from MeteoInfoC import *
  12. from MeteoInfoC.Data import *
  13. from MeteoInfoC.Data.MeteoData import *

  14. #---- Set directories
  15. dataDir = "D:\\SampleData"

  16. #---- Set output data file
  17. outFile = dataDir + '\\test.arl'

  18. #---- Read a GRIB data file
  19. mydata = MeteoDataInfo()
  20. infile = dataDir + '\\20130113_gdas0p5'
  21. mydata.OpenARLData(infile)
  22. inarlDI = mydata.DataInfo

  23. #---- Set output ARL data info
  24. arlDI = ARLDataInfo()

  25. #---- Set variable and level list
  26. arlDI.X = mydata.GetX()
  27. arlDI.Y = mydata.GetY()
  28. for lidx in range(0, inarlDI.levels.Count):
  29.    arlDI.levels.Add(inarlDI.levels[lidx])
  30.    arlDI.LevelVarList.Add(inarlDI.LevelVarList[lidx])

  31. #---- Write ARL data file
  32. arlDI.CreateDataFile(outFile)
  33. tNum = mydata.GetTimeNumber()
  34. for t in range(0, tNum):
  35.     mydata.TimeIndex = t
  36.     atime = mydata.GetTime(t)
  37.     print atime.ToString("yyyy-MM-dd HH")
  38.     aDH = arlDI.GetDataHead(mydata.ProjInfo, 'GDAS', 4)
  39.     arlDI.WriteIndexRecord(atime, aDH)
  40.     lidx = 0
  41.     for l in arlDI.levels:
  42.         print l
  43.         nlidx = inarlDI.levels.IndexOf(l)
  44.         if nlidx > 0:
  45.             nlidx -= 1
  46.         print nlidx
  47.         mydata.LevelIndex = nlidx
  48.         for v in arlDI.LevelVarList[lidx]:   
  49.             print v
  50.             gData = mydata.GetGridData(v)
  51.             aDL = DataLabel(atime)
  52.             aDL.Level = lidx
  53.             aDL.Variable = v
  54.             aDL.Grid = 99
  55.             aDL.Forecast = 0
  56.             arlDI.WriteGridData(aDL, gData)
  57.         lidx += 1

  58. arlDI.CloseDataFile()

  59. print 'Finished!'

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

新浪微博达人勋

发表于 2013-1-17 16:56:58 | 显示全部楼层
本帖最后由 dolces 于 2013-1-17 17:05 编辑
MeteoInfo 发表于 2013-1-17 16:27
我试了试,所有层都输出和源文件大小是一样的,估计你的script程序改得有问题。你依据下面的script程序重 ...

这次数据大小没问题,轨迹也画出来了,辛苦了王老师。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-1-17 17:14:00 | 显示全部楼层
MeteoInfo 发表于 2013-1-17 16:27
我试了试,所有层都输出和源文件大小是一样的,估计你的script程序改得有问题。你依据下面的script程序重 ...

还有个小问题,level 0是地面,层数越大高度越高对吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-1-17 17:36:08 | 显示全部楼层
dolces 发表于 2013-1-17 17:14
还有个小问题,level 0是地面,层数越大高度越高对吗?

level 0是地面,hybrid坐标我也不是很清楚,你查查资料吧。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-3 07:53:36 | 显示全部楼层
感谢楼主。学习了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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