爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5965|回复: 11

LabelSet有办法设置字符的角度么

[复制链接]

新浪微博达人勋

发表于 2013-3-12 12:43:33 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 tinysand 于 2013-3-12 12:46 编辑

王老师,可以给LabelSet加一个角度设置的接口么,这样就可以实现自定义站点的填图渲染了。目前,采用meteoinfo可以实现自定义数据的line.polygon,raster显示渲染,站点的填图有好的方法么?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-12 13:56:18 | 显示全部楼层
你想实现什么样的效果,不妨给个示意图说明一下
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-12 19:45:57 | 显示全部楼层
因为开发电脑在单位,不方便传图,就是相当于王老大您软件里这种类型的站点填图。不过站点的数据格式并不标准,填写规范也不一样。今天在看meteoinfo的帮助和示例程序时,突发奇想,可以用LabelSet来实现我想要的站点填图。风向天气现象和云状等可以用特殊字体,也作为label加上去,不过风向杆要旋转角度,labelset没法旋转,所以想让您指导下。

未命名.JPG
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-14 13:16:45 | 显示全部楼层
现在用LabelSet实现了下面的效果,但是风向杆没有办法变方向。还有一个办法是再单独加一个风向杆的图层,但那样就不地道了
Snap1.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-14 13:39:24 | 显示全部楼层

你的风向杆是用什么画的?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-14 18:39:17 | 显示全部楼层
风向杆、云量都是当作一个 LabelSet加上去的(采用特殊字体),但由于LabelSet没有办法设置角度,所以风向杆还不能转方向。王老师要是能把LabelSet加一个Angle属性上去,就可以实现自定义的站点填图了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-14 19:05:52 | 显示全部楼层
本帖最后由 tinysand 于 2013-3-14 19:09 编辑

就是根据王老师您的示例代码改的。

            //Add shape
            for (int i = 0; i < iNum; i++)
            {
                PointShape aPS = new PointShape();
                PointD aPoint = new PointD();
                aPoint.X = X;
                aPoint.Y = Y;
                aPS.Point = aPoint;
                int shapeNum = aLayer.ShapeNum;
                if (aLayer.EditInsertShape(aPS, shapeNum))
                {
                    //Edit record value
                    aLayer.EditCellValue("STATION", shapeNum, sName;4.
                    aLayer.EditCellValue("LON", shapeNum, aPoint.X);
                    aLayer.EditCellValue("LAT", shapeNum, aPoint.Y);
                    aLayer.EditCellValue("WindSpeed", shapeNum, WindSpeed);
                }
            }

            //Add Label
            aLayer.LabelSet.FieldName = "WindSpeed";
            aLayer.LabelSet.LabelFont = new Font("Winds", 15);
            aLayer.AddLabels();
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-14 21:06:43 | 显示全部楼层
本帖最后由 MeteoInfo 于 2013-3-14 21:10 编辑
tinysand 发表于 2013-3-14 18:39
风向杆、云量都是当作一个 LabelSet加上去的(采用特殊字体),但由于LabelSet没有办法设置角度,所以风向杆 ...

LabelSet加一个Angle属性也没用,AddLabels时所有标注都会是一个角度。实际上AddLables以后每个标注l都在VectorLayer的LablePoints里了,标注其实是Graphic类,里面有坐标和图例,图例是LabelBreak类,是有角度属性的,也就是说可以设置不同的角度,在MeteoInfo桌面软件里标注可以被选中,双击后会出现标注的属性设置,里面有角度的设置。有角度是一回事,但是你的这个思路做起来很麻烦。
我修改了类库,在MeteoInfoC.Data.MeteoData命名空间里增加了StationModel和StationModelData类,StationModel类里有站点号:StationIdentifer,坐标属性:Longitude, Latitude,各类气象参数属性:CloudCover, Weather, WindDirection, WindSpeed等等。StationModelData类包含了一个StationModel的列表(Data)、数据空间范围(DataExtent)以及缺测值(UNDEF)。你可以读你的数据,生成一个StationModelData对象。然后用DrawMeteoData类的public static VectorLayer CreateStationModelLayer(StationModelData smData, LegendScheme aLS, string LName, bool isSurface)方法创建站点填图图层即可。需要最新的MeteoInfo类库文件(见置顶帖子)

例如:
  1. public StationModelData GetStationModelData()
  2.         {
  3.             StationModelData smData = new StationModelData();
  4.             string aStid;
  5.             int i;
  6.             Single lon, lat;
  7.             List<string> dataList = new List<string>();
  8.             Single minX, maxX, minY, maxY;
  9.             minX = 0;
  10.             maxX = 0;
  11.             minY = 0;
  12.             maxY = 0;
  13.             StationModel sm;
  14.             for (i = 0; i < DataList.Count; i++)
  15.             {
  16.                 dataList = DataList;
  17.                 aStid = (string)dataList[0];
  18.                 lon = Convert.ToSingle(dataList[1]);
  19.                 lat = Convert.ToSingle(dataList[2]);

  20.                 sm = new StationModel(UNDEF);
  21.                 sm.StationIdentifer = aStid;
  22.                 sm.Longitude = lon;
  23.                 sm.Latitude = lat;
  24.                 sm.WindDirection = Convert.ToDouble(dataList[8]);    //Wind direction
  25.                 sm.WindSpeed = Convert.ToDouble(dataList[9]);    //Wind speed
  26.                 //sm.Visibility = UNDEF;    //Visibility
  27.                 //sm.Weather = UNDEF;    //Weather
  28.                 sm.CloudCover = 1;    //Cloud cover
  29.                 sm.Temperature = Convert.ToDouble(dataList[6]);    //Temperature
  30.                 double ddp = double.Parse(dataList[7]);
  31.                 sm.DewPoint = sm.Temperature - ddp;    //Dew point
  32.                 sm.Pressure = double.Parse(dataList[5]);    //Pressure

  33.                 smData.Data.Add(sm);

  34.                 if (i == 0)
  35.                 {
  36.                     minX = lon;
  37.                     maxX = minX;
  38.                     minY = lat;
  39.                     maxY = minY;
  40.                 }
  41.                 else
  42.                 {
  43.                     if (minX > lon)
  44.                     {
  45.                         minX = lon;
  46.                     }
  47.                     else if (maxX < lon)
  48.                     {
  49.                         maxX = lon;
  50.                     }
  51.                     if (minY > lat)
  52.                     {
  53.                         minY = lat;
  54.                     }
  55.                     else if (maxY < lat)
  56.                     {
  57.                         maxY = lat;
  58.                     }
  59.                 }
  60.             }
  61.             Extent dataExtent = new Extent();
  62.             dataExtent.minX = minX;
  63.             dataExtent.maxX = maxX;
  64.             dataExtent.minY = minY;
  65.             dataExtent.maxY = maxY;
  66.             smData.DataExtent = dataExtent;
  67.             smData.UNDEF = UNDEF;

  68.             return smData;
  69.         }

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

新浪微博达人勋

 楼主| 发表于 2013-3-14 23:14:11 | 显示全部楼层
谢谢王老师的详细解答,我去做做看。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-3-16 08:05:53 | 显示全部楼层
可以用自定义的数据格式显示填图了,但还是达不到我想要的效果。我们的填图规范不一样,比如温度要带小数点,还要填写云状等。不过可以用两个图层一起实现我想要的效果,一个专门显示风杆,一个显示其余。另外,问下王老,显示点图层时,怎么样实现放大到某个级别时,只显示某些特定站的点(不是采用AvoidCollision属性),点图层的属性中有站点级别这一属性。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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