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,0"" FontWeight=""Bold"" Foreground=""#99000000"" /> <TextBlock Text=""{Binding Attributes[Count]}"" FontSize=""9"" Margin=""0,0,1,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); } }