爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 21008|回复: 33

站点降水数据绘制等值线图新脚本

[复制链接]

新浪微博达人勋

发表于 2013-7-12 12:09:15 | 显示全部楼层 |阅读模式

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

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

x
之前为了简化,在MIApp类中做了很多常用的方法,比如打开各种数据,但这样做使得脚本程序不是很清晰,且用户难以对类库的结构有深入认识,所以在写脚本的时候更好的方式是只把MIApp类作为一个数据显示的窗体,数据打开、处理都由类库里相应的类的实现。基于这样方式重新写了用micaps第一类数据绘制降水等值线图的脚本。

  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.Data.MapData import *
  13. from MeteoInfoC.Data.MeteoData import *
  14. from MeteoInfoC.Layout import *
  15. from MeteoInfoC.Legend import *
  16. from MeteoInfoC.Projections import *
  17. from MeteoInfoC.Shape import *

  18. #---- 设置路径变量
  19. BaseDir = "C:\\Program Files (x86)\\MeteoInfo\\"
  20. MapDir = BaseDir + "Map\\"
  21. LegendDir = BaseDir + "Legend\\"
  22. DataDir = BaseDir + "Sample\\MICAPS\\"

  23. #---- 打开图层
  24. bou2Layer = MapDataManage.OpenLayer(MapDir + "bou2_4p.shp")
  25. lb = bou2Layer.LegendScheme.LegendBreaks[0]
  26. lb.Color = Color.Yellow
  27. lb.OutlineColor = Color.Gray
  28. lb.OutlineSize = 1
  29. lb.DrawFill = False
  30. bou1Layer = MapDataManage.OpenLayer(MapDir + "bou1_4l.shp")
  31. lb = bou1Layer.LegendScheme.LegendBreaks[0]
  32. lb.Color = Color.Blue
  33. chinaLayer = MapDataManage.OpenLayer(MapDir + "china.shp")
  34. chinaLayer.Visible = False
  35. res1Layer = MapDataManage.OpenLayer(MapDir + "res1_4m.shp")
  36. lb = res1Layer.LegendScheme.LegendBreaks[0]
  37. lb.Color = Color.Red
  38. lb.OutlineColor = Color.Black
  39. lb.Size = 5
  40. res1Layer.LabelSet.FieldName = "NAME";
  41. res1Layer.LabelSet.LabelFont = Font("楷体", 10);
  42. res1Layer.LabelSet.YOffset = 15;
  43. res1Layer.AddLabels();

  44. #---- 创建MIApp类的对象
  45. myApp = MIApp()
  46. mapLayout = myApp.MapLayout
  47. layoutMap = mapLayout.ActiveLayoutMap
  48. mapFrame = layoutMap.MapFrame
  49. mapView = mapFrame.MapView

  50. #---- 添加图层
  51. mapFrame.AddLayer(bou2Layer)
  52. mapFrame.AddLayer(bou1Layer)
  53. mapFrame.AddLayer(chinaLayer)
  54. mapFrame.AddLayer(res1Layer)

  55. #---- Lambert投影
  56. projInfo = ProjectionInfo("+proj=lcc+lat_1=25+lat_2=47+lon_0=105")
  57. mapView.ProjectLayers(projInfo)

  58. #---- 按照经纬度范围缩放地图
  59. mapView.ZoomToExtentLonLat(78,130,15,53)

  60. #---- 设置屏蔽图层(只绘制中国境内图形)
  61. mapView.MaskOut.SetMaskLayer = True
  62. mapView.MaskOut.MaskLayer = chinaLayer.LayerName

  63. #---- 设置ActiveLayoutMap(图层显示)
  64. layoutMap.DrawGridLine = False
  65. layoutMap.DrawNeatLine = False
  66. layoutMap.DrawGridLabel = False
  67. layoutMap.DrawGridTickLine = False
  68. layoutMap.Left = 10
  69. layoutMap.Top = 10
  70. layoutMap.Width = 620
  71. layoutMap.Height = 450

  72. #---- 设置南海脚图(添加Map Frame)
  73. aMapFrame = MapFrame()
  74. aMapFrame.IsFireMapViewUpdate = True
  75. aLayoutMap = LayoutMap(aMapFrame)
  76. aLayoutMap.DrawGridLabel = False
  77. aLayoutMap.DrawGridTickLine = False
  78. aLayoutMap.Left = 40
  79. aLayoutMap.Top = 350
  80. aLayoutMap.Width = 85
  81. aLayoutMap.Height = 109
  82. mapLayout.AddElement(aLayoutMap)
  83. aMapFrame.AddLayer(bou1Layer)
  84. aProjInfo = ProjectionInfo("+proj=lcc+lat_1=25+lat_2=47+lon_0=105")
  85. aMapFrame.MapView.ProjectLayers(aProjInfo)
  86. aMapFrame.MapView.ZoomToExtentLonLat(106.5,122.5,1,23)

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

  89. #---- 设置图例
  90. aLegend = mapLayout.AddLegend(550,220)
  91. aLegend.LegendStyle = LegendStyles.Normal               
  92. aLegend.DrawNeatLine = False
  93. aLegend.Title = "降水量(毫米)"
  94. aLegend.BackColor = Color.White
  95. aLegend.Font = Font("Arial", 8)

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

  99. #---- 站点数据插值为格点数据的设置
  100. interpSet = InterpolationSetting(60,140,-20,60,160,160,"IDW_Radius",2,1)

  101. #---- 设置图例
  102. ls = LegendScheme(ShapeTypes.Polygon)
  103. ls.ImportFromXMLFile(LegendDir + "rain1.lgs")

  104. #---- 设置MeteoDataInfo
  105. mid = MeteoDataInfo()

  106. #---- 循环
  107. while sTime <= eTime:   
  108.   inFile = sTime.ToString("yyMMddHH") + ".000"
  109.   print inFile
  110.   #---- 打开MICAPS数据文件
  111.   mid.OpenMICAPSData(DataDir + inFile)  
  112.   #---- 获取6小时降水量站点数据
  113.   stData = mid.GetStationData("Precipitation6h")
  114.   #---- 将站点数据差值为格点数据
  115.   gData = DrawMeteoData.InterpolateData(stData, interpSet)
  116.   #---- 生成6小时降水量图层
  117.   rainLayer = DrawMeteoData.CreateShadedLayer(gData, ls, "Precipitation", "Rain")
  118.   rainLayer.IsMaskout = True
  119.   #---- 添加图层
  120.   mapFrame.AddLayer(rainLayer)
  121.   print "Display finished"  
  122.   #---- 调整图层顺序(以避免压盖)
  123.   mapFrame.MoveLayerToBottom(rainLayer)  
  124.   #---- 设置标题名称
  125.   title = "      全国降水量实况图\n6小时降水量 (" + sTime.ToString("yyyy-MM-dd HH:00") + ")"
  126.   aText.SetLabelText(title)     
  127.   #---- 设置图例名称
  128.   aLegend.Title = "降水量(毫米)"
  129.   #---- 绘制图形
  130.   mapLayout.PaintGraphics()
  131.   #---- 输出图形为文件
  132.   outFile = "Prec_" + sTime.ToString("yyyyMMddHH") + ".png"
  133.   print outFile
  134.   #mapLayout.ExportToPicture("E:\\Temp\\" + outFile)  
  135.   #---- 删除6小时降水量图层
  136.   if sTime < eTime:
  137.           mapFrame.RemoveLayer(rainLayer)
  138.   #---- 时间加6小时
  139.   sTime = sTime.AddHours(6)

  140. #---- 显示程序窗体(只是为了看效果,自动运行时不需要)
  141. #Application.Run(myApp)
  142. myApp.Show()



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

