爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 11706|回复: 19

MeteoInfo二次开发教程(十二)

[复制链接]

新浪微博达人勋

发表于 2012-12-6 15:01:50 | 显示全部楼层 |阅读模式

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

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

x
介绍一下绘制剖面图。剖面图和水平面图一样都是二维图,可以用同样的控件来实现剖面图的绘制。

Demo程序运行后的结果如下:

                               
登录/注册后可看大图


新建一个Form(frmSectionPlot),加入一个SplitContainer,左边添加一个LayersLegend(layersLegend1),右边添加一个MapLayout(mapLayout1),将layersLegend1的MapLayout属性设为mapLayout1。
Image00290.png

打开layersLegend1的MapFrames属性,添加一个MapFrame并将其Active属性设为true。
Image00291.png

在frmSectionPlot的构建方法中将layersLegend1.ActiveMapFrame.MapView的IsGeoMap属性设为false(这个很重要,用于区别水平平面图)。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;

  9. namespace MeteoInfoDemo.Forms
  10. {
  11.     public partial class frmSectionPlot : Form
  12.     {
  13.         public frmSectionPlot()
  14.         {
  15.             InitializeComponent();

  16.             this.layersLegend1.ActiveMapFrame.MapView.IsGeoMap = false;
  17.             this.layersLegend1.ActiveMapFrame.LayoutBounds = new Rectangle(40, 36, 606, 420);
  18.             this.mapLayout1.MouseMode = MeteoInfoC.Layout.MouseMode.Select;
  19.         }
  20.     }
  21. }
复制代码

在主窗体frmMain中添加一个菜单项,在其Click事件中加入绘制剖面图的代码。这里以model.ctl数据为例,新建MeteoDataInfo对象(aDataInfo),打开model.ctl文件,将aDataInfo的DimensionSet设为PlotDimension.Level_Lat,以读取某一经度上随纬度变化的剖面图格点数据。读取数据后需要将格点数据的X/Y坐标归一化(SetXYCoords方法),图形的X/Y坐标标注需要自己设定(MapView.XGridStrs, MapView.YGridStrs)。其它和绘制水平平面图基本一样。具体代码如下:
  1.        private void TSMI_LevelLat_Click(object sender, EventArgs e)
  2.         {
  3.             //Create a MeteoDataInfo object
  4.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  5.             //Open GrADS data file
  6.             string aFile = Application.StartupPath + "\\Sample\\model.ctl";
  7.             aDataInfo.OpenGrADSData(aFile);

  8.             //Set dimensions
  9.             aDataInfo.DimensionSet = PlotDimension.Level_Lat;
  10.             aDataInfo.LonIndex = 0;
  11.             aDataInfo.TimeIndex = 0;

  12.             //Get GridData
  13.             GridData qdata = aDataInfo.GetGridData("Q");
  14.             SetXYCoords(qdata);

  15.             //Create a legend scheme
  16.             bool hasUndefData = false;
  17.             LegendScheme aLS = LegendManage.CreateLegendSchemeFromGridData(qdata,
  18.                         LegendType.GraduatedColor, ShapeTypes.Polygon, ref hasUndefData);

  19.             //Create a contour layer
  20.             VectorLayer aLayer = DrawMeteoData.CreateShadedLayer(qdata, aLS, "Shaded_PS", "PS");

  21.             //Create a sction plot form object
  22.             frmSectionPlot sPlot = new frmSectionPlot();
  23.             sPlot.layersLegend1.ActiveMapFrame.MapView.XGridStrs = getLatLabels(aDataInfo);
  24.             sPlot.layersLegend1.ActiveMapFrame.MapView.YGridStrs = getLevelLabels(aDataInfo);
  25.             sPlot.layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  26.             Extent aExtent = new Extent();
  27.             aExtent.minX = aLayer.Extent.minX - 0.1;
  28.             aExtent.maxX = aLayer.Extent.maxX + 0.1;
  29.             aExtent.minY = aLayer.Extent.minY - 0.1;
  30.             aExtent.maxY = aLayer.Extent.maxY + 0.1;
  31.             sPlot.layersLegend1.ActiveMapFrame.MapView.ZoomToExtent(aExtent);
  32.             sPlot.layersLegend1.Refresh();

  33.             //Change title of the layout
  34.             //LayoutGraphic aTitle = sPlot.layersLegend1.MapLayout.GetTexts()[0];
  35.             //aTitle.SetLabelText("MeteoInfo - Section Plot - Level_Lat");

  36.             //Add or change the legend in layout
  37.             LayoutLegend aLegend;
  38.             if (sPlot.layersLegend1.MapLayout.GetLegends().Count > 0)
  39.                 aLegend = sPlot.layersLegend1.MapLayout.GetLegends()[0];
  40.             else
  41.                 aLegend = sPlot.layersLegend1.MapLayout.AddLegend(650, 100);
  42.             aLegend.LegendStyle = LegendStyleEnum.Bar_Vertical;
  43.             aLegend.LegendLayer = aLayer;
  44.             sPlot.layersLegend1.MapLayout.PaintGraphics();

  45.             sPlot.Show(this);
  46.         }

  47.         private List getLatLabels(MeteoDataInfo aDataInfo)
  48.         {
  49.             List latLabels = new List();
  50.             double[] lats = aDataInfo.GetY();
  51.             string drawStr;
  52.             foreach (double lat in lats)
  53.             {
  54.                 if (lat > 0)
  55.                 {
  56.                     drawStr = lat.ToString() + "N";
  57.                 }
  58.                 else if (lat < 0)
  59.                 {
  60.                     drawStr = (-lat).ToString() + "S";
  61.                 }
  62.                 else
  63.                 {
  64.                     drawStr = "EQ";
  65.                 }
  66.                 latLabels.Add(drawStr);
  67.             }

  68.             return latLabels;
  69.         }

  70.         private List getLevelLabels(MeteoDataInfo aDataInfo)
  71.         {
  72.             List levelLabels = new List();
  73.             List levels = aDataInfo.GetLevels();
  74.             foreach (double level in levels)
  75.             {
  76.                 levelLabels.Add(level.ToString());
  77.             }

  78.             return levelLabels;
  79.         }

  80.         private void SetXYCoords(GridData aGridData)
  81.         {
  82.             int i;           

  83.             for (i = 0; i < aGridData.XNum; i++)
  84.             {
  85.                 aGridData.X[i] = i;
  86.             }
  87.             for (i = 0; i < aGridData.YNum; i++)
  88.             {
  89.                 aGridData.Y[i] = i;
  90.             }
  91.         }
