ArcGIS API for Silverlight应用开发系列(1)自定义专题图

ArcGIS API for Silverlight应用开发系列(1)自定义专题图,第1张

概述ArcGIS API for Silverlight 中提供的内置专题渲染类型包括简单符号化、唯一值符号化和分级符号化,如果想要实现其他的专题类型,如饼图、柱状图、仪表盘等,则需要 通过自定义开发的方式进行扩展。 自定义专题图类型的基本思路是使用ElementLayer与图表控件(如开源的 Visifire)相结合,在 ElementLayer 的 Children集合中添加图表对象(UI元素)。

ArcGIS API for Silverlight 中提供的内置专题渲染类型包括简单符号化、唯一值符号化和分级符号化,如果想要实现其他的专题类型,如饼图、柱状图、仪表盘等,则需要@H_419_8@

通过自定义开发的方式进行扩展。 @H_419_8@

自定义专题图类型的基本思路是使用ElementLayer与图表控件(如开源的 Visifire)相结合,在 ElementLayer 的 Children集合中添加图表对象(UI元素)。@H_419_8@

实现一个专题图类型的基本思路: @H_419_8@

1) 获取专题数据(例如通过 queryTask从服务器获取) ; @H_419_8@

2) 计算要素的标注点(GeometryService 的 LablePoints 方法) ;@H_419_8@

3) 根据专题数据生成图表(调用图表控件) ; @H_419_8@

4) 将图表添加到 ElementLayer 中(计算图表的大小、位置) 。 @H_419_8@

下面将通过示例展示如何创建自定义专题图。@H_419_8@

核心代码@H_419_8@

处理专题数据查询结果 voID queryTask_ExecuteCompleted(object sender,queryEventArgs e){    // 遍历查询结果(待绘制的专题数据)        foreach (Graphic feature in e.Featureset.Features)         {                 // 计算要素的标注点                GeometryService gpLabelPoints=newGeometryService(_geoServiceUrl);         IList<Graphic> lstGraphics= new List<Graphic>();                lstGraphics.Add(feature);                gpLabelPoints.LabelPointsAsync(lstGraphics);         // 记录要素的属性(计算标注点后将失去属性)                IDictionary<string,double> dicGraphicAttr = newDictionary<string,double>();                foreach (keyvaluePair<string,object> item in feature.Attributes)                 {                 //不包含比例字段                         if (!_isIncludeScaleFIEld && _scaleFIEld != "")                        {                                  if(_scaleFIEld.Tolower() == item.Key.Tolower()) continue;                         }             string value = item.Value.ToString();                         double dValue;                         if (double.TryParse(value,outdValue))                         {                                 dicGraphicAttr.Add(item.Key,dValue);                         }                }        // 计算图表的半径                double dRadius = _radius;                if (_isUseChartScale == true)                {                        if (_scaleFIEld != "" && feature.Attributes.ContainsKey(_scaleFIEld))           {                                object ovalue =feature.Attributes[_scaleFIEld];                                if (ovalue != null)                                {                                        double dScaleValue =Convert.Todouble(ovalue);                                       dRadius = CalcRadius(dScaleValue);                                }                         }                 }         //通过Lamda表达式实现对属性的访问(LabelPoint得到的Graphics没有属性)                gpLabelPoints.LabelPointsCompleted += (object sender2,GraphicsEventArgsargs) =>                 {                         // 获取要素标注点                         MapPoint mapPoint = args.Results[0].Geometry as MapPoint;                          // 计算图表的外包矩形                         Envelope extent = newEnvelope(mapPoint.X - dRadius,mapPoint.Y - dRadius,mapPoint.X + dRadius,mapPoint.Y + dRadius);             // 创建图表                         Chart chart = newChart();                         chart.VIEw3D =_isVIEw3D;             DataSerIEs dataSerIEs = new DataSerIEs();                         dataSerIEs.RenderAs =_chartType;            // 图表类型(饼图、柱状图等)                        dataSerIEs.LabelEnabled = false;                         dataSerIEs.LabellineEnabled =false;             // 添加图表数据(如饼图的饼块、柱状图的柱条等)                         foreach(keyvaluePair<string,double> dataItem in dicGraphicAttr)                         {                  DataPoint dataPoint = newDataPoint();                   dataPoint.AxisXLabel = dataItem.Key;                   dataPoint.YValue =dataItem.Value;                   dataSerIEs.DataPoints.Add(dataPoint);               }             chart.SerIEs.Add(dataSerIEs);                // 设置其他属性                chart.Background= null;                chart.borderBrush =null;                chart.IndicatorEnabled= false;                chart.lightingEnabled = false;              ElementLayer.SetEnvelope(chart,extent);// 指定图表的外包矩形              // 将图表添加到ElementLayer中                _themeLayer.Children.Add(chart);            };        } }

下面是效果图

注:本例是使用的全国各省市的GDP产业数据以及能耗数据。

饼的大小一样(GDP产业结构)@H_419_8@

饼的大小分级(大小表示GDP总量)@H_419_8@

仪表盘专题(单位GDP能耗)@H_419_8@

篇幅所限,只贴了核心代码,如需完整代码,请在评论住留下邮箱地址。@H_419_8@

欢迎加入ArcGIS Silverlight API讨论群交流:147535735@H_419_8@

总结

以上是内存溢出为你收集整理的ArcGIS API for Silverlight应用开发系列(1)自定义专题图全部内容,希望文章能够帮你解决ArcGIS API for Silverlight应用开发系列(1)自定义专题图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1063426.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存