爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 19901|回复: 41

MeteoInfo二次开发教程(七)

[复制链接]

新浪微博达人勋

发表于 2012-5-30 14:41:47 | 显示全部楼层 |阅读模式

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

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

x
讲讲站点数据生成的各种图层,主要包括Station Point(站点)、Station Model(站点填图)、Weather Symbol(天气现象符号)、 Station Vector(站点风场矢量)、Station Shaded(站点数据插值成格点数据再生成等值线填色图层)。

用DrawMeteoData类的一些静态方法来创建各种图层:
Station_Point:  DrawMeteoData.CreateSTPointLayer(StationData stationData, LegendScheme aLS, string layerName, string        fieldName)
Station_Model:  DrawMeteoData.CreateStationModelLayer(double[,] stationModelData, double undefine, LegendScheme aLS,    string layerName, bool isSurface)
Weather_Symbol:  DrawMeteoData.CreateWeatherSymbolLayer(StationData weatherData, LegendScheme aLS, string LName)
Station_Vector:  DrawMeteoData.CreateSTVectorLayer(StationData uData, StationData vData, StationData stData, LegendScheme aLS, bool ifColr, string LName, bool isUV)

就不多说了,大家看代码吧:
  1.         private void TSMI_StationPoint_Click(object sender, EventArgs e)
  2.         {
  3.             //Create a MeteoDataInfo object
  4.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  5.             //Open SYNOP data file
  6.             string aFile = Application.StartupPath + "\\Sample\\12010615.syn";
  7.             string stFile = Application.StartupPath + "\\Sample\\SYNOP_Stations.csv";
  8.             aDataInfo.OpenSYNOPData(aFile, stFile);

  9.             //Get StationData
  10.             StationData visData = aDataInfo.GetStationData("Visibility");

  11.             //Create a legend scheme
  12.             bool hasUndefData = false;
  13.             LegendScheme aLS = LegendManage.CreateLegendSchemeFromStationData(visData, LegendType.GraduatedColor,
  14.                 ShapeTypes.Point, ref hasUndefData);
  15.             for (int i = 0; i < aLS.BreakNum; i++)
  16.                 ((PointBreak)aLS.breakList[i]).Size = 8;

  17.             //Create a contour layer
  18.             VectorLayer aLayer = DrawMeteoData.CreateSTPointLayer(visData, aLS, "StationPoint_Vis", "Vis");

  19.             //Add layer
  20.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  21.             layersLegend1.Refresh();

  22.             //Change title of the layout
  23.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  24.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Station Point Layer");

  25.             //Add or change the legend in layout
  26.             LayoutLegend aLegend;
  27.             if (mapLayout1.GetLegends().Count > 0)
  28.                 aLegend = mapLayout1.GetLegends()[0];
  29.             else
  30.                 aLegend = mapLayout1.AddLegend(650, 100);
  31.             aLegend.LegendStyle = LegendStyleEnum.Bar_Vertical;
  32.             aLegend.LegendLayer = aLayer;
  33.             if (tabControl1.SelectedIndex == 1)
  34.                 mapLayout1.PaintGraphics();
  35.         }
  36.         
  37.         private void TSMI_StationModel_Click(object sender, EventArgs e)
  38.         {
  39.             //Create a MeteoDataInfo object
  40.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  41.             //Open SYNOP data file
  42.             string aFile = Application.StartupPath + "\\Sample\\12010615.syn";
  43.             string stFile = Application.StartupPath + "\\Sample\\SYNOP_Stations.csv";
  44.             aDataInfo.OpenSYNOPData(aFile, stFile);

  45.             //Create a legend scheme
  46.             LegendScheme aLS = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Blue, 12);

  47.             //Get station model data
  48.             double[,] stationModelData = new double[10, 1];
  49.             Extent aExtent = new Extent();
  50.             stationModelData = aDataInfo.GetStationModelData(ref aExtent);

  51.             VectorLayer aLayer = new VectorLayer(ShapeTypes.Point);
  52.             aLayer = DrawMeteoData.CreateStationModelLayer(stationModelData,
  53.                     aDataInfo.UNDEF, aLS, "StationModel", true);            

  54.             //Add layer
  55.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  56.             layersLegend1.Refresh();

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

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

  65.             //Open SYNOP data file
  66.             string aFile = Application.StartupPath + "\\Sample\\12010615.syn";
  67.             string stFile = Application.StartupPath + "\\Sample\\SYNOP_Stations.csv";
  68.             aDataInfo.OpenSYNOPData(aFile, stFile);

  69.             //Get StationData
  70.             StationData wData = aDataInfo.GetStationData("Weather");

  71.             //Create a legend scheme
  72.             LegendScheme aLS = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Blue, 15);

  73.             //Create a contour layer
  74.             VectorLayer aLayer = DrawMeteoData.CreateWeatherSymbolLayer(wData, aLS, "Weather");

  75.             //Add layer
  76.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  77.             layersLegend1.Refresh();

  78.             //Change title of the layout
  79.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  80.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Weather Symbol Layer");

  81.             //Add or change the legend in layout
  82.             LayoutLegend aLegend;
  83.             if (mapLayout1.GetLegends().Count > 0)
  84.                 aLegend = mapLayout1.GetLegends()[0];
  85.             else
  86.                 aLegend = mapLayout1.AddLegend(650, 100);
  87.             aLegend.LegendStyle = LegendStyleEnum.Bar_Vertical;
  88.             aLegend.LegendLayer = aLayer;
  89.             if (tabControl1.SelectedIndex == 1)
  90.                 mapLayout1.PaintGraphics();
  91.         }

  92.         private void TSMI_StationVector_Click(object sender, EventArgs e)
  93.         {
  94.             //Create a MeteoDataInfo object
  95.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  96.             //Open SYNOP data file
  97.             string aFile = Application.StartupPath + "\\Sample\\12010615.syn";
  98.             string stFile = Application.StartupPath + "\\Sample\\SYNOP_Stations.csv";
  99.             aDataInfo.OpenSYNOPData(aFile, stFile);

  100.             //Get StationData
  101.             StationData wdData = aDataInfo.GetStationData("WindDirection");
  102.             StationData wsData = aDataInfo.GetStationData("WindSpeed");

  103.             //Create a legend scheme
  104.             LegendScheme aLS = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Blue, 15);

  105.             //Create a contour layer
  106.             VectorLayer aLayer = DrawMeteoData.CreateSTVectorLayer(wdData, wsData, wdData, aLS, false, "StationVector", false);

  107.             //Add layer
  108.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  109.             layersLegend1.Refresh();

  110.             //Change title of the layout
  111.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  112.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Station Wind Vector Layer");
  113.         }

  114.         private void TSMI_StationShaded_Click(object sender, EventArgs e)
  115.         {
  116.             this.Cursor = Cursors.WaitCursor;

  117.             //Read data info
  118.             MeteoDataInfo aDataInfo = new MeteoDataInfo();
  119.             string aFile = Application.StartupPath + "\\Sample\\rain_2008072220.csv";
  120.             aDataInfo.OpenLonLatData(aFile);

  121.             //Get station data
  122.             StationData stationData = aDataInfo.GetStationData("Precipitation6h");

  123.             //Interpolate
  124.             GridDataPara aGDP = new GridDataPara();
  125.             aGDP.dataExtent.minX = 60;
  126.             aGDP.dataExtent.maxX = 140;
  127.             aGDP.dataExtent.minY = -20;
  128.             aGDP.dataExtent.maxY = 60;
  129.             aGDP.xNum = 80;
  130.             aGDP.yNum = 80;
  131.             GridInterpolation gridInterp = new GridInterpolation();
  132.             gridInterp.GridDataParaV = aGDP;

  133.             gridInterp.GridInterMethodV = GridInterMethod.IDW_Radius;
  134.             gridInterp.Radius = 2;
  135.             gridInterp.MinPointNum = 1;

  136.             double[] X = new double[1];
  137.             double[] Y = new double[1];
  138.             ContourDraw.CreateGridXY(gridInterp.GridDataParaV, ref X, ref Y);
  139.             double[,] S = stationData.Data;
  140.             S = ContourDraw.FilterDiscreteData_Radius(S, gridInterp.Radius,
  141.                 gridInterp.GridDataParaV.dataExtent, stationData.UNDEF);
  142.             GridData gridData = ContourDraw.InterpolateDiscreteData_Radius(S,
  143.                 X, Y, gridInterp.MinPointNum, gridInterp.Radius, stationData.UNDEF);

  144.             //Create legend scheme
  145.             bool hasNoData = true;
  146.             LegendScheme aLS = LegendManage.CreateLegendSchemeFromGridData(gridData, LegendType.GraduatedColor,
  147.                 ShapeTypes.Polygon, ref hasNoData);
  148.             ((PolygonBreak)aLS.breakList[0]).DrawFill = false;

  149.             //Create layer
  150.             VectorLayer aLayer = new VectorLayer(ShapeTypes.Polygon);
  151.             aLayer = DrawMeteoData.CreateShadedLayer(gridData, aLS, "Rain", "Rain");
  152.             aLayer.IsMaskout = true;

  153.             //Add layer
  154.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  155.             layersLegend1.ActiveMapFrame.MoveLayer(aLayer.Handle, 0);
  156.             layersLegend1.Refresh();

  157.             //Change title of the layout
  158.             LayoutGraphic aTitle = mapLayout1.GetTexts()[0];
  159.             aTitle.SetLabelText("MeteoInfo Class Library Demo - Station Shaded Layer");

  160.             //Add or change the legend in layout
  161.             LayoutLegend aLegend;
  162.             if (mapLayout1.GetLegends().Count > 0)
  163.                 aLegend = mapLayout1.GetLegends()[0];
  164.             else
  165.                 aLegend = mapLayout1.AddLegend(650, 100);
  166.             aLegend.LegendStyle = LegendStyleEnum.Bar_Vertical;
  167.             aLegend.LegendLayer = aLayer;
  168.             if (tabControl1.SelectedIndex == 1)
  169.                 mapLayout1.PaintGraphics();

  170.             this.Cursor = Cursors.Default;
  171.         }
