爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
12
返回列表 发新帖
楼主: 记忆碎片

如何将经纬度点标注在地图上?

[复制链接]

新浪微博达人勋

 楼主| 发表于 2012-12-17 15:46:16 | 显示全部楼层


“两个疑问:
1  //Prepare coordinate data
double[] X = new double[2] { 120, 30 };
double[] Y = new double[2] { 120, 30 };
double[] data = new double[2] { 1,2 };
这里1、2两个点明明一样的数字,显示的点位置却不同


自己犯了个低级错误,应该如下修正:
  1. double[] X = new double[2] { 120, 120 };
  2.             double[] Y = new double[2] { 30, 29.5 };
  3.             double[] data = new double[2] { 1, 2 };
复制代码
加号减号问题继续查找方法。找到了会及时交作业~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-12-17 16:01:45 | 显示全部楼层
犯了个比较低级的错误,修改成以下代码
  1. //Prepare coordinate data
  2.             double[] X = new double[2] { 120, 120 };
  3.             double[] Y = new double[2] { 30, 29.5 };
  4.             double[] data = new double[2] { 1, 2 };
复制代码
得到下图效果
效果图.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-12-17 16:19:13 | 显示全部楼层
本帖最后由 记忆碎片 于 2012-12-17 16:26 编辑

接下来的问题就是:
哪个属性能够把这个Point的形状从一个圆形改成"+"或者"-"?
请老师指点指点
这个问题那两个教程里都没提到
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-17 16:44:10 | 显示全部楼层
记忆碎片 发表于 2012-12-17 16:19
接下来的问题就是:
哪个属性能够把这个Point的形状从一个圆形改成"+"或者"-"?
请老师指点指点
...

修改图层的LegendScheme,台风的那个脚本帖子里专门讲了。需要注意的是点图层的LegendBreak是PointBreak(继承自ColorBreak)。

((PointBreak)aLayer.LegendScheme.LegendBreaks[0]).Style = PointStyle.Cross;    //加号
减号在PointStyle里没有,以后会考虑加上,目前可以用字体中的减号来显示,具体参考台风的脚本帖子。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-12-17 19:25:46 | 显示全部楼层
下面这行代码可以将对应Layer中的元素标记为"+",看来我手头的跟王老师的dll还不是一个版本,代码有细微的差距
  1. ((PointBreak)aLayer.LegendScheme.breakList[0]).Style = PointStyle.Plus; //标记为加号
复制代码
可惜没有"-"(在闪电中负地闪占到绝大多数),我再来查查看台风案例
脚本语言看起来很吃力
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-12-17 19:59:26 | 显示全部楼层
本帖最后由 记忆碎片 于 2012-12-17 20:07 编辑

