爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 22710|回复: 39

MeteoInfo二次开发教程(六)

[复制链接]

新浪微博达人勋

发表于 2012-4-21 12:18:13 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2012-5-30 14:46 编辑

较全面的讲讲格点数据生成的各种图层,主要包括Contour(等值线)、Shaded(等值填充)、Grid_Fill(格点填充)、Grid_Point(格点点图层)、Raster(栅格图层)、Vector(风场矢量)、Barb(风向杆)、Streamline(流场)。

先说说Contour、Shaded、Grid_Fill、Grid_Point和Raster,这几种图层只需要一个格点数据(GridData)。获取格点数据已经在上一讲讲过了,然后需要生成图例(LegendScheme),再用DrawMeteoData类的一些静态方法来从GridData创建各种图层:
Contour:  DrawMeteoData.CreateContourLayer(GridData gridData, LegendScheme aLS, string layerName, string fieldName)
Shaded:  DrawMeteoData.CreateShadedLayer(GridData gridData, LegendScheme aLS, string layerName, string fieldName)
Grid_Fill:  DrawMeteoData.CreateGridFillLayer(GridData gridData, LegendScheme aLS, string LName, string fieldName)
Grid_Point:  DrawMeteoData.CreateGridPointLayer(GridData gridData, LegendScheme aLS, string LName, string fieldName)
Raster:  DrawMeteoData.CreateRasterLayer(GridData GridData, string LName, LegendScheme aLS)

相关代码如下:
  1.         private void TSMI_GrADSShaded_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.             //Get GridData
  9.             GridData press = aDataInfo.GetGridData("PS");

  10.             //Create a legend scheme
  11.             bool hasUndefData = false;
  12.             LegendScheme aLS = LegendManage.CreateLegendSchemeFromGridData(press,
  13.                         LegendType.GraduatedColor, ShapeTypes.Polygon, ref hasUndefData);

  14.             //Create a contour layer
  15.             VectorLayer aLayer = DrawMeteoData.CreateShadedLayer(press, aLS, "Shaded_PS");

  16.             //Add layer
  17.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  18.             layersLegend1.ActiveMapFrame.MoveLayer(aLayer.Handle, 0);
  19.             layersLegend1.Refresh();

  20.             //Change title of the layout
  21.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  22.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Shaded Layer");

  23.             //Add or change the legend in layout
  24.             LayoutLegend aLegend;
  25.             if (mapLayout1.GetLegends().Count > 0)
  26.                 aLegend = mapLayout1.GetLegends()[0];
  27.             else
  28.                 aLegend = mapLayout1.AddLegend(650, 100);
  29.             aLegend.LegendStyle = LegendStyleEnum.Bar_Vertical;
  30.             aLegend.LegendLayer = aLayer;
  31.             mapLayout1.PaintGraphics();
  32.         }

  33.         private void TSMI_GrADSGrid_Fill_Click(object sender, EventArgs e)
  34.         {
  35.             //Create a MeteoDataInfo object
  36.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  37.             //Open GrADS data file
  38.             string aFile = Application.StartupPath + "\\Sample\\model.ctl";
  39.             aDataInfo.OpenGrADSData(aFile);

  40.             //Get GridData
  41.             GridData press = aDataInfo.GetGridData("PS");

  42.             //Create a legend scheme
  43.             bool hasUndefData = false;
  44.             LegendScheme aLS = LegendManage.CreateLegendSchemeFromGridData(press,
  45.                         LegendType.GraduatedColor, ShapeTypes.Polygon, ref hasUndefData);

  46.             //Create a contour layer
  47.             VectorLayer aLayer = DrawMeteoData.CreateGridFillLayer(press, aLS, "GridFill_PS");

  48.             //Add layer
  49.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  50.             layersLegend1.ActiveMapFrame.MoveLayer(aLayer.Handle, 0);
  51.             layersLegend1.Refresh();

  52.             //Change title of the layout
  53.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  54.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Grid_Fill Layer");

  55.             //Add or change the legend in layout
  56.             LayoutLegend aLegend;
  57.             if (mapLayout1.GetLegends().Count > 0)
  58.                 aLegend = mapLayout1.GetLegends()[0];
  59.             else
  60.                 aLegend = mapLayout1.AddLegend(650, 100);
  61.             aLegend.LegendStyle = LegendStyleEnum.Bar_Vertical;
  62.             aLegend.LegendLayer = aLayer;
  63.             mapLayout1.PaintGraphics();
  64.         }

  65.         private void TSMI_GrADSGrid_Point_Click(object sender, EventArgs e)
  66.         {
  67.             //Create a MeteoDataInfo object
  68.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  69.             //Open GrADS data file
  70.             string aFile = Application.StartupPath + "\\Sample\\model.ctl";
  71.             aDataInfo.OpenGrADSData(aFile);

  72.             //Get GridData
  73.             GridData press = aDataInfo.GetGridData("PS");

  74.             //Create a legend scheme
  75.             bool hasUndefData = false;
  76.             LegendScheme aLS = LegendManage.CreateLegendSchemeFromGridData(press,
  77.                         LegendType.GraduatedColor, ShapeTypes.Point, ref hasUndefData);

  78.             //Create a contour layer
  79.             VectorLayer aLayer = DrawMeteoData.CreateGridPointLayer(press, aLS, "GridPoint_PS");

  80.             //Add layer
  81.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  82.             layersLegend1.ActiveMapFrame.MoveLayer(aLayer.Handle, 2);
  83.             layersLegend1.Refresh();

  84.             //Change title of the layout
  85.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  86.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Shaded Layer");

  87.             //Add or change the legend in layout
  88.             LayoutLegend aLegend;
  89.             if (mapLayout1.GetLegends().Count > 0)
  90.                 aLegend = mapLayout1.GetLegends()[0];
  91.             else
  92.                 aLegend = mapLayout1.AddLegend(650, 100);
  93.             aLegend.LegendStyle = LegendStyleEnum.Bar_Vertical;
  94.             aLegend.LegendLayer = aLayer;
  95.             mapLayout1.PaintGraphics();
  96.         }

  97.         private void TSMI_Raster_Click(object sender, EventArgs e)
  98.         {
  99.             //Create a MeteoDataInfo object
  100.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  101.             //Open GrADS data file
  102.             string aFile = Application.StartupPath + "\\Sample\\model.ctl";
  103.             aDataInfo.OpenGrADSData(aFile);

  104.             //Get GridData
  105.             GridData press = aDataInfo.GetGridData("PS");

  106.             //Create a legend scheme
  107.             bool hasUndefData = false;
  108.             LegendScheme aLS = LegendManage.CreateLegendSchemeFromGridData(press,
  109.                         LegendType.GraduatedColor, ShapeTypes.Polygon, ref hasUndefData);

  110.             //Create a contour layer
  111.             RasterLayer aLayer = DrawMeteoData.CreateRasterLayer(press, "Raster_PS", aLS);

  112.             //Add layer
  113.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  114.             layersLegend1.ActiveMapFrame.MoveLayer(aLayer.Handle, 0);
  115.             layersLegend1.Refresh();

  116.             //Change title of the layout
  117.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  118.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Raster Layer");

  119.             //Add or change the legend in layout
  120.             LayoutLegend aLegend;
  121.             if (mapLayout1.GetLegends().Count > 0)
  122.                 aLegend = mapLayout1.GetLegends()[0];
  123.             else
  124.                 aLegend = mapLayout1.AddLegend(650, 100);
  125.             aLegend.LegendStyle = LegendStyleEnum.Bar_Vertical;
  126.             aLegend.LegendLayer = aLayer;
  127.             mapLayout1.PaintGraphics();
  128.         }

