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)自定义专题图所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)