爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 10076|回复: 14

新版MeteoInfo中脚本程序的改变

[复制链接]

新浪微博达人勋

发表于 2012-1-6 20:38:58 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2012-1-6 21:02 编辑

MeteoInfo 1.02版对一些类进行了重构,script脚本程序的写法有些变化,主要是去掉了MapLayout中的DefaultTiltle、DefaultLegend、DefaultIllustration,DefaultLayoutMap用ActiveLayoutMap取代。这样是为了增加脚本的灵活性,之前的设计虽然方便,但无法做出复杂图形。

1、去掉了SetTitle()函数,这个函数其实是对之前的DefaultTitle起作用。
取代方式:myApp.MapLayout.AddText("MeteoInfo script demo", 320, 20),后面两个参数是文字被添加的位置x,y;这个函数还有重载形式:myApp.MapLayout.AddText("MeteoInfo script demo", 320, 20, "黑体",12),后面两个参数分别是字体名和字体大小。

2、在MapLayout中添加LayoutLegend:
aLegend = myApp.MapLayout.AddLegend(660, 100)         #后面两个参数是位置x,y
aLegend.LegendStyle = LegendStyleEnum.Bar_Vertical       #LegendStyle是枚举类型

3、将脚本中的DefaultLayoutMap替换为ActiveLayoutMap。

4、去掉脚本中的DefaultIllustration相关的语句,南海脚图以添加Map Frame的方式实现。

通过以上变化,以前的脚本程序应该可以运行了。下面是一个新的累积降水量的脚本程序,里面包含上述的改变:

Image00798.png

# 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 *
from MeteoInfoC.Legend import *
from MeteoInfoC.Projections import *

#---- 设置路径变量
BaseDir = "C:\\Program Files (x86)\\MeteoInfo\\"
MapDir = BaseDir + "Map\\"
LegendDir = BaseDir + "Legend\\"
DataDir = BaseDir + "Sample\\MICAPS\\"
#---- 创建MIApp类的对象
myApp = MIApp()
#---- 添加图层
myApp.OpenLayer(MapDir + "bou2_4p.shp")
#---- 设置图层渲染
myApp.SetLegendBreak("bou2_4p.shp",0,Color.Yellow,Color.Gray,1,True,False,True)
myApp.OpenLayer(MapDir + "bou1_4l.shp")
myApp.SetLegendBreak("bou1_4l.shp",0,Color.Blue)
myApp.OpenLayer(MapDir + "china.shp")
myApp.SetLayerVisible("china.shp", False)
myApp.OpenLayer(MapDir + "res1_4m.shp")
myApp.SetLegendBreak("res1_4m.shp",0,5,Color.Red,Color.Black,True,True,True)

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

#---- 获取矢量图层对象,并设置标注
aLayer = myApp.GetVectorLayer("res1_4m.shp")
aLayer.LabelSet.FieldName = "NAME";
aLayer.LabelSet.LabelFont = Font("楷体", 10);
aLayer.LabelSet.Offset = 15;
aLayer.AddLabels();

#---- 按照经纬度范围缩放地图
myApp.ZoomLonLat(78,130,15,53)

#---- 设置屏蔽图层(只绘制中国境内图形)
myApp.SetMaskout("china.shp")
#---- 设置绘图类型为shaded
myApp.SetDrawType("shaded")
#---- 站点数据插值为格点数据的设置
myApp.SetInterpolation(60,140,-20,60,160,160,"IDW_Radius",2,1)
#---- 设置图例文件
myApp.SetLegendScheme(LegendDir + "rain1.lgs")

#---- 设置ActiveLayoutMap(图层显示)
myApp.MapLayout.ActiveLayoutMap.DrawGridLabel = False
myApp.MapLayout.ActiveLayoutMap.DrawGridLine = False
myApp.MapLayout.ActiveLayoutMap.DrawNeatLine = False
myApp.MapLayout.ActiveLayoutMap.Left = 10
myApp.MapLayout.ActiveLayoutMap.Top = 10
myApp.MapLayout.ActiveLayoutMap.Width = 620
myApp.MapLayout.ActiveLayoutMap.Height = 450

#---- 设置南海脚图(添加Map Frame)
aMapFrame = MapFrame()
aMapFrame.IsFireMapViewUpdate = True
aLayoutMap = LayoutMap(aMapFrame)
aLayoutMap.DrawGridLabel = False
aLayoutMap.Left = 40
aLayoutMap.Top = 350
aLayoutMap.Width = 85
aLayoutMap.Height = 109
myApp.MapLayout.AddElement(aLayoutMap)
bLayer = myApp.GetLayer("bou1_4l.shp")
cLayer = myApp.MapLayout.ActiveLayoutMap.MapFrame.MapView.GetGeoLayerFromHandle(bLayer.Handle).Clone()
aMapFrame.AddLayer(cLayer)
aProjInfo = ProjectionInfo("+proj=lcc+lat_1=25+lat_2=47+lon_0=105")
aMapFrame.MapView.ProjectLayers(aProjInfo)
aMapFrame.MapView.ZoomToExtentLonLat(106.5,122.5,1,23)

