爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2873|回复: 2

二次开发--站点数据StationInfo如何快速绘制Label

[复制链接]

新浪微博达人勋

发表于 2018-8-25 02:45:51 | 显示全部楼层 |阅读模式

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

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

x
问题:MeteoInfo类库支持站点数据stationInfo添加Label,但是目前找到的解决方法有两个:
1)调用类库中的frmLabelSet窗体,可以通过交互界面设置具体的label信息
2)直接创建VectorLayer aLayer ,通过aLayer.LabelSet中的参数,设置FieldName,XOffset,YOffset,DrawLabels等信息,然后aLayer.AddLabels();
上面两种方法,都局限在我必须通过交互方式,在layersLegend1.SelectedNode选取我要添加的图层。

如何不用交互选取,直接在layersLegend1.ActiveMapFrame.AddLayer(aLayer);之后,直接添加自定义的标签信息?

目前我的代码如下:

  1. private void 读取lonlat信息ToolStripMenuItem_Click(object sender, EventArgs e)
  2. {
  3.             //打开latlon数据
  4.             //Create a MeteoDataInfo object
  5.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  6.             //Open latlon data file
  7.             string aFile = Application.StartupPath + "\\latlon.csv";
  8.             aDataInfo.OpenLonLatData(aFile);

  9.             //Get StationData
  10.             StationInfoData Data = aDataInfo.GetStationInfoData();

  11.             //Create a legend scheme
  12.             LegendScheme aLS = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Red, 6);

  13.             //导入配色方案
  14.             aLS.ImportFromXMLFile("latlon.lgs");

  15.             MapLayer aLayer = new MapLayer();
  16.             if (Data != null)
  17.             {
  18.                 aLS.MissingValue = aDataInfo.MissingValue;
  19.                 aLayer = DrawMeteoData.CreateSTInfoLayer(Data, aLS, "站点信息信息");

  20.             
  21.                 //Add layer
  22.                 layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  23.                 layersLegend1.ActiveMapFrame.MoveLayer(aLayer.Handle, 0);
  24.                 layersLegend1.Refresh();
  25.             }

  26. }

  27. private void 打开标签ToolStripMenuItem_Click(object sender, EventArgs e)
  28. {
  29.             if (layersLegend1.SelectedNode == null)
  30.                 return;

  31.             if (layersLegend1.SelectedNode.NodeType == NodeTypes.LayerNode)
  32.             {
  33.                 LayerNode aLN = (LayerNode)layersLegend1.SelectedNode;
  34.                 MapLayer aMLayer = aLN.MapFrame.MapView.GetLayerFromHandle(aLN.LayerHandle);

  35.                

  36.                 if (aMLayer.LayerType == LayerTypes.VectorLayer)
  37.                 {
  38.                     VectorLayer aLayer = (VectorLayer)aMLayer;
  39.                     if (aLayer.ShapeNum > 0)
  40.                     {
  41.                         //通过交互窗体,设置添加标签信息
  42.                         //frmLabelSet aFrmLabel = new frmLabelSet(layersLegend1.ActiveMapFrame.MapView);
  43.                         //aFrmLabel.Layer = aLayer;
  44.                         //aFrmLabel.Show(this);

  45.                         //直接添加标签信息,屏蔽交互窗体
  46.                         aLayer.RemoveLabels();
  47.                         aLayer.LabelSet.FieldName = "Station_name";
  48.                         aLayer.LabelSet.AvoidCollision = true;
  49.                         aLayer.LabelSet.LabelAlignType = (AlignType)Enum.Parse(typeof(AlignType), "Right", true);
  50.                         aLayer.LabelSet.XOffset = 0;
  51.                         aLayer.LabelSet.YOffset = -5;
  52.                         aLayer.LabelSet.LabelColor = Color.Red;
  53.                         aLayer.LabelSet.DrawLabels = true;
  54.                         aLayer.LabelSet.ColorByLegend = true;
  55.                         aLayer.LabelSet.AutoDecimal = true;
  56.                         aLayer.AddLabels();



  57.                     }
  58.                 }
  59.             }
  60. }

复制代码




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

新浪微博达人勋

 楼主| 发表于 2018-8-25 03:01:49 | 显示全部楼层
基于老师的demo,添加了相关测试代码,具体看附件吧。

在翻看demo中,才发现,老师的示例中有我这个问题的解决代码。。。。汗颜。花了一晚上研究的,其实demo中有现成的代码。

MeteoInfoDemo.zip

23.07 MB, 下载次数: 11, 下载积分: 金钱 -5

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

新浪微博达人勋

 楼主| 发表于 2018-8-25 02:50:04 | 显示全部楼层
本帖最后由 孤蓝et 于 2018-8-25 02:51 编辑

大致分析了一下MeteoInfo类库源代码后,测试了几次,找到了精简版的方法,剔除交互界面操作过程以及选取图层过程,直接在绘制layout后添加label。供大家参考,也希望老师指点下@MeteoInfo ,我这样处理的是否正确?

  1. private void 读取latlon信息ToolStripMenuItem_Click(object sender, EventArgs e)
  2.         {

  3.             //打开latlon数据
  4.             //Create a MeteoDataInfo object
  5.             MeteoDataInfo aDataInfo = new MeteoDataInfo();

  6.             //Open latlon data file
  7.             string aFile = Application.StartupPath + "\\latlon.csv";
  8.             aDataInfo.OpenLonLatData(aFile);

  9.             //Get StationData
  10.             StationInfoData Data = aDataInfo.GetStationInfoData();

  11.             //Create a legend scheme
  12.             LegendScheme aLS = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Red, 6);

  13.             //导入配色方案
  14.             aLS.ImportFromXMLFile("latlon.lgs");

  15.             MapLayer aLayer = new MapLayer();
  16.             if (Data != null)
  17.             {
  18.                 aLS.MissingValue = aDataInfo.MissingValue;
  19.                 aLayer = DrawMeteoData.CreateSTInfoLayer(Data, aLS, "站点信息信息");

  20.                VectorLayer aLayer2 = (VectorLayer)aLayer;
  21.                 aLayer2.RemoveLabels();
  22.                 aLayer2.LabelSet.FieldName = "Trkn";
  23.                 aLayer2.LabelSet.AvoidCollision = true;
  24.                 aLayer2.LabelSet.LabelAlignType = (AlignType)Enum.Parse(typeof(AlignType), "Right", true);
  25.                 aLayer2.LabelSet.XOffset = 0;
  26.                 aLayer2.LabelSet.YOffset = -5;
  27.                 aLayer2.LabelSet.LabelColor = Color.Red;
  28.                 aLayer2.LabelSet.DrawLabels = true;
  29.                 aLayer2.LabelSet.ColorByLegend = true;
  30.                 aLayer2.LabelSet.AutoDecimal = true;
  31.                 aLayer2.AddLabels();

  32.                 //Add layer
  33.                 layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  34.                 layersLegend1.ActiveMapFrame.MoveLayer(aLayer.Handle, 0);
  35.                 layersLegend1.Refresh();
  36.             }

  37.         }
复制代码
捕获.JPG



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

本版积分规则

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

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

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