劳烦了王老师一整天,我也小结一下今天的成果,与大家分享:
预期效果:
通过叠加地图,把闪电叠加在地图上。正闪用"+",负闪用"-",颜色自定义
  1. /// <summary>
  2.         /// 在当前图层上绘制闪电信息
  3.        /// </summary>
  4.        /// <param name="strikesStandard">闪电源</param>
  5.        /// <param name="layerName">图层名字</param>
  6.        /// <param name="isLabeled">是否标注强度</param>
  7.         private void DrawLightningOnActivateMap(IEnumerable<IStrike_Standard> strikesStandard,string layerName,bool isLabeled)
  8.         {
  9.             //New layer
  10.             VectorLayer aLayer = new VectorLayer(ShapeTypes.Point);
  11.             aLayer.LayerName = layerName;
  12.             aLayer.LegendScheme = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Red, 10);
  13.             ((PointBreak)aLayer.LegendScheme.breakList[0]).Style = PointStyle.Plus; //标记为加号
  14.             //减号标记未知,等待王老师增加Point.Minus????
  15.             aLayer.Visible = true;

  16.             //Add fields            
  17.             aLayer.EditAddField("日期时间",typeof(DateTime));
  18.             aLayer.EditAddField("经度", typeof(double));
  19.             aLayer.EditAddField("纬度", typeof(double));
  20.             aLayer.EditAddField("强度", typeof(double));
  21.             aLayer.EditAddField("陡度", typeof(double));
  22.             aLayer.EditAddField("误差", typeof(double));
  23.             aLayer.EditAddField("探测方式", typeof(string));

  24.             //Prepare coordinate data
  25.             int sourceSumNum = strikesStandard.Count();

  26.             //Add shape
  27.             foreach (IStrike_Standard tmpStrike in strikesStandard)
  28.             {
  29.                 PointShape aPS = new PointShape();
  30.                 PointD aPoint = new PointD();
  31.                 aPoint.X = tmpStrike.Longitude;
  32.                 aPoint.Y = tmpStrike.Latitude;
  33.                 aPS.Point = aPoint;
  34.                 int shapeNum = aLayer.ShapeNum;
  35.                 if (aLayer.EditInsertShape(aPS, shapeNum))
  36.                 {
  37.                     //Edit record value
  38.                     aLayer.EditCellValue("日期时间", shapeNum, tmpStrike.DateAndTime);
  39.                     aLayer.EditCellValue("经度", shapeNum, aPoint.X);
  40.                     aLayer.EditCellValue("纬度", shapeNum, aPoint.Y);
  41.                     aLayer.EditCellValue("强度", shapeNum, tmpStrike.Intensity);
  42.                     aLayer.EditCellValue("陡度", shapeNum, tmpStrike.Slope);
  43.                     aLayer.EditCellValue("误差", shapeNum, tmpStrike.Error);
  44.                     aLayer.EditCellValue("探测方式", shapeNum, tmpStrike.LocationMode);
  45.                 }
  46.             }

  47.             //是否标注文字强度
  48.             if (isLabeled)
  49.             {
  50.                 //Add Label
  51.                 aLayer.LabelSet.FieldName = "强度";
  52.                 aLayer.LabelSet.LabelFont = new Font("Arial", 15);
  53.                 aLayer.LabelSet.YOffset = 30;
  54.                 aLayer.AddLabels();
  55.             }
  56.             //Add layer
  57.             layersLegend1.ActiveMapFrame.AddLayer(aLayer);
  58.             layersLegend1.ActiveMapFrame.MapView.PaintLayers();
  59.             layersLegend1.Refresh();
  60.         }
复制代码
并且附上效果图和用到的我自己编写的闪电dll文件,欢迎大家使用。
效果图.jpg
LightningStrikeLibrary.dll (13.5 KB, 下载次数: 0)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-12-17 22:55:40 | 显示全部楼层
本帖最后由 记忆碎片 于 2012-12-18 09:09 编辑