复制代码





Image00293.png

本帖被以下淘专辑推荐:

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

新浪微博达人勋

发表于 2012-12-6 18:01:40 | 显示全部楼层
,好好学习
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-8 09:01:18 | 显示全部楼层
SetXYCoords(qdata); getLatLabels(aDataInfo);好像没有这两个个命令啊,再有是不是应该把截面图中的layerslegend1和maplayout1的属性设为public啊?要不实例化后调用不了这两个控件
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-12-8 09:31:57 | 显示全部楼层
西山守望 发表于 2012-12-8 09:01
SetXYCoords(qdata); getLatLabels(aDataInfo);好像没有这两个个命令啊,再有是不是应该把截面图中的layers ...

那两个函数不是类库里的,二次开发时自己加上的。

可以设为public,或者internal等,能外部访问就可以了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-8 21:52:47 | 显示全部楼层
学习学习中
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-9 14:21:33 | 显示全部楼层
很好很强大的东西啊,谢谢,学习中!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-29 16:22:50 | 显示全部楼层
纠结中,有谁能回答我的好多好多问题呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-7-25 22:24:02 | 显示全部楼层
准备用来做航线剖面图
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-16 14:47:55 | 显示全部楼层
学习中,请教王老师一个问题,如果把MapView或者MapLayout的内容保存为图片呢?看到您的MeteoInfo软件有这个功能的。请指导。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-16 14:53:58 | 显示全部楼层
默存 发表于 2013-8-16 14:47
学习中,请教王老师一个问题,如果把MapView或者MapLayout的内容保存为图片呢?看到您的MeteoInfo软件有这个 ...

终于找到这个函数了,ExportToPicture。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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