路书
百度地图的路书是基于Baidu Map API 1.2+版本的一个功能,他可以实现marker沿路线运动,并且提供暂停等功能。
这是github上的地址:
以及它的Demo:
需要的同学可以自行下载。
使用之前
在正式写代码之前要先把百度地图的SDK引入。
1 | <script src="http://api.map.baidu.com/api?v=2.0&ak=你的密钥"> |
带标签的路书
我们的需求是让定制路线上的marker带有一个动态显示数据的标签,然而原版的路书Demo中是指定一个起始点和终点,由百度地图规划出路线。那么我们就需要解决两个问题:
- 如何制定出我们想要的路线,而不是依靠百度地图搜索规划出的路线。
- 如何随着标志物运动时显示带有动态数据的标签。
- 扩展:还可以在暂停启动的基础上加入播放条功能。
定制路径覆盖物
由于数据都已经采集完成放在数据库中的,因此定制路线并不困难。首先在回调函数中把从数据库中取出的的经纬度信息和其他信息保存在result
对象中。
由于采集到的数据是WGS84的,然而百度地图的GPS坐标是采用GPS09定位,因此还需要遍历每个点对经纬度坐标进行转换。最后将点全部放入arrPois
数组中,创建地图实例时将根据这个数组创建覆盖物(我们定制的路径)。
这里仅贴出部分关键代码,ajax请求部分和坐标转换函数省略。
1 | var arrPois = []; |
创建地图的时候加载路径、标志物:
1 | /** |
地图实例

arrPois
中某个点的实例:
伪代码:
arrPois[0]=Point{'lat':23.274253731583542,'lng':113.32783864974276}
,上面的路径图由545个点组成。
为标志物(小车)添加标签
重头戏来了,因为百度地图自带的路书其实是可以在定制的路径上移动的,但是不能给标志物添加标签显示数据,更不用说随着点的遍历动态显示数据。
在阅读了路书的源码之后,发现路书是通过让标志物依次从当前坐标跳到下一个坐标,在跳转两个点之间循环定位,显得小车是是在路径上“移动”,而不是“跳动”。
在这基础上,给标志物加上标签应该不难。加上标志变量,标识当前播放状态。因此除了地图以外还有四个控件:开始、暂停、停止、速度调整。
思路:
- 下列函数放在在
buildMap()
中,在第一次初始化地图时,将startPoint
设为1。 - 点击暂停时,将当前
startPoint
保存,再下次点击时从这里开始。 - 点击停止时,将当前
startPoint
重置为1
1 | $('#run').click(function(){ |
标志物移动
- 用
setInterval()
来达到可以控制播放速度的效果。 - 调整速度其实很简单,只是给出一个速度值供其调用,但是值得注意的是,
move()
函数中的循环速度,和restMk(step)
中的调用定时器是相互配合的,如果速度配不好就会出现”反复横跳的情况”。
1 | /** |
角度转动
上述内容基本上已经把带标签的路书完成了,但是仔细运行的时候发现这车子不会转头啊!就是一个静态图片,一点都不像真正的车子啊。
路书的源码中其实早就给出了答案。
1 | function setRotation(curPos, targetPos, marker) { |
在move()
函数中进行移动之前中加入下列语句:
1 | if (currentCount == 1) { |
因为move
函数是在相邻两点间循环定位,因此必定为直线,所以只需要在第一次移动时转动一次。
演示
总结
自定义一个带标签的路书总共有几个步骤:
- 加载用来绘制路径的一堆经纬度点。
- 创建地图实例,同时绘制标志物、路径覆盖物。
- 为标志物添加标签,循环调用move函数移动标志。
本文提到的内容有一定的局限性,特别是绘制路径这里,需要多个几乎是连续的点,如果要引用请注意。