#region 降雨動(dòng)畫演示 2014-04-16 List<Graphic> graphics = new List<Graphic>(); int INDEX = 0; MapPoint GLOBAL = new MapPoint(); //保存上一次繪制降雨圈的點(diǎn)信息 2014-04-16 int INDEX_2 = 0; //控制是否是第一次繪制降雨圈 /// <summary> /// 從數(shù)據(jù)庫獲取數(shù)據(jù),并繪制圓 /// </summary> public void DrawRainEllipseFromDatabase() { getMapDataSoapClient client = new getMapDataSoapClient(); client.getJYDataByTimeSpanCompleted += new EventHandler<getJYDataByTimeSpanCompletedEventArgs>(client_getJYDataByTimeSpanCompleted); client.getJYDataByTimeSpanAsync("2014-04-08", "2014-04-11"); } void client_getJYDataByTimeSpanCompleted(object sender, getJYDataByTimeSpanCompletedEventArgs e) { //GraphicsLayer graphicsLayer = myMap.Layers["YLPointsLayer"] as GraphicsLayer; //graphicsLayer.ClearGraphics(); ObservableCollection<JYDW> rets = e.Result; Graphic graphic; foreach (JYDW item in rets) { graphic = new Graphic() { Geometry = mercator.FromGeographic(new MapPoint(double.Parse(item.LGTD.ToString().Trim()), double.Parse(item.LTTD.ToString().Trim()))), Symbol = LayoutRoot.Resources["BlueMarkerSymbol"] as Symbol }; //保存屬性 graphic.Attributes["STCD"] = item.CMAXSTCD; //雨量站編碼 graphic.Attributes["TM"] = item.TM; //時(shí)間 graphic.Attributes["RainV"] = item.CDRP; //雨量站名稱 graphic.Attributes["CDNUM"] = item.CDNUM; //降雨站數(shù) graphic.Attributes["LGTD"] = item.LGTD; //經(jīng)度 graphic.Attributes["LTTD"] = item.LTTD; //緯度 graphics.Add(graphic); //graphicsLayer.Graphics.Add(graphic); } } /// <summary> /// 在地圖上繪制圓 /// </summary> /// <param name="myMap">地圖</param> /// <param name="container">繪制容器</param> /// <param name="pt">要繪制的點(diǎn)</param> /// <param name="drawCircleLayer"></param> /// <param name="circleKm">直徑</param> /// <param name="color">填充色</param> /// <param name="ellipseStroke">邊框色</param> public void DrawEllipse(Map myMap, Canvas container, MapPoint pt, ref ElementLayer drawCircleLayer, double circleKm, Color color, Color ellipseStroke) { if (!drawCircleLayer.Children.Contains(container)) { drawCircleLayer.Children.Add(container); container.Opacity = 0.7; container.SetValue(ElementLayer.EnvelopeProperty, new Envelope(myMap.Extent.XMax, myMap.Extent.YMax, myMap.Extent.XMin, myMap.Extent.YMin)); } Point ptFirst = myMap.MapToScreen(new MapPoint(Convert.ToDouble(pt.X), Convert.ToDouble(pt.Y))); Point pt7 = myMap.MapToScreen(new MapPoint((Convert.ToDouble(pt.X) + (circleKm * 1000)), Convert.ToDouble(pt.Y))); Ellipse ellipse7 = new Ellipse(); ellipse7.Width = (pt7.X - ptFirst.X)*2; ellipse7.Height = ellipse7.Width; ellipse7.StrokeThickness = 1; ellipse7.Stroke = new SolidColorBrush(ellipseStroke); ellipse7.Fill = new SolidColorBrush(color); Canvas.SetLeft(ellipse7, ptFirst.X - ellipse7.Width / 2); Canvas.SetTop(ellipse7, ptFirst.Y - ellipse7.Width / 2); ellipse7.Opacity = 0.7; container.Children.Add(ellipse7); container.IsHitTestVisible = false; container.SetValue(Canvas.ZIndexProperty, 1); GLOBAL = WKIDConvert.mercator2lonlat(ESRI.ArcGIS.Client.Geometry.Geometry.NormalizeCentralMeridian(pt) as ESRI.ArcGIS.Client.Geometry.MapPoint);//每次繪制降雨圈后,將值保存起來 } /// <summary> /// 繪制點(diǎn) /// </summary> public void DrawPoint(MapPoint mp,Graphic g) { GraphicsLayer graphicsLayer = myMap.Layers["YLPointsLayer"] as GraphicsLayer; GraphicsLayer graphicsLayerText = myMap.Layers["GraphicsLayerRed"] as GraphicsLayer; //動(dòng)態(tài)標(biāo)記點(diǎn)元素 Graphic graphic = new Graphic() { Geometry = mp, Symbol = LayoutRoot.Resources["BlueMarkerSymbol"] as Symbol }; graphicsLayer.Graphics.Add(graphic); //動(dòng)態(tài)標(biāo)記數(shù)值 TextSymbol textSymbol = new TextSymbol() { FontFamily = new System.Windows.Media.FontFamily("Microsoft YaHei"), Foreground = new System.Windows.Media.SolidColorBrush(ColorRevert.ToColor(tip_Base.DXT_COLOR)), FontSize = 16, Text = g.Attributes["RainV"].ToString(), OffsetX = 10, OffsetY = 23 }; Graphic graphicText = new Graphic() { Geometry = mp, Symbol = textSymbol }; graphicsLayerText.Graphics.Add(graphicText); } /// <summary> /// 繪制連接線 /// </summary> public void DrawLine(MapPoint gS, MapPoint gE) { List<ESRI.ArcGIS.Client.Geometry.Polyline> polylineList = new List<ESRI.ArcGIS.Client.Geometry.Polyline>(); ESRI.ArcGIS.Client.Geometry.PointCollection pointCollection = new ESRI.ArcGIS.Client.Geometry.PointCollection(); pointCollection.Add(gS); pointCollection.Add(gE); ESRI.ArcGIS.Client.Geometry.Polyline polyline = new ESRI.ArcGIS.Client.Geometry.Polyline(); polyline.Paths.Add(pointCollection); polylineList.Add(polyline); GraphicsLayer graphicsLayer = myMap.Layers["GraphicsDWLine"] as GraphicsLayer; foreach (ESRI.ArcGIS.Client.Geometry.Polyline pl in polylineList) { Graphic graphic = new Graphic() { Symbol = LayoutRoot.Resources["DefaultLineSymbol"] as Symbol, Geometry = mercator.FromGeographic(pl) }; graphicsLayer.Graphics.Add(graphic); } } /// <summary> /// 繪制每小時(shí)降雨圈 /// </summary> /// <param name="myMap"></param> /// <param name="sender"></param> public void DrawEllipseHourRainCircle(Map myMap, object sender) { INDEX_2++; if (GisMap.LayerExist(myMap, "RainAnimationLayer")) { GisMap.DeleteLayersToMap(myMap, "RainAnimationLayer"); } ElementLayer circleLayer = new ElementLayer(); circleLayer.ID = "RainAnimationLayer"; Canvas circleCanvas = new Canvas(); Graphic tipGraphic = sender as Graphic; //通過過濾為0的值,這樣經(jīng)緯度坐標(biāo)沒有值的也被過濾掉 if (Convert.ToDouble(tipGraphic.Attributes["RainV"]) != 0) { Color color = new Color(); double V = double.Parse(tipGraphic.Attributes["RainV"].ToString()); if (V < 10) { color = ColorRevert.ToColor("#FF3FC816"); } else if (V >= 10 && V < 25) { color = ColorRevert.ToColor("#FF1016FE"); } else if (V >= 25 && V < 50) { color = ColorRevert.ToColor("#FFFFEB00"); } else if (V >= 50 && V < 100) { color = ColorRevert.ToColor("#FFFF871C"); } else if (V >= 100 && V < 200) { color = ColorRevert.ToColor("#FFEB27A5"); } else if (V >= 200) { color = ColorRevert.ToColor("#FFE8353B"); } //第一步:繪制降雨點(diǎn) DrawPoint(WKIDConvert.lonlat2mercator(new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]), Convert.ToDouble(tipGraphic.Attributes["LTTD"]))), tipGraphic); //第二步:繪制站點(diǎn)連接線 if (INDEX_2 == 1) { DrawLine(new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]), Convert.ToDouble(tipGraphic.Attributes["LTTD"])), new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]), Convert.ToDouble(tipGraphic.Attributes["LTTD"]))); } else { DrawLine(GLOBAL, new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]), Convert.ToDouble(tipGraphic.Attributes["LTTD"]))); } //第三步:繪制降雨圈 this.DrawEllipse(myMap, circleCanvas, WKIDConvert.lonlat2mercator(new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]), Convert.ToDouble(tipGraphic.Attributes["LTTD"]))), ref circleLayer, Convert.ToDouble(tipGraphic.Attributes["CDNUM"]), color, color); } GisMap.AddLayersToMap(myMap, new ElementLayer[] { circleLayer }); } DispatcherTimer timer = new DispatcherTimer(); private void btnDW_Click(object sender, System.Windows.RoutedEventArgs e) { DrawRainEllipseFromDatabase(); // 先繪點(diǎn)并保存數(shù)據(jù) double d = 1; try { d = double.Parse(this.tbSecond.Text.Trim()); } catch (Exception) { MessageBox.Show("請輸入數(shù)字!"); } timer.Interval = TimeSpan.FromSeconds(d); timer.Tick += new EventHandler(timer_Tick); timer.Start(); } void timer_Tick(object sender, EventArgs e) { try { if (INDEX < graphics.Count) { DrawEllipseHourRainCircle(myMap, graphics[INDEX]); this.tb_SJ.Text = ""; this.tb_ZM.Text = ""; this.tb_YL.Text = ""; this.tb_SJ.Text = DateTime.Parse(graphics[INDEX].Attributes["TM"].ToString()).ToString("yyyy-MM-dd HH:mm"); this.tb_ZM.Text = graphics[INDEX].Attributes["STCD"].ToString().Trim(); this.tb_YL.Text = graphics[INDEX].Attributes["RainV"].ToString().Trim(); INDEX++; //自增 } else { //INDEX = 0; timer.Stop(); //動(dòng)畫過程停止 } } catch (Exception ex) { return; } } #endregion
|