爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 9211|回复: 19

MeteoInfo脚本教程(十四):轨迹数据

[复制链接]

新浪微博达人勋

发表于 2014-12-20 13:29:18 | 显示全部楼层 |阅读模式

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

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

x
前面讲了格点和站点数据,除此以外轨迹数据也是气象领域常用的数据格式,比如气团轨迹、台风路径等。MeteoInfo目前直接支持MICAPS第7类格式(台风数据)和HYSPLIT模式输出的气团轨迹数据格式。其实数据格式有无数,使用脚本可以自己读各种格式中的轨迹数据。这里演示一个绘制HYSPLIT模式输出气团轨迹的例子。

用MeteoDataInfo类的openHYSPLITTrajData方法打开轨迹数据文件,并获取HYSPLITTrajDataInfo类的对象:
    mdi = MeteoDataInfo()
    mdi.openHYSPLITTrajData(fn)
    dataInfo = mdi.getDataInfo()

利用HYSPLITTrajDataInfo类的createTrajLayer生成气团轨迹线图层,createTrajPointLayer生成气团轨迹点图层,createTrajStartPointLayer生成轨迹起点点图层。

要绘制一维图,首先要构造相应的XY数据(XYDataset类),然后创建XYPlot类对象,再生成Chart类对象,最后在MapLayout中添加一个LayoutChart即可。

脚本代码如下:
  1. #-----------------------------------------------------
  2. # Author: Yaqiang Wang
  3. # Date: 2014-12-19
  4. # Purpose: Plot HYSPLIT trajectory data
  5. # Note: Sample
  6. #-----------------------------------------------------
  7. #---- Import classes
  8. print 'Import classes...'
  9. from org.meteoinfo.layout import MapLayout, PaperSize
  10. from org.meteoinfo.data.mapdata import MapDataManage
  11. from org.meteoinfo.data.meteodata import MeteoDataInfo
  12. from org.meteoinfo.global import Extent
  13. from org.meteoinfo.drawing import PointStyle
  14. from org.meteoinfo.chart import Chart
  15. from org.meteoinfo.chart.plot import XYPlot, ChartPlotMethod
  16. import os
  17. from java.awt import Color
  18. from javax.swing import JFrame

  19. #---- Set directories
  20. print 'Set directories...'
  21. baseDir = 'D:/MyProgram/Distribution/java/MeteoInfo/MeteoInfo'
  22. dataDir = os.path.join(baseDir, 'sample')
  23. mapDir = os.path.join(baseDir, 'map')
  24. figDir = 'D:/Temp/test'

  25. #---- Create MapLayout object
  26. mapLayout = MapLayout()
  27. mapFrame = mapLayout.getActiveMapFrame()
  28. ps = PaperSize('Custum', 650, 640)
  29. mapLayout.setPaperSize(ps)

  30. #---- Load country layer
  31. print 'Load country layer...'
  32. countryLayer = MapDataManage.loadLayer(os.path.join(mapDir, 'country1.shp'))
  33. lb = countryLayer.getLegendScheme().getLegendBreaks().get(0)
  34. lb.setOutlineColor(Color.black)
  35. lb.setOutlineSize(2)
  36. mapFrame.addLayer(countryLayer)

  37. #---- Create MeteoDataInfo object
  38. mdi = MeteoDataInfo()

  39. #---- Open a trajectory data file
  40. print 'Open trajectory data file...'
  41. fn = os.path.join(dataDir, 'HYSPLIT/tdump')
  42. mdi.openHYSPLITTrajData(fn)
  43. dataInfo = mdi.getDataInfo()

  44. #---- Create trajectory layers
  45. print 'Create trajectory layers...'
  46. trajLayer = dataInfo.createTrajLineLayer()
  47. startLayer = dataInfo.createTrajStartPointLayer()
  48. lb = startLayer.getLegendScheme().getLegendBreaks().get(0)
  49. lb.setStyle(PointStyle.Star)

  50. #---- Add layer
  51. mapFrame.addLayer(trajLayer)
  52. mapFrame.addLayer(startLayer)

  53. #---- Add pressure profile chart
  54. print 'Add pressure profile chart...'
  55. dataset = dataInfo.getXYDataset(12)    #Pressure is in 12th column
  56. plot = XYPlot(True, dataset)
  57. plot.setChartPlotMethod(ChartPlotMethod.LINE_POINT)
  58. plot.getXAxis().setLabel('Time')
  59. plot.getYAxis().setLabel('hPa')
  60. plot.getYAxis().setInverse(True)
  61. ls = trajLayer.getLegendScheme()
  62. for i in range(0, dataset.getSeriesCount()):
  63.   plot.setPolylineBreak(i, ls.getLegendBreaks().get(i))
  64. chart = Chart(None, plot)
  65. chart.setDrawLegend(False)
  66. layoutChart = mapLayout.addChart(10, 410)
  67. layoutChart.setWidth(590)
  68. layoutChart.setHeight(200)
  69. layoutChart.setChart(chart)

  70. #---- Add title
  71. title = mapLayout.addText('MeteoInfo script demo - Trajectory', 300, 30, 'Arial', 16)

  72. #---- Zoom map
  73. print 'Zoom map...'
  74. mapLayout.getActiveLayoutMap().setWidth(550)
  75. mapLayout.getActiveLayoutMap().setHeight(350)
  76. mapFrame.getMapView().zoomToExtent(trajLayer.getExtent().extend(2, 2))

  77. #---- Output figure
  78. print 'Output figure...'
  79. mapLayout.exportToPicture(os.path.join(figDir, 'traj_test.png'))

  80. #---- Set mapframe
  81. mapFrame.setGridXDelt(5)
  82. mapFrame.setGridYDelt(5)

  83. frame = JFrame('MeteoInfo Script Sample', size = (650, 680))
  84. frame.add(mapLayout)
  85. frame.visible = True

  86. print 'Finish...'


运行结果:
Image00093.png

本帖被以下淘专辑推荐:

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

新浪微博达人勋

发表于 2014-12-20 15:36:44 | 显示全部楼层
正需要学习了,老师今天怎么有空发教程的啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-12-20 19:31:49 | 显示全部楼层
谢啦 哥们                                         
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-12-25 13:38:07 | 显示全部楼层
好东西,谢谢。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-12-27 06:55:47 来自手机 | 显示全部楼层
向王老师致敬!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-1-22 20:10:14 | 显示全部楼层
谢谢啦!{:eb502:}{:eb502:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2016-4-10 21:09:14 | 显示全部楼层
老师您好 我想问一下 您示范的例图,如果想要把气压廓线换成其他物理量比如比湿或者位温 可以忙?请问要怎么改?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-4-10 21:32:30 | 显示全部楼层
djselina 发表于 2016-4-10 21:09
老师您好 我想问一下 您示范的例图,如果想要把气压廓线换成其他物理量比如比湿或者位温 可以忙?请问要怎 ...

参考这里:http://www.meteothinker.com/docs ... /data_tutorial.html
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-4-11 11:34:30 | 显示全部楼层
谢谢老师及时的回复 命令中dataset = dataInfo.getXYDataset(12)    #Pressure is in 12th column这一句我理解为气压的数据是在第12列,请问应该怎样查看其他列的数据分别代表什么物理意义呢?您给的链接我学习了 可是水平有限并没能找到答案。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-4-11 12:42:29 | 显示全部楼层
djselina 发表于 2016-4-11 11:34
谢谢老师及时的回复 命令中dataset = dataInfo.getXYDataset(12)    #Pressure is in 12th column这一句我 ...

这个你需要看HYSPLIT模式的用户手册里轨迹节点文件格式的说明。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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