复制代码

运行结果:
Image00156.png
Image00157.png
Image00158.png
Image00159.png
Image00160.png

本帖被以下淘专辑推荐:

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

新浪微博达人勋

 楼主| 发表于 2012-5-30 15:46:13 | 显示全部楼层
最近这两讲可能有些难,仔细讲的话要花很多时间准备材料,粗略地讲又会有很多东西没有提及。Demo程序已经到了一定程度了,因此将Demo程序的源代码打包上传到MeteoInfo网页,有兴趣的朋友可以去下载源代码自己琢磨。

http://www.meteothinker.com/Downloads.html 中的 MeteoInfo class library demo program。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-5-30 17:03:40 | 显示全部楼层
本帖最后由 sysun 于 2012-5-30 17:05 编辑

王老师又出新教程了,关注、学习中。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-5-30 19:36:46 | 显示全部楼层
王老师辛苦了~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-30 21:52:09 | 显示全部楼层

在MeteoInfo中每个shape都有一个最小外接矩形(Extent),可以简单的用Extent的中心作为多边形的中心。但是对于凹多边形,这样算出来的中心有可能在多边形之外。更好的方法是计算多边形的几何中心,不过MeteoInfo目前还没有这种算法。如果你的多边形凹得不厉害,可以用我说的简化方法。或者你的多边形是固定的,比如是浙江,你可以自己手动找出它的一个大概中心,标注应该要求没那么高了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-31 14:16:00 | 显示全部楼层
zhuvieri 发表于 2012-5-31 08:50
Extent取中心点有没有语句的?还是要自己写代码算。嘻嘻。

