轨迹展示 最后更新时间: 2021年01月22日
PathSimplifier是一个轨迹展示组件,相比 AMap.Polyline (折线),PathSimplifier更加针对节点数量巨大、排布密集的路径,比如按秒记录位置的车辆行进轨迹,精细的地理边界等等。主要的功能特性包括:
- 对需要绘制的轨迹节点,在保留视觉效果的前提下,做一定的简化处理(利用Simplify.js 。举例来说,比如A点和B点,两者距离不到1像素,则可以去掉B点,只留A点;再比如A,B,C三点在一条直线上,或者,B点仅仅稍微偏离A点和C点构成的线段,那么B点就可以去掉),从而减少轨迹绘制时涉及的节点数量,提升绘制性能。
- 支持快速识别轨迹上的节点。比如鼠标在轨迹上滑动时,可以显示鼠标位置对应的节点信息。
- 内置轨迹巡航器,支持轨迹回放,标识经过路径,以及获取经过距离等等。
- 支持丰富的样式配置,覆盖轨迹线、轨迹方向、轨迹节点,以及巡航器等。
浏览器支持:
PathSimplifier目前依赖Canvas进行绘制,因此不支持IE9及以下浏览器。
名词释义
名称 | 说明 |
---|---|
数据源(data) | 一个数组,每个元素即一份轨迹数据。 |
轨迹数据项(pathData) | 数据源数组的元素,通常就是轨迹线的相关信息。自身的格式没有强制要求,只要能索引或者包含轨迹的相关信息即可。 |
轨迹索引(pathIndex) | 轨迹数据项在数据源数组中的的索引位置,即 0,1,2.... 。 pathIndex 与 pathData 一一对应。 |
轨迹路径(path) | 经纬度坐标构成的数组 |
轨迹节点索引(pointIndex) | 轨迹节点在轨迹路径中的索引位置 ,即 0,1,2.... 。 pathIndex + pointIndex 可以唯一确定一个节点。 |
轨迹选中(selected) | 支持通过函数或者点击选中(单选)某条轨迹;选中的轨迹可以单独配置样式。 |
如何使用
1、引入UI组件库
2、加载PathSimplifier(模块名:ui/misc/PathSimplifier
)
//加载PathSimplifier,loadUI的路径参数为模块名中 'ui/' 之后的部分
AMapUI.load(['ui/misc/PathSimplifier'], function(PathSimplifier) {
if (!PathSimplifier.supportCanvas) {
alert('当前环境不支持 Canvas!');
return;
}
//启动页面
initPage(PathSimplifier);
});
function initPage(PathSimplifier) {
//创建组件实例
var pathSimplifierIns = new PathSimplifier({
zIndex: 100,
map: map, //所属的地图实例
getPath: function(pathData, pathIndex) {
//返回轨迹数据中的节点坐标信息,[AMap.LngLat, AMap.LngLat...] 或者 [[lng|number,lat|number],...]
return pathData.path;
},
getHoverTitle: function(pathData, pathIndex, pointIndex) {
//返回鼠标悬停时显示的信息
if (pointIndex >= 0) {
//鼠标悬停在某个轨迹节点上
return pathData.name + ',点:' + pointIndex + '/' + pathData.path.length;
}
//鼠标悬停在节点之间的连线上
return pathData.name + ',点数量' + pathData.path.length;
},
renderOptions: {
//轨迹线的样式
pathLineStyle: {
strokeStyle: 'red',
lineWidth: 6,
dirArrowStyle: true
}
}
});
//这里构建两条简单的轨迹,仅作示例
pathSimplifierIns.setData([{
name: '轨迹0',
path: [
[100.340417, 27.376994],
[108.426354, 37.827452],
[113.392174, 31.208439],
[124.905846, 42.232876]
]
}, {
name: '大地线',
//创建一条包括500个插值点的大地线
path: PathSimplifier.getGeodesicPath([116.405289, 39.904987], [87.61792, 43.793308], 500)
}]);
//创建一个巡航器
var navg0 = pathSimplifierIns.createPathNavigator(0, //关联第1条轨迹
{
loop: true, //循环播放
speed: 1000000
});
navg0.start();
}
接口文档
构造参数
参数名称 | 类型 | 说明 |
---|---|---|
| 地图对象实例,用于显示相关的Marker | |
|
| 绘制用图层的叠加顺序值 。如果需要叠加在地图的最上层,可以设置一个较大的值,比如300 |
|
| 数据源数组,每个元素即为轨迹相关的信息 |
|
| 返回轨迹数据中的路径信息
比如:
|
|
| 返回轨迹数据项的叠加顺序值,即zIndex。zIndex较大的轨迹绘制在上层; 如果zIndex值相同,则pathIndex较大的绘制在上层。
比如默认的实现为:
|
|
| 返回鼠标悬停时显示的Title内容
比如:
|
|
| 是否在绘制后自动调整地图视野以适合全部轨迹,默认 |
|
| 点击轨迹节点或者轨迹节点间的连线时,选中该轨迹,默认 |
|
| 置顶选中的轨迹线;置顶的含义是,将该轨迹线的zIndex设置为现存最大值+1。默认 |
|
| 绘制引擎的构造类(Function),默认为内置的Canvas引擎 |
|
| 绘制引擎的构造参数,请参见下方 绘制引擎 部分 |
方法
方法名称 | 返回值 | 说明 |
---|---|---|
|
| 返回 |
| 设置 | |
| 是否置顶显示 1. 2. | |
|
| 返回pathIndex对应的轨迹数据项 |
|
| 创建一个轨迹巡航器。
|
|
| 返回现存的所有轨迹巡航器(已创建未销毁 ) |
| 销毁现存的所有轨迹巡航器 | |
|
| 返回处于选中状态的轨迹数据项;无选中时,返回null |
|
| 返回处于选中状态的的 |
|
| 判断 |
| 选中(单选) | |
| 立即重新绘制 | |
| 延时设定的毫秒(默认10)后绘制;该时间段内重复调用只会触发一次。该函数适合短时间内多次触发绘制的场景。 | |
| 设定数据源数组,并触发重新绘制。data为空时将清除显示内容。 | |
| 自动调整地图视野,适应 如果 | |
| 监听 eventName 事件,多个事件用空格分隔 | |
| 注销 eventName 事件,多个事件用空格分隔 | |
| 隐藏 | |
| 显示 | |
|
| 返回是否处于隐藏状态 |
|
| 返回内部使用的绘制引擎的实例 |
|
| 返回内部绘制引擎的参数选项的引用。更改后,调用renderLater()方法重新绘制即可生效。(示例) |
事件
注意:path相关事件的触发区域是节点(point)之间的连线部分,并不包括节点本身,与之对应,点击point并不会同时触发point所属的path的点击事件。如果需要将节点的点击等同视为所属轨迹线的点击,可以同时监听两者,代码示例:
pathSimplifierIns.on('pathClick pointClick', function(e, info){
//info.pathData 即是相关的轨迹数据,如果info.pointIndex >= 0,则表示由轨迹上的节点触发
});
事件名称 | 参数 | 说明 |
---|---|---|
|
| 鼠标点击轨迹节点的连线时触发 |
|
| 鼠标移入轨迹节点的连线时触发 |
|
| 鼠标移出轨迹节点的连线时触发 |
|
| 鼠标点击节点区域时触发 |
|
| 鼠标移入到节点区域时触发 |
|
| 鼠标移出到节点区域时触发 |
绘制引擎 - Canvas
Canvas 是默认使用的绘制引擎
构造参数
关于 Tolerance:
Tolerance 是路径简化算法( Simplify.js )的参数,单位是像素。值越大,简化程度越高,保留的节点越少;反之,值越小(>0),简化程度越低,保留的节点越多。
参数名称 | 类型 | 说明 |
---|---|---|
|
| 是否支持事件(click,mouseover,mouseout),默认为True。事件监听本身对性能有一定的损耗,如果不需要,可以关闭。 |
|
| 对轨迹线上不可见(参见keyPointTolerance)的节点,是否支持事件,默认为True。 |
|
| 绘制轨迹线的简化参数,默认为2。该参数不宜设置过大,推荐范围 1~5。过大的参数会导致鼠标识别以及轨迹巡航偏离轨迹线(如下图所示,右侧存在非常明显的偏离)。 ![]() |
|
| 绘制中间节点的简化参数,取值规则如下: 1. 小于0, 不绘制任何中间节点;默认设置。 2. 大于等于0,对简化过的绘制轨迹线做二次简化,结果以点的形式绘制(入下图中的蓝色圆点) ![]() |
|
| 如果地图视野内的轨迹节点的总数量小于该阈值,则绘制全部的节点。默认值为-1,即不开启。开启时,建议设置一个1000以内的数值。 |
|
| 轨迹线的样式 ,属性取值为:
注意,描边的绘制原理是,先用 lineWidth+borderWidth*2 的宽度绘制一条底线,再在其上绘制主线,因此,无法实现主线完全透明,仅仅保留描边的效果。 如果需要对各个轨迹分别配置样式,请参见下述的 |
|
| 轨迹线在鼠标Hover时的样式,属性继承 额外属性:
|
|
| 轨迹线处于选中状态时的样式, 属性继承 |
|
| 轨迹线上方向箭头的默认配置( 额外属性:
|
|
| 轨迹节点的绘制样式,属性取值为:
|
|
| 轨迹起点的绘制样式,属性继承 |
|
| 轨迹终点的绘制样式,属性继承 |
|
| 轨迹点在鼠标Hover时的样式 ,属性继承 |
|
| 选中状态下的轨迹线上的节点的样式, 属性继承 |
|
| 轨迹巡航器的默认样式,属性取值为:
content的取值有两类: 1. 2.
注意: 1)该函数通常只是描绘路径(使用 moveTo,lineTo, arc, arcTo等),尽量不要fill或者stroke,所有点的路径描绘完成后,引擎自己会在尾部调用fill以及stroke,一次性绘出所有路径。 2)x, y, width, height 的数值与视觉上的数值在高清屏幕时(window.devicePixelRatio>1)会有差异,比如pointStyle.width = 4, 如果屏幕的devicePixelRatio=2,那么content函数接收的width参数就会是8。因此,不要在该函数中使用固定数值。 3)配合 PathSimplifier提供了一个快捷方法用于创建图片内容的content(function):
示例:
图片的绘制性能较差,建议优先考虑形状。 |
|
| 根据轨迹索引和zoom返回样式配置
返回的样式对象的属性范围包括:
各个属性的内容只需要包括有更改的内容即可,其余继承上层配置,比如:
|
|
| 鼠标Hover时显示的Title的样式,属性取值:
|
轨迹巡航器 - PathNavigator
轨迹巡航器需要依靠上述 createPathNavigator
方法创建,可以在指定的轨迹线上进行动画回放(示例)。
配置选项
参数名称 | 类型 | 说明 |
---|---|---|
|
| 是否循环回放(到达终点后,返回起点重新开始),默认false |
|
| 巡航速度,单位 千米/小时。默认 1000 |
|
| 巡航器的样式,属性继承上述绘制引擎部分的 |
|
| 动画触发的间隔,单位毫秒;默认16。该值只是建议性质,较大的间隔有助于降低资源消耗,但同时也会降低动画的流畅度,通常情况下保持原值即可。 |
|
| 该值默认200,单位毫秒。该值会影响巡航器行进中的方向指向,规则如下: 1. 等于0,方向指向下一个节点 2. 大于0,方向指向按当前速度行进设定毫秒后的节点位置。比如A点向C点行进,但中间的路径非常曲折,如果仅仅指向下一个节点(B点),巡航器的方向就会左右抖动;相对而言,指向200毫秒后的目标位置C点,方向就会稳定的多。 ![]() 注意,因计算一段时间后的位置本身会损耗性能,与该段时间跨越的节点数量成正比,因此取值不宜过大。 |
|
| 巡航路径的节点索引范围,默认为[0, 路径长度-1],即整条路径 |
方法
方法名称 | 返回值 | 说明 |
---|---|---|
| 开始路径巡航。 如果是浮点类型,则整数部分表示起始点索引,小数部分表示起始点和下一节点间的比例位置。比如 | |
| 暂停巡航 | |
| 恢复巡航 | |
| 停止巡航,同时清除已经过路径(这一点不同于pause) | |
| 销毁巡航器。巡航作为动画过程是非常耗费性能的,因此不再需要时应及时销毁 | |
|
| 返回当前所处的索引位置。返回属性为:
比如 |
|
| 返回巡航状态,有三种:
|
|
| 返回巡航路径的轨迹索引,即 创建(createPathNavigator)时 传入的第一个参数 |
|
| 返回当前位置的经纬度 |
|
| 返回当前设定的速度 |
|
| 返回巡航经过的距离(起始节点到当前位置),单位米;stop后会重置为0 |
|
| 返回巡航路径的起始节点索引 |
|
| 返回巡航路径的结束节点索引 |
| 将巡航器移动指定的距离,单位米 | |
| 将巡航器移动到指定的节点索引位置,tail含义见getCursor | |
|
| |
|
| |
| 设定巡航器的速度,单位千米/小时 | |
| 设定巡航器的路径节点索引范围 | |
| 监听 eventName 事件,多个事件用空格分隔 | |
| 注销 eventName 事件,多个事件用空格分隔 |
事件
事件名称 | 参数 | 说明 |
---|---|---|
|
| 调用start时触发 |
| | 调用pause时触发 |
| | 调用moveByDistance(动画过程会调用该方法), moveToPoint 时触发 |
| | 调用stop时触发 |
其他
大地线
大地线指地球球面上两点之间的最短曲线, PathSimplifier 提供了一个工具方法来创建该此种类型的轨迹路径:
PathSimplifier.getGeodesicPath(start:AMap.LngLat, end:AMap.LngLat, interPointsNum:number)
@param {AMap.LngLat} start 起点
@param {AMap.LngLat} end 终点
@param {number} interPointsNum 起终点间插入的节点数量
@return {Array.<AMap.LngLat>} 返回插值后的曲线节点数组(包括起终点+插值点)