爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 10643|回复: 9

MeteoInfo脚本教程(十二):Maskout

[复制链接]

新浪微博达人勋

发表于 2014-12-6 23:26:37 | 显示全部楼层 |阅读模式

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

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

x
如果希望专业内容的图形部分只出现在某个区域内,即屏蔽区域外的图形,可以用MeteoInfo中的Maskout功能。图形最终都是显示在MapView中,MapView类中有个变量是MaskOut类的对象,用MapView类的getMaskOut()方法获取。MaskOut类的setMask(Boolean isMask)方法设置了是否启用MaskOut功能,SetMaskLayer(String layerName)方法设置了作为Maskout使用的图层,图层的图元类型必须Polygon,最好不要太复杂(会影响图形绘制速度)。每一个图层都有一个setMaskout(Boolean isMask)方法来设置该图层是否被Maskout,这样可以实现只Maskout某些特定图层。

示例脚本如下:
  1. #-----------------------------------------------------
  2. # Author: Yaqiang Wang
  3. # Date: 2014-12-6
  4. # Purpose: Maskout layer
  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. mapView = mapFrame.getMapView()

  29. #---- Load country layer
  30. print 'Load country layer...'
  31. bou2Layer = MapDataManage.loadLayer(os.path.join(mapDir, 'bou2_4p.shp'))
  32. lb = bou2Layer.getLegendScheme().getLegendBreaks().get(0)
  33. lb.setDrawFill(False)
  34. lb.setOutlineColor(Color.gray)
  35. mapFrame.addLayer(bou2Layer)
  36. countryLayer = MapDataManage.loadLayer(os.path.join(mapDir, 'country1.shp'))
  37. lb = countryLayer.getLegendScheme().getLegendBreaks().get(0)
  38. lb.setDrawFill(False)
  39. lb.setOutlineColor(Color.blue)
  40. mapFrame.addLayer(countryLayer)
  41. chinaLayer = MapDataManage.loadLayer(os.path.join(mapDir, 'china.shp'))
  42. chinaLayer.setVisible(False)
  43. mapFrame.addLayer(chinaLayer)

  44. #---- Open GrADS data
  45. print 'Open GrADS data...'
  46. mdi = MeteoDataInfo()
  47. mdi.openGrADSData(os.path.join(dataDir, 'model.ctl'))

  48. #---- Set time index
  49. mdi.setTimeIndex(2)

  50. #---- Get pressure grid data
  51. gdata = mdi.getGridData('PS')
  52. gdata.extendToGlobal()

  53. #---- Create pressure shaded layer
  54. print 'Create pressure shaded layer...'
  55. pressLayer = DrawMeteoData.createShadedLayer(gdata, 'Pressure', 'PS', True)
  56. pressLayer.setMaskout(True)

  57. #---- Add layer
  58. mapFrame.addLayer(pressLayer)

  59. #--- Move pressure layer to bottom
  60. mapFrame.moveLayer(pressLayer, 0)

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

  63. #---- Zoom layout map
  64. print 'Zoom layout map...'
  65. mapLayout.getActiveLayoutMap().zoomToExtentLonLatEx(Extent(70, 140, 15, 55))

  66. #---- Set maskout
  67. mapView.getMaskOut().setMask(True)
  68. mapView.getMaskOut().setMaskLayer(chinaLayer.getLayerName())

  69. #---- Set mapframe
  70. mapFrame.setGridXDelt(10)
  71. mapFrame.setGridYDelt(10)

  72. #---- Add legend
  73. legend = mapLayout.addLegend(660, 120)
  74. legend.setLegendStyle(LegendStyles.Bar_Vertical)
  75. legend.setLegendLayer(pressLayer)

  76. #---- Output figure
  77. print 'Output figure...'
  78. mapLayout.paintGraphics()
  79. #mapLayout.exportToPicture(os.path.join(figDir, 'pressure_test.ps'))

  80. frame = JFrame('MeteoInfo Script Sample', size = (800, 600))
  81. frame.add(mapLayout)
  82. frame.visible = True
  83. print 'Finished!'


未启用Maskout:
Image00081.png

启用Maskout:
Image00080.png

本帖被以下淘专辑推荐:

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

新浪微博达人勋

0
早起挑战累计收入
发表于 2014-12-7 09:10:18 | 显示全部楼层
楼主要出书的节奏啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-12-11 19:59:28 | 显示全部楼层
真希望王老师出一本书,这样就能全面学习了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-11-16 11:35:51 | 显示全部楼层
王老师,我想问一下,我有全中国的数据,想只做云南省的等值线图,假设用maskout选取出来云南省的区域,那能在云南省成一个闭合的等值线么?还是只是截取了云南省区域的的。因为我原来用grads做的时候只是直接截取了这个区域的。不知道我表达清楚了没?新手,有点表达不清。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-11-16 12:05:55 | 显示全部楼层
wangxue910402 发表于 2015-11-16 11:35
王老师,我想问一下,我有全中国的数据,想只做云南省的等值线图,假设用maskout选取出来云南省的区域,那 ...

MeteoInfo里maskout分两种方式,maskout数据(和GrADS一样)和maskout图形。

maskout数据的例子:http://bbs.06climate.com/forum.p ... &extra=page%3D1

maskout图形的例子:http://bbs.06climate.com/forum.p ... &extra=page%3D1
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-12-24 22:30:18 | 显示全部楼层
老师您好,请问如果我只想要海区的内容,应当如何去掉陆地部分呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-7-28 11:27:32 | 显示全部楼层
请问he5做的图也可以屏蔽吗
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-7-28 11:48:11 | 显示全部楼层
zq01 发表于 2016-7-28 11:27
请问he5做的图也可以屏蔽吗

跟什么数据做的图没关系
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-10-1 18:33:45 | 显示全部楼层
脚本不错
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2018-1-21 17:31:55 | 显示全部楼层
老师您好,脚本第25行这个test的格式是怎么样的呢? 谢谢老师~~
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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