ArcGIS API for Silverlight 点沿着线流动

原文:ArcGIS API for Silverlight 点沿着线流动

概述

前段时间做了一个项目,要求是有一些电力输送线,电力输送线或者石油管道都是有流动方向的,用户想做一个动态效果来模拟电力的输送。其实做简单了只要在线上标识个箭头就可以了。但也要是做成动态的,至少ArcEngine实现起来是有点麻烦的。但ArcGIS API for Silverlight可以解决这个问题。

实现思路

在地图上展示输送电力的线和模拟电力输送方向的电都是ArcGIS  API中定义的对象,否者这些数据在地图上就不好展示了。那么怎么让点沿着线动起来呢?要使用Timer吗?然后没间隔0.1秒就算一下点应该在的位置?这是最原始的办法,相信在比较早期的时候,我们使用ArcEngine做跟踪会回放的时候都采用这种方式。但现在我们用的API是基于Silverlight的,Silverlight自身是有动画模块的,我们可以借助Silverlight的动画来实现。

Silverlight动画针对的对象都是Silverligt中定义的点、线或其他对象,这是我们还需要转换,需要在动画播放的时候,把获取的点转换成ArcGIS API中对象能识别的点。

能解决以上问题,解决方案就差不多了。

实现

首先,我们要定义动画,Silverlight中定义的动画类型有很多种,我们使用PointAnimationUsingPath类,通过其名称也能看到该类的作用。基于线的点动画。

通过查看该类的定义,我们知道使用该类时需要定义好一段路径,设置走完这段路经需要多长时间以及是不是循环播放。

下面的代码我们就定义路径,我们是先知道的ArcGIS中的线对象,再转换成动画中的路径对象,代码如下:

 Point myStartPoint=new Point (this._ELine.StartPoint.Point.X,this._ELine.StartPoint.Point.Y);
 List<PathSegment> myPathSegmentList=new List<PathSegment> ();
 foreach(ESRI.ArcGIS.Client.Geometry.PointCollection myPointCollection in this._ELine.Line.Paths)
 {
    List<Point> myPointList=new List<Point> ();
    foreach(ESRI.ArcGIS.Client.Geometry.MapPoint myMapPoint in myPointCollection)
    {
       myPointList.Add (new Point (myMapPoint.X,myMapPoint.Y));
     }
     PolyLineSegment myPolyLineSegment=new PolyLineSegment(myPointList,false);
     myPathSegmentList.Add (myPolyLineSegment);
 }

定义还是挺麻烦的,但代码一看就明白,下面我们就动画对象

PointAnimationUsingPath myPointAnimationUsingPath = new PointAnimationUsingPath();
List<PathFigure> myPathFigureList=new List<PathFigure> ();
myPathFigureList.Add(new PathFigure (myStartPoint,myPathSegmentList,false));
myPointAnimationUsingPath.PathGeometry = new PathGeometry(myPathFigureList);//设置路径
myPointAnimationUsingPath.Duration = new Duration(TimeSpan.FromSeconds(5));//设置走完路径需要的时间
myPointAnimationUsingPath.RepeatBehavior = RepeatBehavior.Forever;//循环播放

下面我们就定义要运动的点和画板:

this._ArrowGraphic = new ArrowGraphic();//定义我们要运动的点对象
this._ArrowGraphic.SetZIndex((int)GraphicZIndex.ELineArrow);//显示在最上面
this._ArrowGraphic.Geometry = new ESRI.ArcGIS.Client.Geometry.MapPoint(0, 0);//设置起始位置
this._application.GraphicsLayer.Graphics.Add(this._ArrowGraphic);//添加到地图上

this._Storyboard = new Storyboard();//定义画板
this._Storyboard.Children.Add(myPointAnimationUsingPath);//把动画加到画板上
Storyboard.SetTarget(this._Storyboard, this._ArrowGraphic);//关联画板和要运行的对象
Storyboard.SetTargetProperty(myPointAnimationUsingPath, new PropertyPath(ArrowGraphic.PointProperty));//关联动画对象和运动点的一个属性

this._Storyboard.Begin();//启动动画

通过查看PointAnimationUsingPath类的API我们可以知道,该动画的输出是一个System.Windows.Point类型的对象,我们必须要把这个对象转换成ArcGIS API的对象能识别的几何体才可以,所以我们就自定义了上面实例化的ArrowGraphic对象,ArrowGraphic是继承ArcGIS API 中的Graphic类的一个对象。定义如下:

public class ArrowGraphic:Graphic
{
    public Point Point
    {
        get { return (Point)GetValue(PointProperty); }
        set { SetValue(PointProperty, value); }
    }

    public static readonly DependencyProperty PointProperty = DependencyProperty.Register
        ("Point", typeof(Point), typeof(ArrowGraphic), new FrameworkPropertyMetadata(OnPointChanged));
    public static void OnPointChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ArrowGraphic myArrowGraphic = d as ArrowGraphic;
        MapPoint myMapPoint = new MapPoint(myArrowGraphic.Point.X,myArrowGraphic.Point.Y);
        myArrowGraphic.Geometry = myMapPoint;
    }

    public ArrowGraphic()
    {
        SimpleMarkerSymbol myMarkerSymbol = new SimpleMarkerSymbol();
        myMarkerSymbol.Size = 10;
        myMarkerSymbol.Style = SimpleMarkerSymbol.SimpleMarkerStyle.Circle;
        myMarkerSymbol.Color = System.Windows.Media.Brushes.Green;
        this.Symbol = myMarkerSymbol;
    }
}

