爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
楼主: 孤蓝et

关于meteoinfo类库开发中的疑问

[复制链接]

新浪微博达人勋

发表于 2011-10-3 16:05:25 | 显示全部楼层

参考demo程序中的Label代码:
  1. private void TSB_Label_Click(object sender, EventArgs e)
  2.         {
  3.             //Get selected layer
  4.             object aLayerObj = this.mapView1.GetLayerFromHandle(G_LayerLegend.SelectedLayer);
  5.             if (aLayerObj.GetType() != typeof(VectorLayer))
  6.                 return;

  7.             VectorLayer aLayer = (VectorLayer)aLayerObj;

  8.             //Set label
  9.             List<string> fieldNameList = aLayer.GetFieldNameList();
  10.             string fieldName;
  11.             if (aLayer.LayerName == "country1.shp")
  12.                 fieldName = fieldNameList[3];    //This is special for 'country1.shp'.
  13.             else
  14.                 fieldName = fieldNameList[0];

  15.             aLayer.LabelSet.FieldName = fieldName;
  16.             aLayer.LabelSet.AvoidCollision = true;
  17.             aLayer.LabelSet.LabelAlignType = MeteoInfoC.Legend.AlignType.Center;
  18.             aLayer.LabelSet.Offset = 0;
  19.             aLayer.LabelSet.LabelFont = new Font("Arial", 8);
  20.             aLayer.LabelSet.LabelColor = Color.Red;
  21.             aLayer.LabelSet.DrawShadow = false;
  22.             aLayer.LabelSet.ShadowColor = Color.White;            
  23.             aLayer.LabelSet.ColorByLegend = false;

  24.             //Add labels
  25.             aLayer.RemoveLabels();
  26.             aLayer.AddLabels();
  27.             this.mapView1.PaintLayers();
  28.         }
复制代码


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

新浪微博达人勋

 楼主| 发表于 2012-1-28 21:33:32 | 显示全部楼层
MeteoInfo 发表于 2011-9-5 08:19
当然可以显示中文名,你的站点文本文件中不是有中文站名吗。用Excel编辑成MeteoInfo的Lon/Lat Station文本 ...

总算是会自己做站点文件名的shp文件了。。。。。
meteoinfo很强大。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-2-1 22:16:09 | 显示全部楼层
c#是大势所趋,形势逼人啊。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-2-23 11:37:29 | 显示全部楼层
本帖最后由 孤蓝et 于 2012-2-23 11:38 编辑

this.mapView1.MouseTool = MouseTools.Pan;
this.mapView1.MouseTool = MouseTools.Identifer;
找到鼠标实时取值的方法了。就是把pan改为Identifer,呵呵,简单么。。。
还有个问题:不知道怎样将这两个鼠标方法结合到一起,使用了identifer,就不太方便进行图形漫游。
不知道Map_View有没有mouseUp,来区分鼠标点击和松开?
好像通过区分左右键,可以设定右键点击为identifer,右键松开为Pan。
右键点击和松开都为Pan。
貌似这样就能实现了。。。呵呵。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-2-23 11:26:49 | 显示全部楼层
MeteoInfo 发表于 2012-2-22 22:00
1、就是Identifer的功能而已
2、是ZedGraph

Identife,哈哈,忘记了。。。。在meteoinfo中还用过,怎么没有想到呢。
去翻翻meteoinfoC help查查怎么用。
谢谢斑竹。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-2-22 21:22:40 | 显示全部楼层
下一步功能尝试:
【1】结合鼠标实时位置信息,实现鼠标选取台站,然后将被选取的台站详细数据进行提取显示。不知道meteoinfo有没有现成的支持。。嘻嘻。想偷懒哈。。。。。
【2】气象要素一维曲线图显示 。貌似楼主用的是ZedGraph来作一维数据?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-2-22 21:56:20 | 显示全部楼层
孤蓝et 发表于 2012-2-22 21:17
完美解决:台站经纬度数据的风羽、台站实际数据填绘功能。谢谢斑竹,离我距离开发完整的系统又近了一步。
...