新浪微博达人勋

发表于 2013-7-12 17:01:54 | 显示全部楼层
本帖最后由 rceclx 于 2013-7-12 17:09 编辑


                               
登录/注册后可看大图
!王老师智慧啊!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-7-12 18:46:37 | 显示全部楼层
王老师,你这个降雨量空间分布图是基于什么插值方法呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-7-12 18:48:34 | 显示全部楼层
Jasonluo 发表于 2013-7-12 18:46
王老师,你这个降雨量空间分布图是基于什么插值方法呢?

代码里有,IDW
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-7-25 20:27:53 | 显示全部楼层
好东西,厉害呀
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-7-28 23:29:42 | 显示全部楼层
MeteoInfo 发表于 2013-7-12 18:48
代码里有,IDW

王老师您好,之前用的是2013.3.2版本的dll,今天更新了下,发现报错:(1)“MeteoInfoC.Data.StationData”不包含“UNDEF”的定义,这个改成stationData.UNDEF→stationData.MissingValue?
(2)“MeteoInfoC.Data.MeteoData.MICAPS4DataInfo”不包含“GetGridData”的定义,这个不知道如何改呢?谢谢!
           
                MICAPS4DataInfo aDataInfo = new MICAPS4DataInfo();
                aDataInfo.ReadDataInfo(openFileDialog.FileName);
                GridData rainTemp = aDataInfo.GetGridData();//这句话如何改呢?
                GridData rain = rainTemp;
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-7-28 23:34:46 | 显示全部楼层
wbriver 发表于 2013-7-28 23:29
王老师您好,之前用的是2013.3.2版本的dll,今天更新了下,发现报错:(1)“MeteoInfoC.Data.StationDat ...

1、你的理解是对的。
2、
MeteoDataInfo aDataInfo = new MeteoDataInfo();
aDataInfo.OpenMICAPSData(openFileDialog.FileName);
GridData rainTemp = aDataInfo.GetGridData("var")
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-7-29 11:19:00 | 显示全部楼层
MeteoInfo 发表于 2013-7-28 23:34
1、你的理解是对的。
2、
MeteoDataInfo aDataInfo = new MeteoDataInfo();

问题解决了,谢谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-7-31 13:35:14 | 显示全部楼层
怎样画南海角图呀?把那段程序复制到script中总是出错…我也新建了map frame呀?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-7-31 13:49:01 | 显示全部楼层
微微一笑 发表于 2013-7-31 13:35
怎样画南海角图呀?把那段程序复制到script中总是出错…我也新建了map frame呀?

出错信息是什么?我不能凭空瞎猜呀!
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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