1、通用类
#region 多点的簇显示 public class SumClusterer : GraphicsClusterer { public SumClusterer() { MinimumColor = Colors.Red; MaximumColor = Colors.Yellow; SymbolScale = 2; base.Radius = 100; } public string AggregateColumn { get; set; } public double SymbolScale { get; set; } public Color MinimumColor { get; set; } public Color MaximumColor { get; set; } protected override Graphic OnCreateGraphic(GraphicCollection cluster,MapPoint point,int maxClusterCount) { if (cluster.Count == 1) return cluster[0]; Graphic graphic = null; double sum = 0; foreach (Graphic g in cluster) { if (g.Attributes.ContainsKey(AggregateColumn)) { try { sum += Convert.Todouble(g.Attributes[AggregateColumn]); } catch { } } } double size = (sum + 450) / 30; size = (Math.Log(sum * SymbolScale / 10) * 10 + 20); if (size < 12) size = 12; graphic = new Graphic() { Symbol = new ClusterSymbol() { Size = size },Geometry = point }; graphic.Attributes.Add("Count",sum); graphic.Attributes.Add("Size",size); graphic.Attributes.Add("Color",InterpolateColor(size - 12,100)); return graphic; } private static Brush InterpolateColor(double value,double max) { value = (int)Math.Round(value * 255.0 / max); if (value > 255) value = 255; else if (value < 0) value = 0; return new SolidColorBrush(Color.FromArgb(127,255,(byte)value,0)); } } internal class ClusterSymbol : ESRI.ArcGIS.Client.Symbols.MarkerSymbol { public ClusterSymbol() { string template = @" <ControlTemplate xmlns=""http://schemas.microsoft.com/client/2007"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" > <Grid IsHitTestVisible=""False""> <Ellipse Fill=""{Binding Attributes[Color]}"" Width=""{Binding Attributes[Size]}"" Height=""{Binding Attributes[Size]}"" /> <Grid HorizontalAlignment=""Center"" VerticalAlignment=""Center""> <TextBlock Text=""{Binding Attributes[Count]}"" FontSize=""9"" Margin=""1,1,0"" FontWeight=""Bold"" Foreground=""#99000000"" /> <TextBlock Text=""{Binding Attributes[Count]}"" FontSize=""9"" Margin=""0,1"" FontWeight=""Bold"" Foreground=""White"" /> </Grid> </Grid> </ControlTemplate>"; this.ControlTemplate = System.Windows.Markup.XamlReader.Load(template) as ControlTemplate; } public double Size { get; set; } public override double OffsetX { get { return Size / 2; } set { throw new NotSupportedException(); } } public override double OffsetY { get { return Size / 2; } set { throw new NotSupportedException(); } } } #endregion
void client_GetMonitorInfoCompleted(object sender,GetMonitorInfoCompletedEventArgs e) { ObservableCollection<MonitorInfo> list = e.Result; ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator(); Graphicslayer graphicslayer = myMap.Layers["MyGraphicslayer"] as Graphicslayer; //每次加载时先清空地图上数据 graphicslayer.Cleargraphics(); Uri uri = null; Graphic graphic = null; foreach (MonitorInfo item in list) { if (!string.IsNullOrEmpty(item.Latitute.ToString()) && !string.IsNullOrEmpty(item.Longitute.ToString())) { //有坐标值时,将该监测点添加到地图上去 graphic = new Graphic() { Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.Latitute.ToString().Trim()),double.Parse(item.Longitute.ToString().Trim()))),Symbol = LayoutRoot.Resources["DefaultMarkerSymbol"] as Symbol,}; //手动为graphic添加属性(需要用到的和数据库表之间的关联) graphic.Attributes["Id"] = item.ID; graphic.Attributes["Name"] = item.Name; graphic.Attributes["AreaID"] = item.CountyAreaID; for (int i = 0; i < areaId.Length; i++) { if (areaId[i] == item.ID.ToString()) { switch (seedlingType[i]) { case "1": uri = new Uri("Images/red.png",UriKind.Relative); break; case "2": uri = new Uri("Images/yellow.png",UriKind.Relative); break; case "3": uri = new Uri("Images/green.png",UriKind.Relative); break; case "4": uri = new Uri("Images/red.png",UriKind.Relative); break; default: break; } } } BitmapImage image = new BitmapImage(uri); //定义Symbol样式,包括填充颜色 Symbol symbol = new PictureMarkerSymbol() { OffsetX = 8,OffsetY = 8,Source = image }; graphic.Symbol = symbol; //将该Graphics添加到Graphicslayer中去 graphicslayer.Graphics.Add(graphic); //为众多的监测点提供簇聚合功能 graphicslayer.Clusterer = new SumClusterer() { AggregateColumn = "AreaID",SymbolScale = 0.008 }; //左键菜单 graphic.MouseLeftButtonDown += new MouseButtonEventHandler(Feature_MouseLeftButtonDown); graphic.MouseLeftButtonUp += new MouseButtonEventHandler(Feature_MouseLeftButtonUp); //右键菜单 graphic.MouseRightButtonDown += new MouseButtonEventHandler(Feature_MouseRightButtonDown); graphic.MouseRightButtonUp += new MouseButtonEventHandler(Feature_MouseRightButtonUp); } else { //不做任何处理,不添加任何点信息 } //坐标点聚焦 ESRI.ArcGIS.Client.Geometry.Envelope selectedFeatureExtent = graphic.Geometry.Extent; //最后一个点的位置 double expandPercentage = 30; double widthExpand = selectedFeatureExtent.Width * (expandPercentage / 100); double heightExpand = selectedFeatureExtent.Height * (expandPercentage / 100); ESRI.ArcGIS.Client.Geometry.Envelope displayExtent = new ESRI.ArcGIS.Client.Geometry.Envelope( selectedFeatureExtent.XMin - (widthExpand / 2),selectedFeatureExtent.YMin - (heightExpand / 2),selectedFeatureExtent.XMax + (widthExpand / 2),selectedFeatureExtent.YMax + (heightExpand / 2)); myMap.ZoomTo(displayExtent); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。