其实不用生成这么多图层,有一个Station_Info图层就可以了,多用几次AddLabels()就可以了,当然之前不要RemoveLabels()。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-2-22 22:00:48 | 显示全部楼层
孤蓝et 发表于 2012-2-22 21:22
下一步功能尝试:
【1】结合鼠标实时位置信息,实现鼠标选取台站,然后将被选取的台站详细数据进行提取显示 ...

1、就是Identifer的功能而已
2、是ZedGraph
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-2-22 21:17:13 | 显示全部楼层
完美解决:台站经纬度数据的风羽、台站实际数据填绘功能。谢谢斑竹,离我距离开发完整的系统又近了一步。
现贴出相应的代码,可以简单的修改后直接放在demo中使用,代码写的还是有点乱。
效果图如下:

台站经纬度数据填图绘制.PNG



  1.         private void TSB_Csv_Click(object sender, EventArgs e)
  2.         {


  3.             //读取csv数据。以逗号分割。
  4.             //csv每列的数据名称,见下:
  5.             //Stid,Longitude,Latitude,位置,风向,风速,温度,台站名称,能见度
  6.             LonLatStationDataInfo aDataInfo = new LonLatStationDataInfo();
  7.             string aFile = Application.StartupPath + "\\Sample\\rain_2008072220.csv";
  8.             aDataInfo.ReadDataInfo(aFile);

  9.             //Create point layer  即绘制台站位置点信息。   
  10.             LegendScheme aLS = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point , Color.Black, 2);
  11.             aLS.UNDEF = aDataInfo.UNDEF;
  12.             VectorLayer aLayer = new VectorLayer(ShapeTypes.Point);
  13.             aLayer = DrawMeteoData.CreateSTInfoLayer(aDataInfo.FieldList, aDataInfo.VarList, aDataInfo.DataList, aLS, "台站位置信息");
  14.             G_LayerLegend.AddLayer(aLayer, true);
  15.             //Set label,首先获得变量名,然后绘制标签数据数据。!!
  16.             List<string> fieldNameList = aLayer.GetFieldNameList();
  17.             aLayer.LabelSetV.FieldName = fieldNameList[7];   //台站名称存储位置
  18.             aLayer.LabelSetV.AvoidCollision = true;
  19.             aLayer.LabelSetV.LabelAlignType = MeteoInfoC.Legend.AlignType.Right;
  20.             aLayer.LabelSetV.Offset = -2;
  21.             aLayer.LabelSetV.LabelFont = new Font("宋体", 6);
  22.             aLayer.LabelSetV.LabelColor = Color.Black;
  23.             aLayer.LabelSetV.DrawShadow = false;
  24.             aLayer.LabelSetV.ShadowColor = Color.Black;
  25.             aLayer.LabelSetV.ColorByLegend = false;
  26.             //Add labels
  27.             aLayer.RemoveLabels();
  28.             aLayer.AddLabels();
  29.             this.mapView1.PaintLayers();






  30.             //Create point layer  温度绘制   
  31.             LegendScheme aLS_Temp = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Black, 2);
  32.             aLS_Temp.UNDEF = aDataInfo.UNDEF;
  33.             VectorLayer aLayer_Temp = new VectorLayer(ShapeTypes.Point);
  34.             aLayer_Temp = DrawMeteoData.CreateSTInfoLayer(aDataInfo.FieldList, aDataInfo.VarList, aDataInfo.DataList, aLS_Temp, "温度");
  35.             G_LayerLegend.AddLayer(aLayer_Temp, true);
  36.             //Set label,首先获得变量名,然后绘制标签数据数据。!!
  37.             List<string> fieldNameList_Temp = aLayer_Temp.GetFieldNameList();
  38.             aLayer_Temp.LabelSetV.FieldName = fieldNameList_Temp[6];   //温度变量存储位置
  39.             aLayer_Temp.LabelSetV.AvoidCollision = true;
  40.             aLayer_Temp.LabelSetV.LabelAlignType = MeteoInfoC.Legend.AlignType.Left;
  41.             aLayer_Temp.LabelSetV.Offset =-2;
  42.             aLayer_Temp.LabelSetV.LabelFont = new Font("宋体", 6);
  43.             aLayer_Temp.LabelSetV.LabelColor = Color.Red;
  44.             aLayer_Temp.LabelSetV.DrawShadow = false;
  45.             aLayer_Temp.LabelSetV.ShadowColor = Color.Red;
  46.             aLayer_Temp.LabelSetV.ColorByLegend = false;
  47.             //Add labels
  48.             aLayer_Temp.RemoveLabels();
  49.             aLayer_Temp.AddLabels();
  50.             this.mapView1.PaintLayers();





  51.             //Create point layer  能见度绘制   
  52.             LegendScheme aLS_Vis = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Black, 2);
  53.             aLS_Vis.UNDEF = aDataInfo.UNDEF;
  54.             VectorLayer aLayer_Vis = new VectorLayer(ShapeTypes.Point);
  55.             aLayer_Vis = DrawMeteoData.CreateSTInfoLayer(aDataInfo.FieldList, aDataInfo.VarList, aDataInfo.DataList, aLS_Vis, "能见度");
  56.             G_LayerLegend.AddLayer(aLayer_Vis, true);
  57.             //Set label,首先获得变量名,然后绘制标签数据数据。!!
  58.             List<string> fieldNameList_Vis = aLayer_Vis.GetFieldNameList();
  59.             aLayer_Vis.LabelSetV.FieldName = fieldNameList_Vis[8];//能见度存储位置
  60.             aLayer_Vis.LabelSetV.AvoidCollision = true;
  61.             aLayer_Vis.LabelSetV.LabelAlignType = MeteoInfoC.Legend.AlignType.Right;
  62.             aLayer_Vis.LabelSetV.Offset = 8;
  63.             aLayer_Vis.LabelSetV.LabelFont = new Font("宋体", 6);
  64.             aLayer_Vis.LabelSetV.LabelColor = Color.Red;
  65.             aLayer_Vis.LabelSetV.DrawShadow = false;
  66.             aLayer_Vis.LabelSetV.ShadowColor = Color.Red;
  67.             aLayer_Vis.LabelSetV.ColorByLegend = false;
  68.             //Add labels
  69.             aLayer_Vis.RemoveLabels();
  70.             aLayer_Vis.AddLabels();
  71.             this.mapView1.PaintLayers();



  72.             //绘制风羽,利用GetstationData读取出风向风速,而后使用CreateSTBarbLayer绘制风羽图。
  73.             StationData wind_Dir = aDataInfo.GetStationData(1); // 风向
  74.             StationData wind_Spd = aDataInfo.GetStationData(2); // 风速
  75.             //Generate legend scheme
  76.             LegendScheme aLS_windBarb = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Blue, 10);
  77.             //Create layer
  78.             VectorLayer aLayer_windBarb = new VectorLayer(ShapeTypes.Point);
  79.             aLayer = DrawMeteoData.CreateSTBarbLayer(wind_Dir.Data, wind_Spd.Data, wind_Dir.Data, aDataInfo.UNDEF,
  80.                 aLS_windBarb, false, "风羽");
  81.             G_LayerLegend.AddLayer(aLayer, true);




  82.         }
复制代码

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

新浪微博达人勋

 楼主| 发表于 2012-2-16 01:53:30 | 显示全部楼层
还是关于类库开发的问题,又要劳烦斑竹了。下面的问题都是关于台站经纬度数据的显示处理。
【1】台站某要素的实际数值填绘显示我想自己写一套Station_Modell来配合我的台站经纬度数据显示。
        由于机场观测实况(METAR)与地方台站的有区别,无法使用Micaps第一类数据这个便捷的数据类型,故我将实况信息做成台站经纬度数据,包含风、云、能见度、天气现象、温度、海压等要素,我怎样能够将某一个要素的具体数值填绘出来,因为我看Legend中的ShapeType没有定义填绘数值的项目,目前我只会使用Point,Shape等类型。

【2】台站经纬度数据绘制凤羽:我的数据文件中包含风向风速度信息,我如何绘制凤羽?用Micaps第一类数据我会使用,但是台站经纬度数据不知道如何实现?这个过程是不是和脚本中绘制风场类似?

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

本版积分规则

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

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

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