运行结果:
Image00870.png
Image00871.png
Image00872.png
Image00873.png


再讲讲后三种关于风场的图层,需要至少两个格点数据,风场U、V分量或者风速、风向,model.ctl/model.dat数据里是U、V分量,所以这里只示例了这种情况,风速、风向的情况也很类似。MeteoDataInfo对象里可以设置TiimeIndex和LevelIndex来获得不同时次是高度的某变量的格点数据,由于地面风场只有海洋区域有,因此可以将LevelIndex设的大些。用GetGridData方法获取风场U、V分量的GridData,然后就可以用DrawMeteoData类中的相应方法来创建Vector、Barb和Streamline图层了。其中Vector和Barb图层还可以根据第三个变量来设置图元的颜色,以便显示更丰富的信息。
Vector:  DrawMeteoData.CreateGridVectorLayer(GridData uData, GridData vData, GridData gridData,
            LegendScheme aLS, bool ifColor, string lName, bool isUV)
Barb:  DrawMeteoData.CreateGridBarbLayer(GridData uData, GridData vData, GridData gridData,
            LegendScheme aLS, bool ifColor, string lName, bool isUV)
Streamline:  DrawMeteoData.CreateStreamlineLayer(GridData uData, GridData vData, int density, LegendScheme aLS,
            string lName, bool isUV)