矩形算中心点还需要函数呀,自己写吧
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-6-6 17:24:29 | 显示全部楼层
好好学习,天天向上
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-6-7 13:13:00 | 显示全部楼层
zhuvieri 发表于 2012-6-6 08:56
王老师,那个MeteoInfoC里头的一些Gis函数,又没有一个函数参考大全?或者是我可以直接下其他gis里头的函数 ...

更新了MeteoInfo类库的帮助文档,可以在此网页下载:http://www.meteothinker.com/Documentation.html

帮助文档是自动生成的,文件名:MeteoInfoC.chm
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-6-10 20:56:26 | 显示全部楼层
好好学学,
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-30 17:13:45 | 显示全部楼层
本帖最后由 geoeco 于 2012-10-30 17:14 编辑

//Create legend scheme:
            bool hasNoData = true;
            LegendScheme aLS=LegendManage.CreateLegendSchemeFromGridData(gridData, LegendType.GraduatedColor,ShapeTypes.Polygon,ref hasNoData);
            ((PolygonBreak) aLS.breakList[0]).DrawFill=false;



legend 出问题了,会是哪儿的错呢?

Error      'MeteoInfoC.Legend.LegendScheme' does not contain a definition for 'breakList' and no extension method 'breakList' accepting a first argument of type 'MeteoInfoC.Legend.LegendScheme' could be found (are you missing a using directive or an assembly reference?)        
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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