#---- 设置图形标题
aText = myApp.MapLayout.AddText("Temp",220,50,"黑体",12)

#---- 设置图例
aLegend = myApp.MapLayout.AddLegend(550,220)
aLegend.LegendStyle = LegendStyleEnum.Normal        
aLegend.DrawNeatLine = False
aLegend.Title = "降水量(毫米)"
aLegend.BackColor = Color.White
aLegend.Font = Font("Arial", 8)

#---- 设置起始结束时间
sTime = DateTime.Parse("2010-10-14 14:00")
eTime = DateTime.Parse("2010-10-14 20:00")
aTime = sTime.AddHours(-6)

stData = StationData()
i = 1
#---- 循环
while sTime <= eTime:
  myApp.RemoveDataLayers()
  inFile = sTime.ToString("yyMMddHH") + ".000"
  print inFile
  #---- 打开MICAPS数据文件
  myApp.OpenMICAPSData(DataDir + inFile)  
  #---- 获取累计降水站点数据
  if i == 1:
      stData = myApp.GetStationData("Precipitation6h")
  else:
      stData = stData + myApp.GetStationData("Precipitation6h")
  
  #---- 时间加6小时
  sTime = sTime.AddHours(6)
  i = i + 1

#---- 绘制累计降水图层
myApp.Display(stData)
#---- 调整图层顺序(以避免压盖)
myApp.MoveLayerToTop("bou2_4p.shp")  
myApp.MoveLayerToTop("bou1_4l.shp")
myApp.MoveLayerToTop("res1_4m.shp")
#---- 设置标题名称
title = "            全国降水量实况图\n" + aTime.ToString("yyyy年MM月dd日HH时") + " - " + eTime.ToString("yyyy年MM月dd日HH时")
aText.SetLabelText(title)     
#---- 设置图例名称
aLegend.Title = "降水量(毫米)"
#---- 绘制图形
myApp.MapLayout.PaintGraphics()
#---- 输出图形为文件
outFile = "Prec_" + aTime.ToString("yyyyMMddHH") + "-" + eTime.ToString("yyyyMMddHH") + ".png"
print outFile
#myApp.SaveFigure(DataDir + outFile)   
  
#---- 显示程序窗体(只是为了看效果,自动运行时不需要)
Application.Run(myApp)

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

新浪微博达人勋

发表于 2012-1-6 23:35:23 | 显示全部楼层
明天开始学习meteoinfo!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-1-7 00:03:18 | 显示全部楼层
嗯,改动不算多,搞定了脚本的修改。。。呵呵,兼容咯。
改天发个最近做的批量自动将micaps资料制作成ppt程序。哈哈
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-9-19 20:31:09 | 显示全部楼层
脚本脚本脚本脚本脚本
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-11-1 21:39:28 | 显示全部楼层
cLayer=myApp.MapLayout.ActiveLayoutMap.MapFrame.MapView.GetGeoLayerFromHandle(bLayer.Handle).Clone()
今天下了置顶的新的dll后这一句报错,昨天还是好好的
自己直接把这句删除了然后直接 aMapFrame.AddLayer(bLayer) 也能显示出来就是了.
然后没有看懂原来加个Clayer是有何用意
麻烦版主回答了.
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-11-1 21:49:38 | 显示全部楼层

南海脚图用一个新的MapFrame来实现,cLayer是从bLayer科隆出来的,加到新的MapFrame里来做南海脚图显示。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-11-1 22:01:31 | 显示全部楼层
MeteoInfo 发表于 2012-11-1 21:49
南海脚图用一个新的MapFrame来实现,cLayer是从bLayer科隆出来的,加到新的MapFrame里来做南海脚图显示。

那为啥报错了呢 说是MAPVIEW下没有GetGeoLayerFromHandle
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-11-1 22:07:11 | 显示全部楼层
/猪头哼哼 发表于 2012-11-1 22:01
那为啥报错了呢 说是MAPVIEW下没有GetGeoLayerFromHandle

去掉了那个方法,直接用GetLayerFromHandle
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-8 16:33:00 | 显示全部楼层
请问有没有最新的帮助文档呀,王老师
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-8 16:38:46 | 显示全部楼层
amwfhv 发表于 2014-4-8 16:33
请问有没有最新的帮助文档呀,王老师

没有
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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