爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7276|回复: 20

MeteoInfo脚本示例 - 从再分析数据中提取站点数据

[复制链接]

新浪微博达人勋

发表于 2014-9-14 19:21:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2014-9-14 19:23 编辑

从格点数据中提取某个点的数据其实就是一个插值过程,通常用双线性插值,MeteoInfo的格点数据类GridData有toStation(double x, double y)方法用双线性插值方法从格点数据中获取某个点的数据。下面两个脚本程序演示了从GDAS再分析数据中获取某点的边界层高度和三维风向风速数据,示例程序用的数据格式是ARL(HYSPLIT模式用的),不过只要是MeteoInfo支持的数据格式(比如netCDF, GRIB等)都可以用下面的脚本程序(只需做简单的改动)。脚本程序里有比较丰富的注释,这里就不多说了。需要说明在Java的Calendar中月份是从0开始的,因此月设为10其实是11月。
  1. #--------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2014-9-11                                                
  4. # Purpose: Extract station PBL data from ARL meteorological data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------
  7. from org.meteoinfo.data.meteodata import MeteoDataInfo
  8. import os.path
  9. from java.util import Date
  10. from java.util import Calendar
  11. from java.util import Locale
  12. from java.text import SimpleDateFormat

  13. #---- Set directories
  14. dataDir = 'P:/MetData/MetData/2011/'

  15. #---- Set times - this case show seasonal variation
  16. cal = Calendar.getInstance()
  17. cal.set(2011, 10, 1)
  18. sTime = cal.getTime()
  19. cal.set(2011, 11, 1)
  20. eTime = cal.getTime()
  21. aTime = sTime
  22. format = SimpleDateFormat('MMMyy', Locale.ENGLISH)
  23. format1 = SimpleDateFormat('yyyy-MM-dd HH:00')
  24. format2 = SimpleDateFormat('yyyyMMddHH')
  25. cal.setTime(sTime)

  26. #---- Create a MeteoDataInfo object
  27. mydata = MeteoDataInfo()
  28. #---- Set lon/lat of the location
  29. lon = 20.5
  30. lat = 40.5
  31. #---- Set output text file
  32. outpath = os.path.join(dataDir, 'PBL_data-1.txt')
  33. outf = open(outpath, 'w')
  34. outf.write('Time,PBLH')
  35. #---- Loop
  36. i = 0
  37. sum = 0.0
  38. while aTime <= eTime:
  39.           for w in range(5):
  40.                   inFile = dataDir + "gdas1." + format.format(aTime) + ".w" + str(w + 1)
  41.                 print inFile
  42.                 if os.path.isfile(inFile):
  43.                         mydata.openARLData(inFile)  #Open ARL data file
  44.                         tNum = mydata.getDataInfo().getTimeNum()   
  45.                         print tNum
  46.                         for t in range(tNum):
  47.                                 dTime = mydata.getDataInfo().getTimes().get(t)
  48.                                 print format1.format(dTime)
  49.                                 mydata.setTimeIndex(t)   #Set time index
  50.                                 gData = mydata.getGridData("PBLH")  #Get PBLH grid data
  51.                                 pblh = gData.toStation(lon, lat)  #Intepolate PBLH data to the location
  52.                                 print 'PBLH = %10.2f' %pblh
  53.                                 outf.write(os.linesep)
  54.                                 outf.write(format2.format(dTime) + ',%-7.2f ' %pblh)
  55.                                 sum += pblh
  56.                                 i += 1
  57.                           
  58.         cal.add(Calendar.MONTH, 1)
  59.         aTime = cal.getTime()

  60. outf.close()
  61. #---- Calculate seasonal average PBLH value
  62. ave = sum / i        
  63. print 'Average PBLH: %10.2f' %ave

  64. print 'Finished!'



  1. #--------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2014-9-11                                                
  4. # Purpose: Extract station wind data from ARL meteorological data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------
  7. from org.meteoinfo.data import DataMath
  8. from org.meteoinfo.data.meteodata import MeteoDataInfo
  9. import os.path
  10. from java.util import Date
  11. from java.util import Calendar
  12. from java.util import Locale
  13. from java.text import SimpleDateFormat

  14. #---- Set directories
  15. dataDir = 'P:/MetData/MetData/2011/'

  16. #---- Set times - this case show seasonal variation
  17. cal = Calendar.getInstance()
  18. cal.set(2011, 10, 1)
  19. sTime = cal.getTime()
  20. cal.set(2011, 10, 10)
  21. eTime = cal.getTime()
  22. aTime = sTime
  23. format = SimpleDateFormat('MMMyy', Locale.ENGLISH)
  24. format1 = SimpleDateFormat('yyyy-MM-dd HH:00')
  25. format2 = SimpleDateFormat('yyyyMMddHH')
  26. cal.setTime(sTime)

  27. #---- Create a MeteoDataInfo object
  28. mydata = MeteoDataInfo()
  29. #---- Set lon/lat of the location
  30. lon = 20.5
  31. lat = 40.5
  32. #---- Set output text file
  33. outpath = os.path.join(dataDir, 'wind_data.txt')
  34. outf = open(outpath, 'w')
  35. outf.write('Time,Pressure,WindDir,WindSpeed')
  36. #---- Loop
  37. while aTime <= eTime:
  38.           for w in range(5):
  39.                   inFile = dataDir + 'gdas1.' + format.format(aTime) + '.w' + str(w + 1)
  40.                 print inFile
  41.                 if os.path.isfile(inFile):
  42.                         mydata.openARLData(inFile)  #Open ARL data file
  43.                         dataInfo = mydata.getDataInfo()
  44.                         tNum = dataInfo.getTimeNum()    #Get time number
  45.                         print tNum
  46.                         zdim = dataInfo.getVariable('UWND').getZDimension()
  47.                         zNum = zdim.getDimLength()    #Get level number
  48.                         for t in range(tNum):
  49.                                 dTime = dataInfo.getTimes().get(t)
  50.                                 print format1.format(dTime)
  51.                                 mydata.setTimeIndex(t)   #Set time index
  52.                                 for z in range(zNum):
  53.                                         mydata.setLevelIndex(z)    #Set level index
  54.                                         lev = zdim.getDimValue().get(z)
  55.                                         uData = mydata.getGridData('UWND')    #Get U grid data
  56.                                         vData = mydata.getGridData('VWND')    #Get V grid data
  57.                                         #Calculate wind direction and wind speed from U/V
  58.                                         windData = DataMath.getDSFromUV(uData, vData)
  59.                                         wdData = windData[0]
  60.                                         wsData = windData[1]
  61.                                         wd = wdData.toStation(lon, lat)  #Intepolate grid data to the location
  62.                                         ws = wsData.toStation(lon, lat)
  63.                                         print 'Wind direction = %10.2f; Wind speed = %10.2f' %(wd,ws)
  64.                                         outf.write(os.linesep)
  65.                                         line = format2.format(dTime) + ',%d'%lev + ',%.2f '%wd + ',%.2f'%ws
  66.                                         outf.write(line)
  67.                           
  68.         cal.add(Calendar.MONTH, 1)
  69.         aTime = cal.getTime()

  70. outf.close()

  71. print 'Finished!'


