原文: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. okhttp3 get post 简单封装

    最近打算在新项目中使用 okhttp3, 简单封装了一下异步 get post 因为 CallBack 也是在子线程中执行,所以用到了 Handler public class MyOkHttpCli ...

  2. 如何修改 SplendidCRM 页脚版权信息

    打开 SplendidCRM 网站中的Web Site\_controls\Copyright.ascx 文件找到这段代码<div id="divFooterCopyright&quo ...

  3. Linux_自动调整linux系统时间和时区与Internet时间同步

    调整linux系统时间和时区与Internet时间同步 一.修改时区:# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改为中国的东八区# v ...

  4. 8.按要求编写Java应用程序。 (1)建立一个名叫Cat的类: 属性:姓名、毛色、年龄 行为:显示姓名、喊叫 (2)编写主类: 创建一个对象猫,姓名为“妮妮”,毛色为“灰色”,年龄为2岁,在屏幕上输 出该对象的毛色和年龄,让该对象调用显示姓名和喊叫两个方法。

    package liu0917; public class Cat { String name="妮妮"; int age=2; String maose="灰色&quo ...

  5. ubuntu 14.04安装

    最近想搞spark.没有集群环境,想先在单机上跑.但是两年前一直用到现在的virtualbox已经太老,很多源都停更了.所以准备装ubuntu14.04. 0. 更新源.163的源有问题,用的是soh ...

  6. 【液晶模块系列基础视频】5.3.X-GUI字体驱动3

    ============================= 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:ht ...

  7. 学习SSH框架

    1.SSH框架的认知 在做相关的java的网页的开发制作时,良好的层次分解是十分有比要的,所以我们在云涌第三方的框架之下来简化还有名了我们相关的网站的开发. SSH框架实则为Struct + spri ...

  8. 移动Web单页应用开发实践——实现Pull to Request(上/下拉请求操作)

    在单页应用开发中,无论是页面结构化,还是Pull to Request,都离不开一个技术——页面局部滚动.当下的移动web技术,主要使用下面两种方式实现局部区域的滚动: 基于IScroll组件,也有很 ...

  9. c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗?

    c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗? c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗 ...

  10. Nginx 笔记与总结(14)expires 缓存设置

    设置缓存,可以提高网站性能. 当网站的部分内容,比如新闻站的图片,一旦发布就不太可能发生更改,此时需要用户在访问一次页面之后,把该页面的图片缓存在用户的浏览器端一段时间,就可以用到 nginx 的 e ...