openlayers 3實(shí)現(xiàn)車輛軌跡回放
本文實(shí)例為大家分享了openlayers 3實(shí)現(xiàn)車輛軌跡回放的具體代碼,供大家參考,具體內(nèi)容如下
先上效果:

利用 openlayers 3地圖的 postcompose 事件監(jiān)聽地圖的重繪
注意:此代碼是我在Vue 的methods 里面寫的測(cè)試方法,并不能直接運(yùn)行,請(qǐng)?jiān)诶斫獾幕A(chǔ)上測(cè)試。
vm 為vue的this對(duì)象 注釋已經(jīng)很豐富了,先做個(gè)備份,后期會(huì)編輯加入一點(diǎn)詳解。
實(shí)現(xiàn)代碼:
html:
<div id="menu">
<label for="speed" style="font-weight: bold;">
運(yùn)動(dòng)速度:
<input id="speed" type="range" min="1" max="20" step="1" value="10" />
</label>
<button id="start-animation">
開始運(yùn)動(dòng)
</button>
</div>
<!-- 注:此代碼僅為上面速度條和按鈕--
核心代碼:
startMove:function () {
var vm=this;
var map=vm.map;
vm.clearOverlayers("beijing_sq");
//中間站
var stops=[
[12909554.6597,4933234.84552], //14
[12909824.6852,4931594.7854], //43
[12910026.8837,4930523.89946], //63
[12910870.563,4929357.26511] //85
];
var stopMakers = new Array();
for(var i=0;i<4;i++){
var s = new ol.Feature({
type: 'stop',
geometry: new ol.geom.Point(stops[i])
});
stopMakers.push(s);
}
var Coordinates=vm.path;
//將離散點(diǎn)構(gòu)建成一條折線
var route = new ol.geom.LineString(Coordinates);
//獲取直線的坐標(biāo)
var routeCoords = route.getCoordinates();
var routeLength = routeCoords.length;
var routeFeature = new ol.Feature({
type: 'route',
geometry: route
});
var geoMarker = new ol.Feature({
type: 'geoMarker',
geometry: new ol.geom.Point(routeCoords[0])
});
var startMarker = new ol.Feature({
type: 'icon',
geometry: new ol.geom.Point(routeCoords[0])
});
var endMarker = new ol.Feature({
type: 'icon',
geometry: new ol.geom.Point(routeCoords[routeLength - 1])
});
var styles = {
'route': new ol.style.Style({
stroke: new ol.style.Stroke({
width: 6,
color: '#F2C841'
}),
fill:new ol.style.Fill({
color:"#F6E3A3"
})
}),
/*'icon': new ol.style.Style({
image: new ol.style.Icon({
anchor: [0.5, 1],
src: require()
})
}),*/
'geoMarker': new ol.style.Style({
/*image: new ol.style.Circle({
radius: 7,
snapToPixel: false,
fill: new ol.style.Fill({ color: 'black' }),
stroke: new ol.style.Stroke({
color: 'white',
width: 2
})
})*/
image: new ol.style.Icon({
src: require('../../assets/map/left_red_car.png'),
rotateWithView: false,
rotation: -Math.atan2(routeCoords[0][1]-routeCoords[1][1], routeCoords[0][0]-routeCoords[1][0]),
scale:0.3,
})
}),
'stop':new ol.style.Style({
image:new ol.style.Circle({
radius:10,
snapToPixel:false,
fill:new ol.style.Fill({ color:'red'}),
stroke:new ol.style.Stroke({
color:'white',
width:2
})
})
})
};
var animating = false;
var speed, now;
var speedInput = document.getElementById('speed');
var startButton = document.getElementById('start-animation');
var vectorLayer = new ol.layer.Vector({
id:'carLayer',
source: new ol.source.Vector({
features: [routeFeature, geoMarker, startMarker, endMarker,stopMakers[0],stopMakers[1],stopMakers[2],stopMakers[3]]
}),
style: function (feature) {
//如果動(dòng)畫是激活的就隱藏geoMarker
if (animating && feature.get('type') === 'geoMarker') {
return null;
}
return styles[feature.get('type')];
}
});
//var center = ol.proj.fromLonLat([115.981,40.451]);
map.addLayer(vectorLayer);
// 要素移動(dòng)
var moveFeature = function (event) {
var vectorContext = event.vectorContext; //HTML5 Canvas context,ol.render.canvas.Immediate的對(duì)象
var frameState = event.frameState; //freme 的狀態(tài)
if (animating) {
var elapsedTime = frameState.time - now; //elapsedTime 已過(guò)時(shí)間
//通過(guò)增加速度,來(lái)獲得lineString坐標(biāo)
var index = Math.round(speed * elapsedTime / 1000); //已經(jīng)走了多少個(gè)點(diǎn)
//console.log("#########",routeCoords[index]);
if (index >= routeLength) {
stopAnimation(true);
return;
}
//fixme ---------------
if( index < 14){
flashFeature(0);
}
if( index == 14){
changeStyle(0, 1);
}
if(index > 14 && index <43){
flashFeature(1);
}
if(index == 43){
changeStyle(1, 2);
}
if(index > 43 && index <63){
flashFeature(2);
}
if(index == 63){
changeStyle(2, 3);
}
if(index > 63 && index <85){
flashFeature(3);
}
if(index == 85){
changeStyle(3, 3);
}
//fixme--------------------
var dx,dy,rotation,carStyle;
if(routeCoords[index] && routeCoords[index+1]){
dx=routeCoords[index][0]-routeCoords[index+1][0];
dy=routeCoords[index][1]-routeCoords[index+1][1];
rotation = Math.atan2(dy,dx);
//console.log("***********",rotation);
carStyle= new ol.style.Style({
image: new ol.style.Icon({
src: require('../../assets/map/left_red_car.png'),
rotateWithView: false,
rotation: -rotation,
scale:0.3,
})
});
var currentPoint = new ol.geom.Point(routeCoords[index]); //當(dāng)前點(diǎn)
var feature = new ol.Feature(currentPoint);
//Render a feature into the canvas.
// Note that any zIndex on the provided style will be ignored - features are rendered immediately in the order that this method is called.
// If you need zIndex support, you should be using an ol.layer.Vector instead
vectorContext.drawFeature(feature, carStyle);
}
}
//繼續(xù)動(dòng)畫效果
map.render();
};
function changeStyle(previous,next) {
//console.log(stopMakers[previous]);
stopMakers[previous].setStyle(new ol.style.Style({
image: new ol.style.Circle({
radius: 10,
snapToPixel: false,
fill: new ol.style.Fill({color: 'green'}),
stroke: new ol.style.Stroke({
color: 'white',
width: 2
})
})
}));
}
var colors=['red','green'];
var colorIndex=0;
function flashFeature(index) {
var color;
colorIndex++;
colorIndex=colorIndex % 30;
if(colorIndex < 15){
color=colors[0];
}else {
color = colors[1];
}
stopMakers[index].setStyle(new ol.style.Style({
image: new ol.style.Circle({
radius: 10,
snapToPixel: false,
fill: new ol.style.Fill({
color: color
}),
stroke: new ol.style.Stroke({
color: 'white',
width: 2
})
})
}));
}
function startAnimation() {
if (animating) {
stopAnimation(false);
} else {
animating = true;
now = new Date().getTime(); /** 開始時(shí)的時(shí)間*/
speed = speedInput.value;
startButton.textContent = '結(jié)束運(yùn)動(dòng)';
//隱藏geoMarker
geoMarker.setStyle(null);
//設(shè)置顯示范圍
//map.getView().setCenter(center);
map.on('postcompose', moveFeature); /** postcompose事件-- 地圖渲染時(shí)都會(huì)觸發(fā) */
map.render();
}
}
/**
* @param {boolean}結(jié)束動(dòng)畫
*/
function stopAnimation(ended) {
animating = false;
startButton.textContent = '開始運(yùn)動(dòng)';
//如果動(dòng)畫取消就開始動(dòng)畫
var coord = ended ? routeCoords[routeLength - 1] : routeCoords[0];
/** @type {ol.geom.Point} */
(geoMarker.getGeometry()).setCoordinates(coord);
//移除監(jiān)聽
map.un('postcompose', moveFeature); /** 解除postcompose 事件 */
}
startButton.addEventListener('click', startAnimation, false);
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用js模擬類繼承小例子,學(xué)習(xí)js面向?qū)ο蟮呐笥芽梢詤⒖枷隆?/div> 2010-07-07
JS中比較兩個(gè)Object數(shù)組是否相等方法實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于JS中比較兩個(gè)Object數(shù)組是否相等方法實(shí)例內(nèi)容,有需要的朋友們學(xué)習(xí)下。2019-11-11
JS實(shí)現(xiàn)的走迷宮小游戲完整實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)的走迷宮小游戲,涉及javascript鍵盤事件響應(yīng)及頁(yè)面元素動(dòng)態(tài)變換相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
prefers-color-scheme設(shè)置檢測(cè)系統(tǒng)主題色
這篇文章主要為大家介紹了prefers-color-scheme設(shè)置檢測(cè)系統(tǒng)主題色實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
JavaScript頁(yè)面刷新與彈出窗口問(wèn)題的解決方法
解決JavaScript頁(yè)面刷新與彈出窗口問(wèn)題2010-03-03
ionic實(shí)現(xiàn)可滑動(dòng)的tab選項(xiàng)卡切換效果
這篇文章主要為大家詳細(xì)介紹了ionic實(shí)現(xiàn)可滑動(dòng)的tab選項(xiàng)卡切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08最新評(píng)論

