Route Player plugin for maptalks.js.
npm install maptalks
npm install maptalks.routeplayer
<script type="text/javascript" src="https://unpkg.com/maptalks/dist/maptalks.min.js"></script>
<script type="text/javascript" src="https://unpkg.com/maptalks.routeplayer/dist/maptalks.routeplayer.js"></script>
As a plugin, maptalks.routeplayer must be loaded after maptalks.js in browsers.
<script type="text/javascript" src="https://unpkg.com/maptalks/dist/maptalks.min.js"></script>
<script type="text/javascript" src="https://unpkg.com/maptalks.routeplayer/dist/maptalks.routeplayer.js"></script>
<script>
const route = [{
coordinate: [120, 31, 0],
time: 301000
},
{
coordinate: [122, 32, 0],
time: 541000
},
//other coordinates
];
const data = maptalks.formatRouteData(route, {});
const player = new maptalks.RoutePlayer(data, {
speed: 4,
debug: false
});
console.log(player);
player.play();
</script>
import {
RoutePlayer,
formatRouteData
} from 'maptalks.routeplayer';
const route = [{
coordinate: [120, 31, 0],
time: 301000
},
{
coordinate: [122, 32, 0],
time: 541000
},
//other coordinates
];
const data = formatRouteData(route, {});
const player = new RoutePlayer(data, {
speed: 4,
debug: false
});
console.log(player);
player.play();
formatRouteData(route,options)
format route data util for RoutePlayer
route
: path data Array<object>
options
:object
options.duration
: Route duration, if necessaryoptions.coordinateKey
: Name of the coordinate pointoptions.timeKey
: Name of the time fieldoptions.unitTime
: Time unit, default 1, internal time is in milliseconds. If your data time unit is not milliseconds, you need to configure this parameteroptions.isCartesian
: It’s Cartesian coordinates?const route = [{
coordinate: [120, 31, 0],
time: 301000
},
{
coordinate: [122, 32, 0],
time: 541000
},
//other coordinates
];
const data = formatRouteData(route, {});
const route = [{
coord: [120, 31, 0],
t: 301000
},
{
coord: [122, 32, 0],
t: 541000
},
//other coordinates
];
const data = formatRouteData(route, {
coordinateKey: 'coord',
timeKey: 't'
});
const route = [{
coordinate: [120, 31, 0],
},
{
coordinate: [122, 32, 0]
},
//other coordinates
];
const data = formatRouteData(route, {
duration: 1000 * 60 * 10
});
The automatically generated time is milliseconds, by new Date().getTime()
duration unit is milliseconds
unitTime
// the time unit is second
const route = [{
coord: [120, 31, 0],
t: 301
},
{
coord: [122, 32, 0],
t: 541
},
//other coordinates
];
const data = formatRouteData(route, {
coordinateKey: 'coord',
timeKey: 't',
unitTime: 1000 //to millisecond,Automatically convert seconds to milliseconds
});
isCartesian
// the time unit is second
const route = [{
coord: [10000, -10000, 0], //Cartesian coordinate points
t: 301
},
{
coord: [20000, 0, 0],
t: 541
},
//other coordinates
];
const data = formatRouteData(route, {
coordinateKey: 'coord',
timeKey: 't',
unitTime: 1000, //to millisecond,
isCartesian: true
});
RoutePlayer
new RoutePlayer(routeData, options)
routeData
Array an object array containing routes data, from formatRouteData
function run resultoptions
Object
options.unitTime
Number unit time, default is 1 ,Internally used milliseconds as a unit, if the time unit of your data is not milliseconds, please set its value,For example, if your data time unit is seconds, we can set it to 1000(内部使用毫秒作为单位,如果您的数据的时间单位不是毫秒,请设置其值。例如,如果您数据的时间单元是秒,我们可以将其设置为1000)options.speed
Number Play at double speed. Note that this is the speed of time playback, not the speed in physics. As for the speed of the path, it is determined by the time data in your path, which can be understood as the playback speed doubling function in video playback(注意这个是时间播放的速度,不是物理里的速度,至于路径的速度是有你的路径里时间数据决定,可以理解成视屏播放里的播放倍速功能)options.debug
Booleanoptions.autoPlay
Boolean Whether auto playoptions.repeat
Boolean Whether repeat playoptions.isCartesian
Boolean Is it Cartesian coordinate systemimport {
RoutePlayer,
formatRouteData
} from 'maptalks.routeplayer';
const route = [{
coordinate: [120, 31, 0],
time: 301000
},
{
coordinate: [122, 32, 0],
time: 541000
},
//other coordinates
];
const data = formatRouteData(route, {});
const player = new RoutePlayer(data, {
speed: 4,
debug: false,
autoPlay: true
});
console.log(player);
player.play();
remove()
add()
play()
pause()
reset()
Restore all states to their original statefunction replay() {
player.reset();
player.play();
}
cancel()
Equivalent to reset
isPlaying()
isPlayend()
finish()
getSpeed()
setSpeed(speed)
It can be analogized to the speed of a videoplayer.setSpeed(10);
setIndex(index)
Set the current playback position to a coordinate nodeplayer.setIndex(10);
setTime(time)
Set the current playback position to a certain time const t = player.getStartTime() / 2 + player.getEndTime() / 2;
player.setTime(t);
setPercent(percent)
Set the current playback position as a percentage of distanceplayer.setPercent(0.3);
setData(data)
reset route dataconst newData = formatRouteData(route, {});
player.setData(data);
getCurrentTime()
getStartCoordinate()
Get the coordinates of the first nodegetStartInfo()
Obtain information about the starting point, including coordinates, rotation information, etc const info = player.getStartInfo();
console.log(info.coordinate);
//for 3d model rotation
console.log(info.rotationZ);
console.log(info.rotationX);
function updateModelPosition(e) {
const {
coordinate,
rotationZ,
rotationX
} = e;
if (!currentModel) {
return;
}
// if (Math.abs(rotationX) > 40) {
// console.log(rotationX);
// }
currentModel.setCoordinates(coordinate);
currentModel.setRotation(rotationX, 0, rotationZ + modelOffsetAngle);
}
currentModel = new maptalks.GLTFMarker(info.coordinate, {
symbol,
});
gltfLayer.addGeometry(currentModel);
updateModelPosition(info)
getData()
getStartTime()
getEndTime()
getUnitTime()
setUnitTime(t)
//if your data time unit is second,1 second= 1000 ms
player.setUnitTime(1000);
getCurrentCoordinate()
Get the coordinates of the current playback pointgetCurrentVertex()
getCoordinates()
player.on('playstart playing playend pause', e => {
console.log(e.type);
})
add
remove
playstart
playing
function updateModelPosition(e) {
const {
coordinate,
rotationZ,
rotationX
} = e;
if (!currentModel) {
return;
}
// if (Math.abs(rotationX) > 40) {
// console.log(rotationX);
// }
currentModel.setCoordinates(coordinate);
currentModel.setRotation(rotationX, 0, rotationZ + modelOffsetAngle);
}
player.on('playing', e => {
if (autoUpdateMapCenter) {
map.setCenter(e.coordinate);
}
updateModelPosition(e);
// point.setCoordinates(e.coordinate);
});
playend
vertex
Passing through coordinate nodes during playbackfunction showVertex(e, vertexs, layer) {
const data = e.data;
const index = e.index;
console.log(index);
if (!vertexs[index]) {
const coordinate = data.coordinate;
const point = new maptalks.Marker(coordinate, {
symbol: {
markerType: 'ellipse',
markerWidth: 5,
markerHeight: 5,
textSize: 12,
textName: index,
textFill: '#fff'
}
});
vertexs[index] = point;
}
const point = vertexs[index];
if (!point.getLayer()) {
point.addTo(layer);
}
const needRemoves = vertexs.slice(index + 1, Infinity);
if (needRemoves.length) {
layer.removeGeometry(needRemoves);
}
}
let vertexs = [];
player.on('vertex', e => {
showVertex(e, vertexs, debugLayer);
});
settime
it will when you setTime/setIndex/setPercentreset
cancel
pause
finish
We welcome any kind of contributions including issue reportings, pull requests, documentation corrections, feature requests and any other helps.
1.0.0-alpha.5
unitTime
unitTime
error when playing1.0.0-alpha.3
getCoordinates()
method1.0.0-alpha.2
getCurrentVertex()
method1.0.0-alpha.1