具体的代码如下:
  1.         private void TSMI_GrADSVector_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.             //Get GridData
  9.             aDataInfo.TimeIndex = 2;
  10.             aDataInfo.LevelIndex = 3;
  11.             GridData tData = aDataInfo.GetGridData("T");
  12.             GridData uData = aDataInfo.GetGridData("U");
  13.             GridData vData = aDataInfo .GetGridData ("V");

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

  18.             //Create a contour layer
  19.             VectorLayer aLayer = DrawMeteoData.CreateGridVectorLayer(uData, vData, tData, aLS, true, "Vector_T", true);

  20.             //Add layer
  21.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  22.             layersLegend1.ActiveMapFrame.MoveLayer(aLayer.Handle, 2);
  23.             layersLegend1.Refresh();

  24.             //Change title of the layout
  25.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  26.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Wind Vector Layer");

  27.             //Add or change the legend in layout
  28.             LayoutLegend aLegend;
  29.             if (mapLayout1.GetLegends().Count > 0)
  30.                 aLegend = mapLayout1.GetLegends()[0];
  31.             else
  32.                 aLegend = mapLayout1.AddLegend(650, 100);
  33.             aLegend.LegendStyle = LegendStyleEnum.Bar_Vertical;
  34.             aLegend.LegendLayer = aLayer;
  35.             mapLayout1.PaintGraphics();
  36.         }

  37.         private void TSMI_GrADSBarb_Click(object sender, EventArgs e)
  38.         {
  39.             //Create a MeteoDataInfo object
  40.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  41.             //Open GrADS data file
  42.             string aFile = Application.StartupPath + "\\Sample\\model.ctl";
  43.             aDataInfo.OpenGrADSData(aFile);

  44.             //Get GridData
  45.             aDataInfo.TimeIndex = 2;
  46.             aDataInfo.LevelIndex = 3;
  47.             GridData uData = aDataInfo.GetGridData("U");
  48.             GridData vData = aDataInfo.GetGridData("V");

  49.             //Create a legend scheme
  50.             LegendScheme aLS = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Blue, 10);

  51.             //Create a contour layer
  52.             VectorLayer aLayer = DrawMeteoData.CreateGridBarbLayer(uData, vData, uData, aLS, false, "Barb_UV", true);

  53.             //Add layer
  54.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  55.             layersLegend1.ActiveMapFrame.MoveLayer(aLayer.Handle, 2);
  56.             layersLegend1.Refresh();

  57.             //Change title of the layout
  58.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  59.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Wind Barb Layer");            
  60.         }

  61.         private void TSMI_GrADSStreamline_Click(object sender, EventArgs e)
  62.         {
  63.             //Create a MeteoDataInfo object
  64.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  65.             //Open GrADS data file
  66.             string aFile = Application.StartupPath + "\\Sample\\model.ctl";
  67.             aDataInfo.OpenGrADSData(aFile);

  68.             //Get GridData
  69.             aDataInfo.TimeIndex = 2;
  70.             aDataInfo.LevelIndex = 3;
  71.             GridData uData = aDataInfo.GetGridData("U");
  72.             GridData vData = aDataInfo.GetGridData("V");

  73.             //Create a legend scheme
  74.             LegendScheme aLS = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Polyline, Color.Blue, 1);

  75.             //Create a contour layer
  76.             VectorLayer aLayer = DrawMeteoData.CreateStreamlineLayer(uData, vData, 4, aLS, "Streamline_UV", true);

  77.             //Add layer
  78.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  79.             layersLegend1.ActiveMapFrame.MoveLayer(aLayer.Handle, 2);
  80.             layersLegend1.Refresh();

  81.             //Change title of the layout
  82.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  83.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Wind Streamline Layer");  
  84.         }

运行结果:
Image00874.png
Image00875.png
Image00876.png



本帖被以下淘专辑推荐:

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

新浪微博达人勋

 楼主| 发表于 2012-4-25 13:17:57 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-4-21 12:33:08 | 显示全部楼层
沙发{:eb317:}{:eb317:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-4-21 12:37:11 | 显示全部楼层
先搞个地板,这一期给的很足,慢慢消化...
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-4-21 21:17:31 | 显示全部楼层
学习中~~~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-4-22 09:04:44 | 显示全部楼层
,顶!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-4-22 11:04:43 | 显示全部楼层
请问王老师:
  1. borderList = Contour.TracingBorders(gridData, X, Y, ref s1, undefData);
  2.             polyLineList = Contour.TracingContourLines(gridData, X, Y, legendValuesLength, legendValues, undefData, borderList, s1);
复制代码
这里面borderList里面的X,Y是不是和polyLineList里面的一样的?前面的作用是什么?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-4-22 11:23:51 | 显示全部楼层
xnlm2004 发表于 2012-4-22 11:04
请问王老师:这里面borderList里面的X,Y是不是和polyLineList里面的一样的?前面的作用是什么?

前面有帖子讲到了wContour:复杂格点数据等值线分析算法
http://bbs.06climate.com/forum.p ... 082&fromuid=106
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-4-25 11:26:03 | 显示全部楼层
设置图层透明度的函数?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-4-25 12:11:08 | 显示全部楼层
不多说了,做作业去。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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