爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 23972|回复: 90

MeteoInfo脚本示例:GRIB to ARL

[复制链接]

新浪微博达人勋

发表于 2015-1-12 23:44:58 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2015-1-13 12:52 编辑

之前发过帖子提供了将GRIB数据转为ARL格式数据(HYSPLIT模式所需气象数据格式)的IronPython脚本程序(MeteoInfo C#版),这里再给出一个Jython示例脚本(MeteoInfo Java版):

  1. #--------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2014-10-24                                               
  4. # Purpose: Convert GRIB data to ARL data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------
  7. from org.meteoinfo.data.meteodata import MeteoDataInfo
  8. from org.meteoinfo.data.meteodata.arl import ARLDataInfo
  9. from org.meteoinfo.data.meteodata.arl import DataLabel
  10. import os

  11. #---- Set directories
  12. dataDir = "D:/Temp"

  13. #---- Set output data file
  14. outFile = os.path.join(dataDir, 'arl/test2.arl')

  15. #---- Read a GRIB data file
  16. mydata = MeteoDataInfo()
  17. infile = os.path.join(dataDir, 'grib/201001011800.pgbh06.gdas.20100101-20100105.grb2')
  18. print infile
  19. mydata.openNetCDFData(infile)
  20. print 'GRIB file has been opened...'

  21. #---- Set output ARL data info
  22. arlDI = ARLDataInfo()

  23. #---- Set variable and level list
  24. gvars = ['Pressure_surface','Temperature_height_above_ground',\
  25.   'u-component_of_wind_height_above_ground','v-component_of_wind_height_above_ground',\
  26.   'Geopotential_height_isobaric','Temperature_isobaric',\
  27.   'u-component_of_wind_isobaric','v-component_of_wind_isobaric','Vertical_velocity_pressure_isobaric',\
  28.   'Relative_humidity_isobaric']
  29. avars = ['PRSS','T02M','U10M','V10M','HGTS','TEMP','UWND','VWND','WWND','RELH']
  30. levels = [0,1000,975,950,925,900,875,850,825,800,775,750,700,\
  31.   650,600,550,500,450,400,350,300,250,225,200,175,150,\
  32.   125,100,70,50,30,20,10,7,5,3,2,1]
  33. for l in levels:
  34.   arlDI.levels.add(l)
  35.   if l == 0:
  36.     arlDI.LevelVarList.add(['PRSS','T02M','U10M','V10M'])
  37.   else:
  38.     arlDI.LevelVarList.add(['HGTS','TEMP','UWND','VWND','WWND','RELH'])

  39. #---- Write ARL data file
  40. dataInfo = mydata.getDataInfo()
  41. arlDI.createDataFile(outFile)
  42. arlDI.X = dataInfo.getXDimension().getValues()
  43. arlDI.Y = dataInfo.getYDimension().getValues()
  44. variables = dataInfo.getVariables()
  45. tNum = dataInfo.getTimeNum()
  46. for t in range(0, tNum):
  47.   mydata.setTimeIndex(t)
  48.   atime = dataInfo.getTimes().get(t)
  49.   aDH = arlDI.getDataHead(mydata.getProjectionInfo(), 'FNL1', 2)
  50.   arlDI.writeIndexRecord(atime, aDH)
  51.   lidx = 0
  52.   for l in arlDI.levels:
  53.     print l
  54.     for v in arlDI.LevelVarList[lidx]:
  55.       vName = gvars[avars.index(v)]
  56.       print vName
  57.       if lidx == 0:
  58.         mydata.setLevelIndex(lidx)
  59.       else:
  60.         variable = dataInfo.getVariable(vName)
  61.         nlidx = variable.getZDimension().getDimValue().indexOf(l*100.0)
  62.         mydata.setLevelIndex(nlidx)
  63.       gData = mydata.getGridData(vName)
  64.       if v == 'PRSS' or v == 'WWND':
  65.         gData = gData.div(100)      
  66.       aDL = DataLabel(atime)
  67.       aDL.setLevel(lidx)
  68.       aDL.setVarName(v)
  69.       aDL.setGrid(99)
  70.       aDL.setForecast(0)
  71.       arlDI.writeGridData(aDL, gData)
  72.     lidx += 1

  73. arlDI.closeDataFile()

  74. print 'Finished!'


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

新浪微博达人勋

发表于 2015-1-13 10:43:53 | 显示全部楼层
1、如果输入格式是二进制,并且数据是单要素单层次的多个数据写成一个arl文件,是不是需要读二进制的函数,并且进行多次循环?
2、二进制数据的时间要自己赋给变量?不像grib数据通过函数就可以获取?
3、二进制数据的经纬度是不是也要赋给变量?
4、aDL.setGrid(99)是不是格数为99,这参数是不是可以修改?
5、aDL.setForecast(0)指的是预报时效?可修改?
6、aDH = arlDI.getDataHead(mydata.getProjectionInfo(), 'FNL1', 2)的2是什么意思?可修改吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-13 10:44:43 | 显示全部楼层
3、二进制数据的经纬度间隔是不是也要赋给变量?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-13 11:01:32 | 显示全部楼层
Sample Surface Level Parameters中的Total precipitation (6-h) m TPP6要素,如果资料的时间分辨率为3小时,是不是降水要素为3小时累积量,要素名改为TPP3?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-13 12:56:07 | 显示全部楼层
llg2002 发表于 2015-1-13 10:43
1、如果输入格式是二进制,并且数据是单要素单层次的多个数据写成一个arl文件,是不是需要读二进制的函数, ...

你能提供一个(或几个)二进制数据的示例文件吗?当然还要有数据格式的说明。数据本身是否包含经纬度、高度、时间等信息?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-13 13:47:07 | 显示全部楼层
llg2002 发表于 2015-1-13 11:01
Sample Surface Level Parameters中的Total precipitation (6-h) m TPP6要素,如果资料的时间分辨率为3小时 ...

1、2、3:是的
4、这个Grid应该没有什么作用,不是格点数,而是格点的一个所谓的符号。
5、是预报时次,不过也不重要,重要的是数据的时间。
6、这个是指的垂直分层的类型:
   1 - sigma
    2 - pressure
    3 - terrain
    4 - hybrid
7、需要知道数据的经纬度(或者投影的详细信息)
8、没见过TPP3这样的变量,不知道模式认不认,可以累加成TPP6
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-13 14:57:42 | 显示全部楼层
8、没见过TPP3这样的变量,不知道模式认不认,可以累加成TPP6

如果数据的时间分辨率是小于6小时,降水要素的分辨率仍为6小时,那就会出现有些时次没有降水要素。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-13 15:02:09 | 显示全部楼层
llg2002 发表于 2015-1-13 14:57
如果数据的时间分辨率是小于6小时,降水要素的分辨率仍为6小时,那就会出现有些时次没有降水要素。

这个问题你可以去HYSPLIT官方论坛上去问一下:https://hysplitbbs.arl.noaa.gov/index.php
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-1-13 15:06:13 | 显示全部楼层
llg2002 发表于 2015-1-13 14:57
如果数据的时间分辨率是小于6小时,降水要素的分辨率仍为6小时,那就会出现有些时次没有降水要素。

我刚上HYSPLIT官网上看了一下,TPP3是可以的,EDAS40数据里就有这个变量:http://ready.arl.noaa.gov/edas40.php
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-13 15:06:24 | 显示全部楼层
你能提供一个(或几个)二进制数据的示例文件吗?当然还要有数据格式的说明。数据本身是否包含经纬度、高度、时间等信息?

配上ctl,用aDataInfo = GrADSDataInfo(),aDataInfo.ReadDataInfo(infile)应该能读取数据
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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