该对象的作用很简单,就是通过PointProperty把Silverlight的Point转换成ArcGIS API中的Mappoint,然后赋值给该Graphic,这样随着动画的播放,Graphic的Geometry就会不断发生变化,这样Graphic就可以沿着线移动了。

至于我们自定义的Graphic如何显示,是点、图片还是其他就需要自己定义了。

例如我们想显示成箭头,箭头是有方向的,怎么控制箭头的方向呢?那就获取到一个点后,当PointProperty获取到一个新值后,就可以和上一个值进行角度计算,然后再给Geometry赋值就可以了。

下面是展示效果:

图片中的线上的几个绿色的点是一直沿着线动的,实在不会做jpg动画,只能贴一张静态图片了。

时间: 2024-10-14 19:38:59

ArcGIS API for Silverlight 点沿着线流动的相关文章

ArcGIS API for Silverlight 地图元素点闪烁,线流动显示的处理方式

原文:ArcGIS API for Silverlight 地图元素点闪烁,线流动显示的处理方式 <Grid x:Name="LayoutRoot" Background="White"> <!--地图资源样式模版--> <Grid.Resources> <!--预警闪烁标记符号--> <esri:MarkerSymbol x:Name="DefaultMarkerSymbol"> &l

ArcGIS API for Silverlight实现地图测距功能

原文:ArcGIS API for Silverlight实现地图测距功能 问题:如何实现地图测距功能? 地图工具栏 <Grid x:Name="gToolMenu" Height="100" VerticalAlignment="Top" Opacity="0.8" HorizontalAlignment="Right" Width="467"> <Rectangle

使用ArcGIS API for Silverlight + Visifire绘制地图统计图

原文:使用ArcGIS API for Silverlight + Visifire绘制地图统计图 最近把很久之前做的统计图又拿出来重新做了一遍,感觉很多时候不复习,不记录就真的忘了,时间是最好的稀释剂,真是这样. 恰好有些网友又向我问起,于是稍作记录,以便自己今后复习和参考. 本文示例用的版本为: Silverlight 5+Visifire 3.6.8+ArcGIS API for Silverlight 3.0+Visual Studio 2010 一.ArcGIS API For Sil

ArcGIS API for Silverlight 编辑Geometry

概述 ArcMap的编辑功能是很强大的,ArcEngine编写的CS程序也能够用到ArcMap中提供的编辑功能,那么ArcGIS API forSilverlight针对Geometry的编辑提供了哪些功能呢? 本文说的只是对Geometry本身的编辑,并不涉及到编辑时的拓扑检查,编辑的数据源等.对于BS程序来说,能够方便的编辑Geometry基本上就满足大部分需求了. ArcGIS Runtime API支持的几何体主要是点.线和面. 还有要注意的一点,如果在BS上要编辑ArcServer上发

ArcGIS API for Silverlight 学习笔记

这里主要讲解展示不同的服务地图 先看一个实例: 新建一个Silverlight项目,在MainPage.xaml文件中,引入 ESRI.ArcGIS.Client 命名空间和 ESRI.ArcGIS.Client 所在的程序集 ESRI.ArcGIS.Client,并指定 该命名空间的名字为 esri,当然你也可以用自己的别名,比如myGIS. 接着写Map控件,并指定Map中的地图服务,一个简单的服务地图完成了,代码如下: <UserControl x:Class="ArcGISTile

ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试

原文:ArcGIS API for Silverlight 调用GP服务准备---GP模型建立.发布.测试 第一篇.GP降雨量等值线建模.发布及测试 在水利.气象等行业中,要在WebGIS中实现空间分析功能,如绘制等值线.等高线.等直面.缓冲区等都是经常遇到,经过一段时间的学习和研究,查阅ESRI文档,请教他人,终于可以说是初步实现了等值线功能,这里记录下来详细的操作步骤和图片说明,一方面是对此次努力的总结,另一方面希望也能给后来用到这方面的其他同志们,起个抛砖引玉的作用. 下一篇是关于Silv

ArcGIS API for Silverlight中加载Google地形图(瓦片图)

原文:ArcGIS API for Silverlight中加载Google地形图(瓦片图) 在做水利.气象.土地等行业中,若能使用到Google的地形图那是再合适不过了,下面就介绍如何在ArcGIS API for Silverlight中加载Google地 形图.先上一个图,初步制作,待后续继续改进 ArcGIS API for Silverlight 中的ArcGISTiledMapServiceLayer图层,继承自TiledMapServiceLayer.如果想实现自己的缓存地图图 层

创建第一个ArcGIS API for Silverlight应用

原文:创建第一个ArcGIS API for Silverlight应用 在完成前面的开发环境搭建以后,接下来实现我们的第一个ArcGIS API forSilverlight应用程序. 接下来我们一步一步来操作: 1.  打开Visual Studio2010,创建一个Silverlight应用项目及一个宿主的Web网站,如下图: 2.创建好的应用程序结构如下,包括一个Silverlight应用和一个宿主的Web项目. 3.接着右键点击Silverlight项目中的引用,选择添加引用,如下图:

ArcGIS API for Silverlight 实现修改地图上的工程点位置

原文:ArcGIS API for Silverlight 实现修改地图上的工程点位置 #region 处理工程点点击编辑相关事件 public Graphic editgraphics = null; //待编辑的Graphics图层 public Graphic oldgraphics = null; //原先Graphics图层 public Symbol symbolold = null; /// <summary> /// 在地图上点击编辑点处理事件 /// </summary