public void RenderPointMap(DashboardHelper dashboardHelper, string latVar, string longVar, Brush pointColor, string timeVar, SimpleMarkerSymbol.SimpleMarkerStyle style, string description) { this.dashboardHelper = dashboardHelper; this.latVar = latVar; this.longVar = longVar; this.timeVar = timeVar; this.style = style; this.description = description; this.pointColor = (SolidColorBrush)pointColor; GraphicsLayer pointLayer = myMap.Layers[layerId.ToString()] as GraphicsLayer; if (pointLayer != null) { pointLayer.Graphics.Clear(); } else { pointLayer = new GraphicsLayer(); pointLayer.ID = layerId.ToString(); myMap.Layers.Add(pointLayer); } CustomCoordinateList coordinateList = GetCoordinates(dashboardHelper, latVar, longVar, timeVar); for (int i = 0; i < coordinateList.Coordinates.Count; i++) { ExtendedGraphic graphic = new ExtendedGraphic() { Geometry = new MapPoint(coordinateList.Coordinates[i].X, coordinateList.Coordinates[i].Y, geoReference), RecordId = coordinateList.Coordinates[i].RecordId, Symbol = MarkerSymbol }; if (coordinateList.Coordinates[i].TimeSpan.HasValue) graphic.TimeExtent = new TimeExtent(coordinateList.Coordinates[i].TimeSpan.Value); else graphic.TimeExtent = new TimeExtent(DateTime.MinValue, DateTime.MaxValue); graphic.MouseLeftButtonUp += new MouseButtonEventHandler(graphic_MouseLeftButtonUp); pointLayer.Graphics.Add(graphic); } if (LegendStackPanel == null) { LegendStackPanel = new StackPanel(); } LegendStackPanel.Children.Clear(); if (!string.IsNullOrEmpty(description)) { System.Windows.Controls.ListBox legendList = new System.Windows.Controls.ListBox(); legendList.Margin = new Thickness(5); legendList.Background = Brushes.White;// new LinearGradientBrush(Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF), Color.FromArgb(0x7F, 0xFF, 0xFF, 0xFF), 45); legendList.BorderBrush = Brushes.Black; legendList.BorderThickness = new Thickness(3); //LegendTitle.Text = thematicItem.Description; TextBlock classTextBlock = new TextBlock(); classTextBlock.Text = " " + description; classTextBlock.FontSize = 15; TextBlock symbolTextBlock = new TextBlock(); switch (style) { case SimpleMarkerSymbol.SimpleMarkerStyle.Circle: symbolTextBlock.Text = "●"; symbolTextBlock.FontSize = 18; break; case SimpleMarkerSymbol.SimpleMarkerStyle.Cross: symbolTextBlock.Text = "+"; symbolTextBlock.FontSize = 18; symbolTextBlock.FontWeight = FontWeights.Bold; break; case SimpleMarkerSymbol.SimpleMarkerStyle.Diamond: symbolTextBlock.Text = "♦"; symbolTextBlock.FontSize = 17; break; case SimpleMarkerSymbol.SimpleMarkerStyle.Square: symbolTextBlock.Text = "■"; symbolTextBlock.FontSize = 16; break; case SimpleMarkerSymbol.SimpleMarkerStyle.Triangle: symbolTextBlock.Text = "▲"; symbolTextBlock.FontSize = 16; break; default: symbolTextBlock.Text = "▲"; symbolTextBlock.FontSize = 16; break; } symbolTextBlock.Foreground = this.pointColor; StackPanel classStackPanel = new StackPanel(); classStackPanel.Orientation = System.Windows.Controls.Orientation.Horizontal; classStackPanel.Children.Add(symbolTextBlock); classStackPanel.Children.Add(classTextBlock); legendList.Items.Add(classStackPanel); LegendStackPanel.Children.Add(legendList); } if (coordinateList.Coordinates.Count > 0) { myMap.Extent = new Envelope(ESRI.ArcGIS.Client.Bing.Transform.GeographicToWebMercator(new MapPoint(minX - 0.01, minY - 0.01, geoReference)), ESRI.ArcGIS.Client.Bing.Transform.GeographicToWebMercator(new MapPoint(maxX + 0.01, maxY + 0.01, geoReference))); if (!string.IsNullOrEmpty(timeVar)) { if (minTime != null && maxTime != null) { intervalCounts = new List<KeyValuePair<DateTime, int>>(); DateTime previousInterval = DateTime.MinValue; IEnumerable<DateTime> intervals = TimeSlider.CreateTimeStopsByTimeInterval(new TimeExtent(minTime, maxTime), new TimeSpan(1, 0, 0, 0)); foreach (DateTime interval in intervals) { int count = pointLayer.Graphics.Count(x => x.TimeExtent.Start <= interval && x.TimeExtent.Start >= previousInterval); intervalCounts.Add(new KeyValuePair<DateTime, int>(interval.Date, count)); previousInterval = interval; } if (DateRangeDefined != null) { DateRangeDefined(minTime, maxTime, intervalCounts); } } } } }
public void SetShapeRangeValues(DashboardHelper dashboardHelper, string shapeKey, string dataKey, string valueField, Color dotColor, int dotValue) { try { this.dotValue = dotValue; this.dashboardHelper = dashboardHelper; this.shapeKey = shapeKey; this.dataKey = dataKey; this.valueField = valueField; this.dotColor = dotColor; List<string> columnNames = new List<string>(); if (dashboardHelper.IsUsingEpiProject) { columnNames.Add("UniqueKey"); } columnNames.Add(valueField); columnNames.Add(dataKey); DataTable loadedData; if (valueField.Equals("{Record Count}")) { GadgetParameters gadgetOptions = new GadgetParameters(); gadgetOptions.MainVariableName = dataKey; Dictionary<string, string> inputVariableList = new Dictionary<string, string>(); inputVariableList.Add("freqvar", dataKey); inputVariableList.Add("allvalues", "false"); inputVariableList.Add("showconflimits", "false"); inputVariableList.Add("showcumulativepercent", "false"); inputVariableList.Add("includemissing", "false"); inputVariableList.Add("maxrows", "500"); gadgetOptions.InputVariableList = inputVariableList; loadedData = dashboardHelper.GenerateFrequencyTable(gadgetOptions).First().Key; foreach (DataRow dr in loadedData.Rows) { dr[0] = dr[0].ToString().Trim(); } valueField = "freq"; } else { loadedData = dashboardHelper.GenerateTable(columnNames); } GraphicsLayer graphicsLayer = myMap.Layers[layerId.ToString()] as GraphicsLayer; List<double> valueList = new List<double>(); List<Graphic> graphicsToBeAdded = new List<Graphic>(); SpatialReference geoReference = new SpatialReference(4326); for (int i = 0; i < graphicsLayer.Graphics.Count; i++) { Graphic graphicFeature = graphicsLayer.Graphics[i]; double xmin = graphicFeature.Geometry.Extent.XMin; double xmax = graphicFeature.Geometry.Extent.XMax; double ymin = graphicFeature.Geometry.Extent.YMin; double ymax = graphicFeature.Geometry.Extent.YMax; Random rnd = new Random(); string shapeValue = graphicFeature.Attributes[shapeKey].ToString().Replace("'", "''").Trim(); string filterExpression = ""; if (dataKey.Contains(" ") || dataKey.Contains("$") || dataKey.Contains("#")) filterExpression += "["; filterExpression += dataKey; if (dataKey.Contains(" ") || dataKey.Contains("$") || dataKey.Contains("#")) filterExpression += "]"; filterExpression += " = '" + shapeValue + "'"; double graphicValue = Double.PositiveInfinity; try { graphicValue = Convert.ToDouble(loadedData.Select(filterExpression)[0][valueField]); for (int counter = 0; counter < graphicValue; counter += dotValue) { bool pointInGraphic = false; ExtendedGraphic graphic = new ExtendedGraphic(); while (!pointInGraphic) { double rndX = xmin + (rnd.NextDouble() * (xmax - xmin)); double rndY = ymin + (rnd.NextDouble() * (ymax - ymin)); graphic.Geometry = new MapPoint(rndX, rndY, geoReference); graphic.Symbol = MarkerSymbol; bool foundBottomLeft = false; bool foundBottomRight = false; bool foundTopLeft = false; bool foundTopRight = false; foreach (ESRI.ArcGIS.Client.Geometry.PointCollection pc in ((ESRI.ArcGIS.Client.Geometry.Polygon)graphicFeature.Geometry).Rings) { foundBottomLeft = pc.Any((point) => point.Y <= ((MapPoint)graphic.Geometry).Y && point.X <= ((MapPoint)graphic.Geometry).X); foundBottomRight = pc.Any((point) => point.Y <= ((MapPoint)graphic.Geometry).Y && point.X >= ((MapPoint)graphic.Geometry).X); foundTopLeft = pc.Any((point) => point.Y >= ((MapPoint)graphic.Geometry).Y && point.X <= ((MapPoint)graphic.Geometry).X); foundTopRight = pc.Any((point) => point.Y >= ((MapPoint)graphic.Geometry).Y && point.X >= ((MapPoint)graphic.Geometry).X); if (foundBottomLeft && foundBottomRight && foundTopLeft && foundTopRight) { try { MapPoint firstBottomLeft = pc.First((point) => point.Y <= ((MapPoint)graphic.Geometry).Y && point.X <= ((MapPoint)graphic.Geometry).X); MapPoint firstBottomRight = pc.First((point) => point.Y <= ((MapPoint)graphic.Geometry).Y && point.X >= ((MapPoint)graphic.Geometry).X); MapPoint firstTopLeft = pc.First((point) => point.Y >= ((MapPoint)graphic.Geometry).Y && point.X <= ((MapPoint)graphic.Geometry).X); MapPoint firstTopRight = pc.First((point) => point.Y >= ((MapPoint)graphic.Geometry).Y && point.X >= ((MapPoint)graphic.Geometry).X); int indexBL = pc.IndexOf(firstBottomLeft); int indexBR = pc.IndexOf(firstBottomRight); int indexTL = pc.IndexOf(firstTopLeft); int indexTR = pc.IndexOf(firstTopRight); MapPoint lastBottomLeft = pc.Last((point) => point.Y <= ((MapPoint)graphic.Geometry).Y && point.X <= ((MapPoint)graphic.Geometry).X); MapPoint lastBottomRight = pc.Last((point) => point.Y <= ((MapPoint)graphic.Geometry).Y && point.X >= ((MapPoint)graphic.Geometry).X); MapPoint lastTopLeft = pc.Last((point) => point.Y >= ((MapPoint)graphic.Geometry).Y && point.X <= ((MapPoint)graphic.Geometry).X); MapPoint lastTopRight = pc.Last((point) => point.Y >= ((MapPoint)graphic.Geometry).Y && point.X >= ((MapPoint)graphic.Geometry).X); int indexBL2 = pc.IndexOf(lastBottomLeft); int indexBR2 = pc.IndexOf(lastBottomRight); int indexTL2 = pc.IndexOf(lastTopLeft); int indexTR2 = pc.IndexOf(lastTopRight); if ((Math.Abs(indexTL - indexTR2) == 1 && Math.Abs(indexTR - indexBR2) == 1) || (Math.Abs(indexBL - indexTL2) == 1 && Math.Abs(indexTL - indexTR2) == 1) || (Math.Abs(indexBR - indexBL2) == 1 && Math.Abs(indexTR - indexBR2) == 1)) { pointInGraphic = true; break; } else if ((Math.Abs(indexBL - indexBR2) == 1 && Math.Abs(indexTL - indexBL2) == 1) || (Math.Abs(indexTL - indexBL2) == 1 && Math.Abs(indexTR - indexTL2) == 1) || (Math.Abs(indexBR - indexTR2) == 1 && Math.Abs(indexTR - indexTL2) == 1)) { pointInGraphic = true; break; } } catch (Exception ex) { pointInGraphic = false; } } } } graphicsToBeAdded.Add(graphic); } } catch (Exception ex) { graphicValue = Double.PositiveInfinity; } } foreach (Graphic g in graphicsLayer.Graphics) { SimpleFillSymbol symbol = new SimpleFillSymbol() { Fill = new SolidColorBrush(Colors.Transparent), BorderBrush = new SolidColorBrush(Colors.Black), BorderThickness = 1 }; g.Symbol = symbol; } GraphicsLayer dotLayer = myMap.Layers[layerId.ToString() + "_dotLayer"] as GraphicsLayer; int currentDotIndex = myMap.Layers.Count; if (dotLayer != null) { currentDotIndex = myMap.Layers.IndexOf(dotLayer); myMap.Layers.Remove(dotLayer); } dotLayer = new GraphicsLayer(); dotLayer.ID = layerId.ToString() + "_dotLayer"; myMap.Layers.Insert(currentDotIndex, dotLayer); foreach (Graphic g in graphicsToBeAdded) { dotLayer.Graphics.Add(g); } } catch (Exception ex) { } }
public void RenderClusterMap(DashboardHelper dashboardHelper, string latVar, string longVar, Brush clusterColor, string timeVar, string description) { this.dashboardHelper = dashboardHelper; this.latVar = latVar; this.longVar = longVar; this.timeVar = timeVar; this.description = description; this.clusterColor = (SolidColorBrush)clusterColor; GraphicsLayer clusterLayer = myMap.Layers[layerId.ToString()] as GraphicsLayer; if (clusterLayer != null) { clusterLayer.Graphics.Clear(); } else { clusterLayer = new GraphicsLayer(); clusterLayer.ID = layerId.ToString(); myMap.Layers.Add(clusterLayer); } CustomCoordinateList coordinateList = GetCoordinates(dashboardHelper, latVar, longVar, timeVar); for (int i = 0; i < coordinateList.Coordinates.Count; i++) { ExtendedGraphic graphic = new ExtendedGraphic() { Geometry = new MapPoint(coordinateList.Coordinates[i].X, coordinateList.Coordinates[i].Y, geoReference), RecordId = coordinateList.Coordinates[i].RecordId, Symbol = MarkerSymbol }; if (coordinateList.Coordinates[i].TimeSpan.HasValue) graphic.TimeExtent = new TimeExtent(coordinateList.Coordinates[i].TimeSpan.Value); else graphic.TimeExtent = new TimeExtent(DateTime.MinValue, DateTime.MaxValue); graphic.MouseLeftButtonUp += new MouseButtonEventHandler(graphic_MouseLeftButtonUp); clusterLayer.Graphics.Add(graphic); } Brush flareForeground; if (System.Drawing.Color.FromArgb(this.clusterColor.Color.A, this.clusterColor.Color.R, this.clusterColor.Color.G, this.clusterColor.Color.B).GetBrightness() > 0.5) { flareForeground = new SolidColorBrush(Colors.Black); } else { flareForeground = new SolidColorBrush(Colors.White); } FlareClusterer clusterer = new FlareClusterer() { FlareBackground = clusterColor, FlareForeground = flareForeground, MaximumFlareCount = 10, Radius = 15, Gradient = ClustererGradient }; clusterLayer.Clusterer = clusterer; if (LegendStackPanel == null) { LegendStackPanel = new StackPanel(); } LegendStackPanel.Children.Clear(); if (!string.IsNullOrEmpty(description)) { System.Windows.Controls.ListBox legendList = new System.Windows.Controls.ListBox(); legendList.Margin = new Thickness(5); legendList.Background = Brushes.White;// new LinearGradientBrush(Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF), Color.FromArgb(0x7F, 0xFF, 0xFF, 0xFF), 45); legendList.BorderBrush = Brushes.Black; legendList.BorderThickness = new Thickness(3); //LegendTitle.Text = thematicItem.Description; TextBlock classTextBlock = new TextBlock(); classTextBlock.Text = " " + description; classTextBlock.FontSize = 15; Ellipse circle = new Ellipse(); circle.Width = 14; circle.Height = 14; circle.Fill = this.clusterColor; StackPanel classStackPanel = new StackPanel(); classStackPanel.Orientation = System.Windows.Controls.Orientation.Horizontal; classStackPanel.Children.Add(circle); classStackPanel.Children.Add(classTextBlock); legendList.Items.Add(classStackPanel); LegendStackPanel.Children.Add(legendList); } if (coordinateList.Coordinates.Count > 0) { myMap.Extent = new Envelope(ESRI.ArcGIS.Client.Bing.Transform.GeographicToWebMercator(new MapPoint(minX - 0.01, minY - 0.01, geoReference)), ESRI.ArcGIS.Client.Bing.Transform.GeographicToWebMercator(new MapPoint(maxX + 0.01, maxY + 0.01, geoReference))); if (!string.IsNullOrEmpty(timeVar)) { if (minTime != null && maxTime != null) { intervalCounts = new List<KeyValuePair<DateTime, int>>(); DateTime previousInterval = DateTime.MinValue; IEnumerable<DateTime> intervals = TimeSlider.CreateTimeStopsByTimeInterval(new TimeExtent(minTime, maxTime), new TimeSpan(1, 0, 0, 0)); foreach (DateTime interval in intervals) { int count = clusterLayer.Graphics.Count(x => x.TimeExtent.Start <= interval && x.TimeExtent.Start >= previousInterval); intervalCounts.Add(new KeyValuePair<DateTime, int>(interval.Date, count)); previousInterval = interval; } if (DateRangeDefined != null) { DateRangeDefined(minTime, maxTime, intervalCounts); } } } } }