2017-8-20
前言
又到了周六,打完球,吃完饭,闲来无事,便把这周干的事情总结一下,顺便写个博客,分享给大家。
本来说好这周研究三维GIS的,但是看完官方文档发现只有最新的100版本推出了三维GIS,在加上小组长临时让我在2DGIS上研究一下轨迹回放,经过多次改动,最终在周四完成了这个功能,然后周五摸了一天的鱼(心里绞痛)。
整个功能通过你给的点的集合(小组长要求每个点相隔十分钟,当然,你们可以随便间隔),在地图上一步一步通过动画绘制出路线,每次到达一个点时,会显示出在这个点的时间,如果前后2个点没有太大的变化(也就是原地不动),每次会暂停一秒,然后继续绘制。
一些ARCGIS基础的开发,我就不说了,源码我也上传到GItHub上了,有兴趣的童鞋可以去看看。
好了,闲话就扯到这,开始吧。
效果实现
让我们先看看效果图
从动图中我们可以看到3个效果,下面我们依次分析下怎么实现。
首先轨迹回放的动画,是通过handler发送消息绘制Polyline来实现的,将所有的点分段绘制,正在走的为一种颜色,走完的为另一种颜色,没2个点为一段动画,通过你要求的所有的动画时间,计算每一段动画的绘制速度(100毫秒),每当发送一个消息(每100毫秒发送一次),便增加polyline.lineto()的坐标,以实现线移动的效果。
每一段动画中一共有2个polyline,第一个是正在走的polyline(临时线段),没100毫秒画一次(根据计算出的速度),当每一段动画结束时,移除第一个polyline,绘制第二个动画结束的polyline(最终线段),这样就实现了我们轨迹回访时得绘制动画。还有一个就是移动的图标,我们通过PictureMarkerSymbol来构建自己的移动图标,同样通过handler发送消息,根据速度增加坐标,每发送一次,移除上一个图片,重新绘制,实现移动的效果。
显示这个点的时间,无非就是判断一下这个点的经纬度时候是否和增加后的经纬度一致,之后再弹出一个显示框就可以了。
以上就是我们实现的思路了,下面我们来看看代码和难点。
代码
在代码之前,要说几个MapView的绘制时的特性。
我们绘制时,无论是线路还是图标,我们都是通过底图的投影坐标绘制的,所以我们需要将经纬度坐标转换为底图的投影坐标,否则无论你的点在哪里,都只会绘制在一个地方。
要将WGS-84转换为投影坐标,我们可以通过
Point mapPoint = (Point) GeometryEngine.project(wgsPoint ,SpatialReference.create(4326),map.getSpatialReference());
但有时候(没错,我就是那个但是),mapview是拿不到SpatialReference的,