原文: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动画,只能贴一张静态图片了。

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

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

    原文:ArcGIS API for Silverlight 地图元素点闪烁,线流动显示的处理方式 <Grid x:Name="LayoutRoot" Background=& ...

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

    原文:ArcGIS API for Silverlight实现地图测距功能 问题:如何实现地图测距功能? 地图工具栏 <Grid x:Name="gToolMenu" Hei ...

  3. ArcGIS API for Silverlight开发入门

    你用上3G手机了吗?你可能会说,我就是喜欢用nokia1100,ABCDEFG跟我 都没关系.但你不能否认3G是一种趋势,最终我们每个人都会被包裹在3G网络中.1100也不是一成不变,没准哪天为了打击 ...

  4. 扩展ArcGIS API for Silverlight/WPF 中的TextSymbol支持角度标注

    原文 http://blog.csdn.net/esricd/article/details/7587136 在ArcGIS API for Silverlight/WPF中原版的TextSymbol ...

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

    原文:使用ArcGIS API for Silverlight + Visifire绘制地图统计图 最近把很久之前做的统计图又拿出来重新做了一遍,感觉很多时候不复习,不记录就真的忘了,时间是最好的稀释 ...

  6. ArcGIS api fo silverlight学习一(silverlight加载GeoServer发布的WMS地图)

    最好的学习资料ArcGIS api fo silverlight官网:http://help.arcgis.com/en/webapi/silverlight/samples/start.htm 一. ...

  7. ArcGIS API for Silverlight动态标绘的实现

    原文:ArcGIS API for Silverlight动态标绘的实现 1.下载2个dll文件,分别是: ArcGISPlotSilverlightAPI.dll 和 Matrix.dll 其下载地 ...

  8. ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题

    原文:ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题 问题:如果在地图上加载成百上千工程点时,会密密麻麻,外观不是很好看,怎么破? 解决方法: ...

  9. ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法

    原文:ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法 群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebServi ...

随机推荐

  1. mysql数据库之基础SQL语句/语法

    SQL是现在进入互联网工作人们的必须技能之一,下面分享自己觉得很nice的SQL基本语句,从网上找了,觉得很不错,就分享给大家!简要介绍基础语句: 1.说明:创建数据库  Create DATABAS ...

  2. [转]单例模式——C++实现自动释放单例类的实例

    [转]单例模式——C++实现自动释放单例类的实例 http://www.cnblogs.com/wxxweb/archive/2011/04/15/2017088.html http://blog.s ...

  3. c++ vector 的使用

    vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1. 首先在程 ...

  4. JS中的闭包的一些理解!

    在日常的开发中,基本上是不会遇到关于闭包的这样,但是,因为在一些特殊的情况下,必须采用闭包,所以这里简单的概述下什么是闭包: OK!简而言之,闭包只是一个名词而已,我们更注重于他所实现的功能,也就是我 ...

  5. Update From 用法

    今天遇到用一个表的字段填充另一个表的问题,整理了一下   1.在mysql中,应该使用inner join,即: UPDATE   a INNER JOIN b ON a.userName = b.u ...

  6. lightning mdb 源代码分析(4)—MVCC/COW

    本博文将描述MVCC和cow技术以及LMDB中如何使用以及实现这两种技术. COW(Copy On Write): COW技术背后的思想是拖延技术,基本方法是假如有多个调用者需要访问的资源,在其初始化 ...

  7. Reset RequiredFieldValidator 重置 验证控件

    <td style="width:100px;">姓名<span class="must_star">*</span>< ...

  8. php preg_match_all 和 str_replace 替换图片链接

    需求:在 a 网站的后台添加一片文章,需要同步到 b 网站(两个网站数据库在同一台服务器). 思路是添加文章时,除了往 b 网站的数据库中添加数据外,再往 a 网站的数据库中添加数据. a 添加文章的 ...

  9. Nginx 笔记与总结(1)编译安装

    Nginx 可以承受 3 万并发连接数,Apache 默认最大连接数是 256 个. 编译安装 ① 下载 在 Nginx 的主页 http://nginx.org/ 下载最新的 stable vers ...

  10. Alamofire数据请求

    let stringurl = "http://www.huiyunche.cn/kyleuat/banner/list" Alamofire.request(.GET,strin ...