爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7294|回复: 10

MeteoInfo脚本教程(二)

[复制链接]

新浪微博达人勋

发表于 2014-11-24 14:16:56 | 显示全部楼层 |阅读模式

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

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

x
需要先下载MeteoInfo Java最新版本(1.1.6R2或以上):http://www.meteothinker.com/Downloads.aspx

这一讲给出一个实际的MeteoInfo脚本程序。脚本里的主要内容包括:

1. 脚本说明注释。Jython里的注释用的是#号,给脚本程序增加说明注释是一个好习惯,比如加上脚本作者、日期、目的等信息。

2. 导入需要用到的类。面向对象编程里的最基本的要素就是“类”(class),类里面封装了变量、属性、方法等。当然MeteoInfo的功能也都是封装在一个个类里面。为了更好的组织类,用到了“包”(Package),包可以理解为目录,而类是目录中的一个个文件。比如:
    from org.meteoinfo.layout import MapLayout
其中org.meteoinfo.layout是包, 而MapLayout是该包里的一个类。MeteoInfo库中所有的类和包可以在库API帮助文档中找到(http://www.meteothinker.com/Documentation.aspx)。


3. 加载图形所需的地理底图数据。这个脚本加载了世界各国行政区域的shape文件并生成一个图层。


4. 打开气象数据文件。这里演示了打开MeteoInfo软件带的一个示例GrADS格式数据model.ctl文件。


5. 获取所需的格点数据。这里演示了获取"PS"变量的格点数据


6. 利用格点数据生成等值线填色图层。


7. 调整图形参数并输出图层。


8. 显示图形窗体。(通常并不需要,这里只是为了演示)。


具体的细节以后会仔细讲解。脚本程序如下:
  1. #-----------------------------------------------------
  2. # Author: Yaqiang Wang
  3. # Date: 2014-11-22
  4. # Purpose: Read GrADS data and plot
  5. # Note: Sample
  6. #-----------------------------------------------------
  7. #---- Import classes
  8. print 'Import classes...'
  9. from org.meteoinfo.layout import MapLayout
  10. from org.meteoinfo.data.mapdata import MapDataManage
  11. from org.meteoinfo.data.meteodata import MeteoDataInfo, DrawMeteoData
  12. from org.meteoinfo.legend import LegendManage, LegendType, GridLabelPosition
  13. from org.meteoinfo.layout import LegendStyles
  14. from org.meteoinfo.shape import ShapeTypes
  15. from org.meteoinfo.global import Extent
  16. import os.path
  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/GrADS')
  23. mapDir = os.path.join(baseDir, 'map')
  24. figDir = 'D:/Temp/test'

  25. #---- Create MapLayout object
  26. mapLayout = MapLayout()
  27. mapFrame = mapLayout.getActiveMapFrame()

  28. #---- Load country layer
  29. print 'Load country layer...'
  30. countryLayer = MapDataManage.loadLayer(os.path.join(mapDir, 'country1.shp'))
  31. lb = countryLayer.getLegendScheme().getLegendBreaks().get(0)
  32. lb.setDrawFill(False)
  33. lb.setOutlineColor(Color.blue)
  34. mapFrame.addLayer(countryLayer)

  35. #---- Open GrADS data
  36. print 'Open GrADS data...'
  37. mdi = MeteoDataInfo()
  38. mdi.openGrADSData(os.path.join(dataDir, 'model.ctl'))

  39. #---- Set time index
  40. mdi.setTimeIndex(2)

  41. #---- Get pressure grid data
  42. gdata = mdi.getGridData('PS')
  43. gdata.extendToGlobal()

  44. #---- Create pressure shaded layer
  45. print 'Create pressure shaded layer...'
  46. pressLayer = DrawMeteoData.createShadedLayer(gdata, 'Pressure', 'PS', True)

  47. #---- Add layer
  48. mapFrame.addLayer(pressLayer)

  49. #--- Move pressure layer to bottom
  50. mapFrame.moveLayer(pressLayer, 0)

  51. #---- Add title
  52. title = mapLayout.addText('MeteoInfo script demo', 350, 30, 'Arial', 16)

  53. #---- Zoom layout map
  54. print 'Zoom layout map...'
  55. mapLayout.getActiveLayoutMap().zoomToExtentLonLatEx(Extent(0, 360, -90, 90))

  56. #---- Set mapframe
  57. mapFrame.setGridXDelt(30)
  58. mapFrame.setGridYDelt(30)

  59. #---- Add legend
  60. legend = mapLayout.addLegend(150, 440)
  61. legend.setLegendStyle(LegendStyles.Bar_Horizontal)
  62. legend.setLegendLayer(pressLayer)

  63. #---- Output figure
  64. print 'Output figure...'
  65. mapLayout.paintGraphics()
  66. mapLayout.exportToPicture(os.path.join(figDir, 'pressure_test.png'))

  67. frame = JFrame('MeteoInfo Script Sample', size = (800, 600))
  68. frame.add(mapLayout)
  69. frame.visible = True
  70. print 'Finished!'




运行结果:
Image00757.png

本帖被以下淘专辑推荐:

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

新浪微博达人勋

发表于 2014-11-24 15:22:02 | 显示全部楼层
第一个顶,第一个学!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2014-11-24 15:37:21 | 显示全部楼层
王老师能否输出eps,pdf之类格式的图?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-11-24 15:39:19 | 显示全部楼层
兰溪之水 发表于 2014-11-24 15:37
王老师能否输出eps,pdf之类格式的图?

也想问这个问题,投稿的时候有些期刊要求eps,tif格式的图。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-11-24 15:55:58 | 显示全部楼层
rceclx 发表于 2014-11-24 15:39
也想问这个问题,投稿的时候有些期刊要求eps,tif格式的图。

MeteoInfo Java版可以输出ps格式图形文件(和eps类似),桌面软件输出图形功能有相应的选项。脚本里改一下文件后缀即可:

mapLayout.exportToPicture(os.path.join(figDir, 'pressure_test.ps'))
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2014-11-24 18:13:16 | 显示全部楼层
MeteoInfo 发表于 2014-11-24 15:55
MeteoInfo Java版可以输出ps格式图形文件(和eps类似),桌面软件输出图形功能有相应的选项。脚本里改一 ...

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

新浪微博达人勋

发表于 2014-12-10 19:39:16 | 显示全部楼层
支持王老师出新课程,之前是二次开发教程一路过来的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-12-6 21:48:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-6 23:10:08 | 显示全部楼层
气象人xyy 发表于 2017-12-6 21:48
请教老师,不知道您的脚本那些可以修改的,我试了试,就是运行不出来图。还望您能指导指导,谢谢

这个帖子很旧了,参考这里:http://bbs.06climate.com/forum.p ... &extra=page%3D1
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-12-9 10:45:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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