分享

ArcGIS API for Silverlight 绘制降雨路径动画

 牛人的尾巴 2016-04-11
  • #region 降雨动画演示 2014-04-16  
  •   
  • List<Graphic> graphics = new List<Graphic>();  
  • int INDEX = 0;  
  • MapPoint GLOBAL = new MapPoint(); //保存上一次绘制降雨圈的点信息 2014-04-16   
  • int INDEX_2 = 0; //控制是否是第一次绘制降雨圈  
  •   
  • /// <summary>  
  • /// 从数据库获取数据,并绘制圆  
  • /// </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; //时间  
  •         graphic.Attributes["RainV"] = item.CDRP; //雨量站名称  
  •         graphic.Attributes["CDNUM"] = item.CDNUM; //降雨站数  
  •         graphic.Attributes["LGTD"] = item.LGTD; //经度  
  •         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">要绘制的点</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>  
  • /// 绘制点  
  • /// </summary>  
  • public void DrawPoint(MapPoint mp,Graphic g)  
  • {  
  •     GraphicsLayer graphicsLayer = myMap.Layers["YLPointsLayer"] as GraphicsLayer;  
  •   
  •     GraphicsLayer graphicsLayerText = myMap.Layers["GraphicsLayerRed"] as GraphicsLayer;  
  •   
  •     //动态标记点元素  
  •     Graphic graphic = new Graphic()  
  •     {  
  •         Geometry = mp,  
  •         Symbol = LayoutRoot.Resources["BlueMarkerSymbol"] as Symbol  
  •     };  
  •     graphicsLayer.Graphics.Add(graphic);  
  •   
  •     //动态标记数值  
  •     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>  
  • /// 绘制每小时降雨圈  
  • /// </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的值,这样经纬度坐标没有值的也被过滤掉  
  •     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");  
  •         }  
  •         //第一步:绘制降雨点  
  •         DrawPoint(WKIDConvert.lonlat2mercator(new MapPoint(Convert.ToDouble(tipGraphic.Attributes["LGTD"]),  
  •             Convert.ToDouble(tipGraphic.Attributes["LTTD"]))), tipGraphic);  
  •   
  •         //第二步:绘制站点连接线  
  •         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(); // 先绘点并保存数据  
  •     double d = 1;  
  •     try  
  •     {  
  •         d = double.Parse(this.tbSecond.Text.Trim());  
  •     }  
  •     catch (Exception)  
  •     {  
  •         MessageBox.Show("请输入数字!");  
  •     }  
  •     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(); //动画过程停止  
  •         }  
  •     }  
  •     catch (Exception ex)  
  •     {  
  •         return;  
  •     }  
  • }  
  •  
  • #endregion  
    • 本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
      转藏 分享 献花(0

      0条评论

      发表

      请遵守用户 评论公约

      类似文章 更多