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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArcGIS API for Silverlight 绘制降雨路径动画相关的知识,希望对你有一定的参考价值。

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

技术分享

        #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




以上是关于ArcGIS API for Silverlight 绘制降雨路径动画的主要内容,如果未能解决你的问题,请参考以下文章

无法从 ArcGIS API for Python 检索 ArcGIS 角色

arcgis api for javascript怎么加载天地图的影像图

arcgis api for javascript中怎么获取当前地图的大小

ArcGIS API For Android Errors汇总

arcgis api for javascript 4.10版本的本地部署

如何利用arcgis api for javascript在graphicslayer绘制点线面