爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 8421|回复: 16

脚本如何实现MICAPS第一类多要素的叠加显示?【已解决】

[复制链接]

新浪微博达人勋

发表于 2011-11-29 21:08:50 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 孤蓝et 于 2011-12-2 11:24 编辑

1、备注:meteoinfo脚本中对变量名是大小写敏感的,这个大家要注意哦。  myApp.Display("Temperature")
2、问题:meteoinfo自带的Script示例文件只有针对单一变量的绘图,如何实现多个变量叠加显示?
        例如:micaps第一类数据,实现温度和风场的叠加显示?这个怎么实现哦?目前我只会用shade之类的绘制,barb绘制风场还没有实现。在baidu博客的meteoinfo相关script中也没有找到相关方法,望斑竹赐教哦?万分感谢。

秀个图:现在需要叠加风场。。。。求方法哟。
tem_2011080303.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2011-11-29 21:11:38 | 显示全部楼层
上图绘制的代码,基于meteoinfo目录下的Script提供的示例修改得到如下代码。
  1. # This Python file uses the following encoding: GB2312
  2. #---- 引入类库
  3. import clr
  4. clr.AddReferenceByPartialName("System")
  5. clr.AddReferenceByPartialName("System.Windows.Forms")
  6. clr.AddReferenceByPartialName("System.Drawing")
  7. from System import *
  8. from System.Windows.Forms import *
  9. from System.Drawing import *
  10. clr.AddReference("MeteoInfoC.dll")
  11. from MeteoInfoC import *
  12. from MeteoInfoC.Layout import *

  13. #---- 创建MIApp类的对象
  14. myApp = MIApp()
  15. #---- 添加图层
  16. myApp.OpenLayer("..\\Map\\bou2_4p.shp")
  17. #---- 设置图层渲染
  18. myApp.SetLegendBreak("bou2_4p.shp",0,Color.Yellow,Color.Gray,1,True,False,True)
  19. #myApp.OpenLayer("..\\Map\\bou1_4l.shp")
  20. #myApp.SetLegendBreak("bou1_4l.shp",0,Color.Blue)
  21. myApp.OpenLayer("..\\Map\\china.shp")
  22. myApp.SetLayerVisible("china.shp", False)
  23. myApp.OpenLayer("..\\Map\\res1_4m.shp")
  24. myApp.SetLegendBreak("res1_4m.shp",0,5,Color.Red,Color.Black,True,True,True)
  25. #---- 获取矢量图层对象,并设置标注
  26. aLayer = myApp.GetVectorLayer("res1_4m.shp")
  27. aLayer.LabelSet.FieldName = "NAME";
  28. aLayer.LabelSet.LabelFont = Font("楷体", 10);
  29. aLayer.LabelSet.Offset = 15;
  30. aLayer.AddLabels();

  31. #---- Lambert投影
  32. myApp.ProjectLayers("+proj=lcc+lat_1=25+lat_2=47+lon_0=84")

  33. #---- 按照经纬度范围缩放地图
  34. myApp.ZoomLonLat(76,94,35,50)

  35. #---- 设置屏蔽图层(只绘制中国境内图形)
  36. myApp.SetMaskout("china.shp")
  37. #---- 设置绘图类型为shaded
  38. myApp.SetDrawType("shaded")
  39. #---- 站点数据插值为格点数据的设置
  40. myApp.SetInterpolation(60,140,-20,60,160,160,"IDW_Radius",1,1)
  41. #---- 设置图例文件
  42. myApp.SetLegendScheme("..\\Legend\\tem.lgs")

  43. #---- 设置DefalutLayoutMap(图层显示)
  44. myApp.MapLayout.DefaultLayoutMap.DrawGridLine = True
  45. myApp.MapLayout.DefaultLayoutMap.DrawNeatLine = True
  46. myApp.MapLayout.DefaultLayoutMap.Left = 10
  47. myApp.MapLayout.DefaultLayoutMap.Top = 10
  48. myApp.MapLayout.DefaultLayoutMap.Width = 620
  49. myApp.MapLayout.DefaultLayoutMap.Height = 450



  50. #---- 设置DefaultTitle(图形标题)
  51. myApp.MapLayout.DefaultTitle.SetFont("黑体", 12)
  52. myApp.MapLayout.DefaultTitle.Top = 30
  53. myApp.MapLayout.DefaultTitle.Left = 80

  54. #---- 设置DefaultLegend(图例)
  55. myApp.MapLayout.DefaultLegend.LegendStyle = LegendStyleEnum.Normal               
  56. myApp.MapLayout.DefaultLegend.DrawNeatLine = False
  57. myApp.MapLayout.DefaultLegend.Title = "温度"
  58. myApp.MapLayout.DefaultLegend.BackColor = Color.White
  59. myApp.MapLayout.DefaultLegend.Font = Font("Arial", 8)
  60. myApp.MapLayout.DefaultLegend.Left = 640
  61. myApp.MapLayout.DefaultLegend.Top = 150


  62. #---- 设置起始结束时间
  63. sTime = DateTime.Parse("2011-8-3 00:00")
  64. eTime = DateTime.Parse("2011-8-3 23:00")

  65. #---- 循环
  66. while sTime <= eTime:
  67.   myApp.RemoveDataLayers()
  68.   inFile = sTime.ToString("yyMMddHH") + ".000"
  69.   print inFile
  70.   #---- 打开MICAPS数据文件
  71.   myApp.OpenMICAPSData("..\\Sample\\aws\" + inFile)  
  72.   #---- 生成6小时降水量图层
  73.   myApp.Display("Temperature")
  74.   print "Display finished"  
  75.   #---- 调整图层顺序(以避免压盖)
  76.   myApp.MoveLayerToTop("bou2_4p.shp")  
  77.   #myApp.MoveLayerToTop("bou1_4l.shp")
  78.   myApp.MoveLayerToTop("res1_4m.shp")
  79.   #---- 设置标题名称
  80.   title = "                     新疆区域温度分布图 (" + sTime.ToString("yyyy-MM-dd HH:00") + ")"
  81.   myApp.SetTitle(title)     
  82.   #---- 设置图例名称
  83.   myApp.MapLayout.DefaultLegend.Title = "温度(℃)"
  84.   #---- 绘制图形
  85.   myApp.MapLayout.PaintGraphics()
  86.   #---- 输出图形为文件
  87.   outFile = "tem_" + sTime.ToString("yyyyMMddHH") + ".png"
  88.   print outFile
  89.   myApp.SaveFigure("E:\" + outFile)  
  90.   #---- 删除6小时降水量图层
  91.   if sTime < eTime:
  92.           myApp.RemoveLastLayer()
  93.   #---- 时间加6小时
  94.   sTime = sTime.AddHours(1)

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

新浪微博达人勋

发表于 2011-11-29 21:23:09 | 显示全部楼层
参考如下代码:

myApp.SetDrawType("barb")
myApp.Display("U","V")
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2011-11-29 22:25:10 | 显示全部楼层

Micaps第一类数据没有UV分量,所以我打算通过计算得到,然后使用Barb。

本帖最后由 孤蓝et 于 2011-11-29 22:27 编辑

Micaps第一类数据没有UV分量,所以我打算通过计算得到,然后使用Barb。

# This Python file uses the following encoding: GB2312
#---- 引入类库
import clr
clr.AddReferenceByPartialName("System")
clr.AddReferenceByPartialName("System.Windows.Forms")
clr.AddReferenceByPartialName("System.Drawing")
from System import *
from System.Windows.Forms import *
from System.Drawing import *
clr.AddReference("MeteoInfoC.dll")
from MeteoInfoC import *
from MeteoInfoC.Layout import *
from MeteoInfoC.Data import *
.... .....
w_dir = StationData()
w_spd = StationData()

u = StationData()
v = StationData()

w_dir = myApp.GetStationData("WindDirection")
w_spd = myApp.GetStationData("WindSpeed")

u=w_spd*DataMath.sin(w_dir)
v=w_spd*DataMath.cos(w_dir)

.... .....


然后运行脚本提示错误:看提示,貌似stationdata不支持sin函数?
C:\Program Files\MeteoInfo\Script>miscript run_tem.py
11080318.000
Traceback (most recent call last):
  File "run_tem.py", line 97, in <module>
AttributeError: 'type' object has no attribute 'sin'

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

新浪微博达人勋

发表于 2011-11-30 00:19:46 | 显示全部楼层
帮顶~~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-11-30 08:23:56 | 显示全部楼层

正如你所说,函数名是大小写敏感的,应该是DataMath.Sin , DataMath.Cos
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2011-11-30 23:43:15 | 显示全部楼层
  1. # This Python file uses the following encoding: GB2312
  2. #---- 引入类库
  3. import clr
  4. clr.AddReferenceByPartialName("System")
  5. clr.AddReferenceByPartialName("System.Windows.Forms")
  6. clr.AddReferenceByPartialName("System.Drawing")
  7. from System import *
  8. from System.Windows.Forms import *
  9. from System.Drawing import *
  10. clr.AddReference("MeteoInfoC.dll")
  11. from MeteoInfoC import *
  12. from MeteoInfoC.Layout import *
  13. from MeteoInfoC.Data import *

  14. #---- 创建MIApp类的对象
  15. myApp = MIApp()
  16. #---- 添加图层
  17. myApp.OpenLayer("..\\Map\\bou2_4p.shp")
  18. #---- 设置图层渲染
  19. myApp.SetLegendBreak("bou2_4p.shp",0,Color.Yellow,Color.Gray,1,True,False,True)
  20. #myApp.OpenLayer("..\\Map\\bou1_4l.shp")
  21. #myApp.SetLegendBreak("bou1_4l.shp",0,Color.Blue)
  22. myApp.OpenLayer("..\\Map\\china.shp")
  23. myApp.SetLayerVisible("china.shp", False)
  24. myApp.OpenLayer("..\\Map\\res1_4m.shp")
  25. myApp.SetLegendBreak("res1_4m.shp",0,5,Color.Red,Color.Black,True,True,True)
  26. #---- 获取矢量图层对象,并设置标注
  27. aLayer = myApp.GetVectorLayer("res1_4m.shp")
  28. aLayer.LabelSet.FieldName = "NAME";
  29. aLayer.LabelSet.LabelFont = Font("楷体", 10);
  30. aLayer.LabelSet.Offset = 15;
  31. aLayer.AddLabels();

  32. #---- Lambert投影
  33. myApp.ProjectLayers("+proj=lcc+lat_1=25+lat_2=47+lon_0=84")

  34. #---- 按照经纬度范围缩放地图
  35. myApp.ZoomLonLat(76,94,35,50)

  36. #---- 设置屏蔽图层(只绘制中国境内图形)
  37. myApp.SetMaskout("china.shp")

  38. #---- 站点数据插值为格点数据的设置
  39. myApp.SetInterpolation(60,140,-20,60,160,160,"IDW_Radius",1,1)
  40. #---- 设置图例文件
  41. #myApp.SetLegendScheme("..\\Legend\\tem.lgs")

  42. #---- 设置DefalutLayoutMap(图层显示)
  43. myApp.MapLayout.DefaultLayoutMap.DrawGridLine = True
  44. myApp.MapLayout.DefaultLayoutMap.DrawNeatLine = True
  45. myApp.MapLayout.DefaultLayoutMap.Left = 10
  46. myApp.MapLayout.DefaultLayoutMap.Top = 10
  47. myApp.MapLayout.DefaultLayoutMap.Width = 620
  48. myApp.MapLayout.DefaultLayoutMap.Height = 450



  49. #---- 设置DefaultTitle(图形标题)
  50. myApp.MapLayout.DefaultTitle.SetFont("黑体", 12)
  51. myApp.MapLayout.DefaultTitle.Top = 30
  52. myApp.MapLayout.DefaultTitle.Left = 80

  53. #---- 设置DefaultLegend(图例)
  54. myApp.MapLayout.DefaultLegend.LegendStyle = LegendStyleEnum.Normal               
  55. myApp.MapLayout.DefaultLegend.DrawNeatLine = False
  56. myApp.MapLayout.DefaultLegend.Title = "温度"
  57. myApp.MapLayout.DefaultLegend.BackColor = Color.White
  58. myApp.MapLayout.DefaultLegend.Font = Font("Arial", 8)
  59. myApp.MapLayout.DefaultLegend.Left = 640
  60. myApp.MapLayout.DefaultLegend.Top = 150


  61. #---- 设置起始结束时间
  62. sTime = DateTime.Parse("2011-8-3 18:00")
  63. eTime = DateTime.Parse("2011-8-3 18:00")



  64. #---- 循环
  65. while sTime <= eTime:
  66.   myApp.RemoveDataLayers()
  67.   inFile = sTime.ToString("yyMMddHH") + ".000"
  68.   print inFile
  69.   #---- 打开MICAPS数据文件
  70.   myApp.OpenMICAPSData("..\\Sample\\aws\" + inFile)  

  71.   #---- 设置绘图类型为shaded
  72.   #myApp.SetDrawType("Shaded")
  73.   #myApp.Display("Temperature")

  74. [color=Red]  w_dir = myApp.GetStationData("WindDirection")
  75.   w_spd = myApp.GetStationData("WindSpeed")

  76.   u=w_spd*DataMath.Sin(w_dir)
  77.   v=w_spd*DataMath.Cos(w_dir)

  78.   myApp.SetDrawType("Barb")
  79.   myApp.Display(u,v)[/color]
  80.   print "Display finished"  
  81.   #---- 调整图层顺序(以避免压盖)
  82.   myApp.MoveLayerToTop("bou2_4p.shp")  
  83.   #myApp.MoveLayerToTop("bou1_4l.shp")
  84.   myApp.MoveLayerToTop("res1_4m.shp")
  85.   #---- 设置标题名称
  86.   title = "                     新疆区域温度分布图 (" + sTime.ToString("yyyy-MM-dd HH:00") + ")"
  87.   myApp.SetTitle(title)     
  88.   #---- 设置图例名称
  89.   myApp.MapLayout.DefaultLegend.Title = "温度(℃)"
  90.   #---- 绘制图形
  91.   myApp.MapLayout.PaintGraphics()
  92.   #---- 输出图形为文件
  93.   outFile = "tem_" + sTime.ToString("yyyyMMddHH") + ".png"
  94.   print outFile
  95.   myApp.SaveFigure("E:\" + outFile)  
  96.   #---- 删除6小时降水量图层
  97.   if sTime < eTime:
  98.           myApp.RemoveLastLayer()
  99.   #---- 时间加6小时
  100.   sTime = sTime.AddHours(1)

复制代码
为嘛画个简单的barb也这么波折?本想能很轻松的解决,现在又要劳烦斑竹了。唉,不好意思啊。
执行上述脚本报错如下:
C:\Program Files\MeteoInfo\Script>miscript run_tem.py
11080318.000
Traceback (most recent call last):
  File "run_tem.py", line 97, in <module>
TypeError: expected str, got StationData
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2011-11-30 23:44:56 | 显示全部楼层
斑竹要不要直接帮我写好一个例子用micaps第一类数据绘制风场barb撒。。。我被这个纠结了两天了。
愧于使用script不精啊。。。{:eb343:}{:eb343:}{:eb343:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-12-1 08:57:48 | 显示全部楼层
孤蓝et 发表于 2011-11-30 23:44
斑竹要不要直接帮我写好一个例子用micaps第一类数据绘制风场barb撒。。。我被这个纠结了两天了。
愧于使用 ...

这个不是你的问题,我正在更新MIApp类来解决这个问题。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2011-12-1 18:10:29 | 显示全部楼层
MeteoInfo 发表于 2011-12-1 08:57
这个不是你的问题,我正在更新MIApp类来解决这个问题。

辛苦斑竹了。。。。
继续支持中。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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