评分

参与人数 2金钱 +21 贡献 +2 收起 理由
爱吃糯米团子 + 1
qxtlyf + 20 + 2 很给力!

查看全部评分

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

新浪微博达人勋

发表于 2014-9-14 19:59:31 | 显示全部楼层
学习了,谢谢王老师
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-9-14 20:37:58 | 显示全部楼层
好东西,O(∩_∩)O谢谢分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-9-14 22:26:24 | 显示全部楼层
{:eb303:}{:eb303:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2014-9-15 08:57:54 | 显示全部楼层
学习了,谢谢王老师!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-5-30 15:08:13 | 显示全部楼层
王老师,运行之后,出现错误代码,如下:
File "<iostream>", line 42
    ? ?? ?? ? for w in range(5):
    ^
SyntaxError: no viable alternative at character '?'
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-5-30 15:36:31 | 显示全部楼层
版主,运行后出现以下错误代码:
  File "", line 42
    &#160; &#160;&#160; &#160;&#160; &#160; for w in range(5):

    ^
SyntaxError: expected an indented block
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-5-30 16:25:30 | 显示全部楼层
代码改了一下可以了,缩进之前有点问题。
  1. #--------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2014-9-11                                                
  4. # Purpose: Extract station wind data from ARL meteorological data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------
  7. from org.meteoinfo.data import DataMath
  8. from org.meteoinfo.data.meteodata import MeteoDataInfo
  9. import os.path
  10. from java.util import Date
  11. from java.util import Calendar
  12. from java.util import Locale
  13. from java.text import SimpleDateFormat

  14. #---- Set directories
  15. dataDir = 'G:\\Meteodata\\2012\\'

  16. #---- Set times - this case show seasonal variation
  17. cal = Calendar.getInstance()
  18. cal.set(2012, 10, 1)
  19. sTime = cal.getTime()
  20. cal.set(2012, 10, 10)
  21. eTime = cal.getTime()
  22. aTime = sTime
  23. format = SimpleDateFormat('MMMyy', Locale.ENGLISH)
  24. format1 = SimpleDateFormat('yyyy-MM-dd HH:00')
  25. format2 = SimpleDateFormat('yyyyMMddHH')
  26. cal.setTime(sTime)

  27. #---- Create a MeteoDataInfo object
  28. mydata = MeteoDataInfo()
  29. #---- Set lon/lat of the location
  30. lon = 20.5
  31. lat = 40.5
  32. #---- Set output text file
  33. outpath = os.path.join(dataDir, 'wind_data.txt')
  34. outf = open(outpath, 'w')
  35. outf.write('Time,Pressure,WindDir,WindSpeed')
  36. #---- Loop
  37. while aTime <= eTime:
  38.      for w in range(5):
  39.         inFile = dataDir + 'gdas1.' + format.format(aTime) + '.w' + str(w + 1)
  40.         print inFile
  41.         if os.path.isfile(inFile):
  42.          mydata.openARLData(inFile)  #Open ARL data file
  43.          dataInfo = mydata.getDataInfo()
  44.          tNum = dataInfo.getTimeNum()    #Get time number
  45.          print tNum
  46.          zdim = dataInfo.getVariable('UWND').getZDimension()
  47.          zNum = zdim.getDimLength()    #Get level number
  48.          for t in range(tNum):
  49.             dTime = dataInfo.getTimes().get(t)
  50.             print format1.format(dTime)
  51.             mydata.setTimeIndex(t)   #Set time index
  52.             for z in range(zNum):
  53.                mydata.setLevelIndex(z)    #Set level index
  54.                lev = zdim.getDimValue().get(z)
  55.                uData = mydata.getGridData('UWND')    #Get U grid data
  56.                vData = mydata.getGridData('VWND')    #Get V grid data
  57.                #Calculate wind direction and wind speed from U/V
  58.                windData = DataMath.getDSFromUV(uData, vData)
  59.                wdData = windData[0]
  60.                wsData = windData[1]
  61.                wd = wdData.toStation(lon, lat)  #Intepolate grid data to the location
  62.                ws = wsData.toStation(lon, lat)
  63.                print 'Wind direction = %10.2f; Wind speed = %10.2f' %(wd,ws)
  64.                outf.write(os.linesep)
  65.                line = format2.format(dTime) + ',%d'%lev + ',%.2f '%wd + ',%.2f'%ws
  66.                outf.write(line)
  67.                
  68.      cal.add(Calendar.MONTH, 1)
  69.      aTime = cal.getTime()

  70. outf.close()

  71. print 'Finished!'
复制代码
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-5-30 20:20:48 | 显示全部楼层
这是个很实用的东西啊 王老师 我才看见,用过由格点转站点的,记得是用surfer完成的,看到您的这个东西恒感慨,虽然也会写点程序什么的,但是对您的脚本确是一窍不通,我是您软件最早的试用者,却一直不会您的脚本,汗颜啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-7-19 20:15:08 | 显示全部楼层
王老师,求边界层高度的我用了一下,出现一个错误,不知道是怎么回事
>>> run script...
  File "<iostream>", line 40
    print inFile
    ^
IndentationError: unindent does not match any outer indentation level
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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