结贴!
再次感谢王老师的指导。所有代码共享如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using LightningStrikeLibrary;
  6. using MeteoInfoC.Layer;
  7. using MeteoInfoC.Shape;
  8. using MeteoInfoC.Legend;
  9. using MeteoInfoC.Drawing;
  10. using System.Drawing;
  11. using MeteoInfoC;
  12. namespace MeteoInfoControlLibrary
  13. {
  14.     class DrawLightningStrikes
  15.     {
  16.         public DrawLightningStrikes(List<LightningStrike_Standard> _strikes,LayersLegend _targetLayerLegend)
  17.         {
  18.             strikesSource = new List<LightningStrike_Standard>();      
  19.             strikesSource = _strikes;
  20.             ClassifyStrikes(strikesSource);
  21.             targetLayerLegend = _targetLayerLegend;
  22.         }
  23.         #region 属性变量
  24.         List<LightningStrike_Standard> strikesSource, strikesSourceNegative, strikesSourcePositive;
  25.         LayersLegend targetLayerLegend;
  26.         string layerNameNegative="NegativeFlashesLayer";
  27.         string layerNamePositive = "PositiveFlashesLayer";

  28.         public string LayerNamePositive
  29.         {
  30.             get { return layerNamePositive; }
  31.             set { layerNamePositive = value; }
  32.         }

  33.         public string LayerNameNegative
  34.         {
  35.             get { return layerNameNegative; }
  36.             set { layerNameNegative = value; }
  37.         }
  38.         public List<LightningStrike_Standard> StrikesSource
  39.         {
  40.             get { return strikesSource; }
  41.             set { strikesSource = value; }
  42.         }
  43.         public LayersLegend TargetLayerLegend
  44.         {
  45.             get { return targetLayerLegend; }
  46.             set { targetLayerLegend = value; }
  47.         }
  48.         #endregion

  49.         #region 私有函数
  50.         /// <summary>
  51.         /// 给strikesSourceNegative、strikesSourcePositive赋值
  52.         /// </summary>
  53.         private void ClassifyStrikes(List<LightningStrike_Standard> _strikesSource)
  54.         {
  55.             strikesSourceNegative = new List<LightningStrike_Standard>();
  56.             strikesSourcePositive = new List<LightningStrike_Standard>();
  57.             strikesSourceNegative = _strikesSource.Where(r => r.Intensity <= 0).Select(r => r).ToList();
  58.             strikesSourcePositive = _strikesSource.Where(r => r.Intensity > 0).Select(r => r).ToList();
  59.         }

  60.         /// <summary>
  61.         /// 添加负闪图层,用蓝色"-"表示
  62.         /// </summary>
  63.         /// <param name="_strikesSourceNegative"></param>
  64.         private void DrawStrikesSourceNegative(List<LightningStrike_Standard> _strikesSourceNegative)
  65.         {
  66.             //New layer
  67.             VectorLayer aLayer = new VectorLayer(ShapeTypes.Point);
  68.             aLayer.LayerName = layerNameNegative;
  69.             aLayer.LegendScheme = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Blue, 10);
  70.             //((PointBreak)aLayer.LegendScheme.breakList[0]).Style = PointStyle.Plus; //标记为加号
  71.             //减号标记未知,等待王老师增加Point.Minus
  72.             ((PointBreak)aLayer.LegendScheme.breakList[0]).MarkerType = MarkerType.Character;
  73.             ((PointBreak)aLayer.LegendScheme.breakList[0]).CharIndex = 45;//减号
  74.             //((PointBreak)aLayer.LegendScheme.breakList[0]).CharIndex = 43;//加号
  75.             aLayer.Visible = true;

  76.             //Add fields            
  77.             aLayer.EditAddField("日期时间", typeof(DateTime));
  78.             aLayer.EditAddField("经度", typeof(double));
  79.             aLayer.EditAddField("纬度", typeof(double));
  80.             aLayer.EditAddField("强度", typeof(double));
  81.             aLayer.EditAddField("陡度", typeof(double));
  82.             aLayer.EditAddField("误差", typeof(double));
  83.             aLayer.EditAddField("探测方式", typeof(string));

  84.             ////Prepare coordinate data
  85.             //int sourceSumNum = _strikesSourceNegative.Count();

  86.             //Add shape
  87.             foreach (IStrike_Standard tmpStrike in _strikesSourceNegative)
  88.             {
  89.                 PointShape aPS = new PointShape();
  90.                 PointD aPoint = new PointD();
  91.                 aPoint.X = tmpStrike.Longitude;
  92.                 aPoint.Y = tmpStrike.Latitude;
  93.                 aPS.Point = aPoint;
  94.                 int shapeNum = aLayer.ShapeNum;
  95.                 if (aLayer.EditInsertShape(aPS, shapeNum))
  96.                 {
  97.                     //Edit record value
  98.                     aLayer.EditCellValue("日期时间", shapeNum, tmpStrike.DateAndTime);
  99.                     aLayer.EditCellValue("经度", shapeNum, aPoint.X);
  100.                     aLayer.EditCellValue("纬度", shapeNum, aPoint.Y);
  101.                     aLayer.EditCellValue("强度", shapeNum, tmpStrike.Intensity);
  102.                     aLayer.EditCellValue("陡度", shapeNum, tmpStrike.Slope);
  103.                     aLayer.EditCellValue("误差", shapeNum, tmpStrike.Error);
  104.                     aLayer.EditCellValue("探测方式", shapeNum, tmpStrike.LocationMode);
  105.                 }
  106.             }


  107.             //Add layer
  108.             targetLayerLegend.ActiveMapFrame.AddLayer(aLayer);
  109.             targetLayerLegend.ActiveMapFrame.MapView.PaintLayers();
  110.             targetLayerLegend.Refresh();
  111.         }
  112.         /// <summary>
  113.         /// 添加负闪图层,用红色"+"表示
  114.         /// </summary>
  115.         /// <param name="_strikesSourcePositive"></param>
  116.         private void DrawStrikesSourcePositive(List<LightningStrike_Standard> _strikesSourcePositive)
  117.         {
  118.             //New layer
  119.             VectorLayer aLayer = new VectorLayer(ShapeTypes.Point);
  120.             aLayer.LayerName = layerNameNegative;
  121.             aLayer.LegendScheme = LegendManage.CreateSingleSymbolLegendScheme(ShapeTypes.Point, Color.Red, 10);
  122.             //((PointBreak)aLayer.LegendScheme.breakList[0]).Style = PointStyle.Plus; //标记为加号
  123.             //减号标记未知,等待王老师增加Point.Minus
  124.             ((PointBreak)aLayer.LegendScheme.breakList[0]).MarkerType = MarkerType.Character;
  125.             //((PointBreak)aLayer.LegendScheme.breakList[0]).CharIndex = 45;//减号
  126.             ((PointBreak)aLayer.LegendScheme.breakList[0]).CharIndex = 43;//加号
  127.             aLayer.Visible = true;

  128.             //Add fields            
  129.             aLayer.EditAddField("日期时间", typeof(DateTime));
  130.             aLayer.EditAddField("经度", typeof(double));
  131.             aLayer.EditAddField("纬度", typeof(double));
  132.             aLayer.EditAddField("强度", typeof(double));
  133.             aLayer.EditAddField("陡度", typeof(double));
  134.             aLayer.EditAddField("误差", typeof(double));
  135.             aLayer.EditAddField("探测方式", typeof(string));

  136.             ////Prepare coordinate data
  137.             //int sourceSumNum = _strikesSourceNegative.Count();

  138.             //Add shape
  139.             foreach (IStrike_Standard tmpStrike in _strikesSourcePositive)
  140.             {
  141.                 PointShape aPS = new PointShape();
  142.                 PointD aPoint = new PointD();
  143.                 aPoint.X = tmpStrike.Longitude;
  144.                 aPoint.Y = tmpStrike.Latitude;
  145.                 aPS.Point = aPoint;
  146.                 int shapeNum = aLayer.ShapeNum;
  147.                 if (aLayer.EditInsertShape(aPS, shapeNum))
  148.                 {
  149.                     //Edit record value
  150.                     aLayer.EditCellValue("日期时间", shapeNum, tmpStrike.DateAndTime);
  151.                     aLayer.EditCellValue("经度", shapeNum, aPoint.X);
  152.                     aLayer.EditCellValue("纬度", shapeNum, aPoint.Y);
  153.                     aLayer.EditCellValue("强度", shapeNum, tmpStrike.Intensity);
  154.                     aLayer.EditCellValue("陡度", shapeNum, tmpStrike.Slope);
  155.                     aLayer.EditCellValue("误差", shapeNum, tmpStrike.Error);
  156.                     aLayer.EditCellValue("探测方式", shapeNum, tmpStrike.LocationMode);
  157.                 }
  158.             }

  159.             //Add layer
  160.             targetLayerLegend.ActiveMapFrame.AddLayer(aLayer);
  161.             targetLayerLegend.ActiveMapFrame.MapView.PaintLayers();
  162.             targetLayerLegend.Refresh();
  163.         }
  164.         #endregion


  165.         /// <summary>
  166.         /// 绘制闪电图层,需要strikesSourceNegative, strikesSourcePositive
  167.         /// </summary>
  168.         public void DrawStrikes()
  169.         {
  170.             DrawStrikesSourcePositive(strikesSourcePositive);
  171.             DrawStrikesSourceNegative(strikesSourceNegative);
  172.         }

  173.     }
  174. }
复制代码
LightningStrikeLibrary.dll (13.5 KB, 下载次数: 0)
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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