本文实例为大家分享了openlayers 3实现车辆轨迹回放的具体代码,供大家参考,具体内容如下
先上效果:
利用 openlayers 3地图的 postcompose 事件监听地图的重绘
注意:此代码是我在Vue 的methods 里面写的测试方法,并不能直接运行,请在理解的基础上测试。
vm 为vue的this对象 注释已经很丰富了,先做个备份,后期会编辑加入一点详解。
实现代码:
html:
<div id="menu"> <label for="speed" style="font-weight: bold;"> 运动速度: <input id="speed" type="range" min="1" max="20" step="1" value="10" /> </label> <button id="start-animation"> 开始运动 </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; //将离散点构建成一条折线 var route = new ol.geom.LineString(Coordinates); //获取直线的坐标 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) { //如果动画是激活的就隐藏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); // 要素移动 var moveFeature = function (event) { var vectorContext = event.vectorContext; //HTML5 Canvas context,ol.render.canvas.Immediate的对象 var frameState = event.frameState; //freme 的状态 if (animating) { var elapsedTime = frameState.time - now; //elapsedTime 已过时间 //通过增加速度,来获得lineString坐标 var index = Math.round(speed * elapsedTime / 1000); //已经走了多少个点 //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]); //当前点 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); } } //继续动画效果 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(); /** 开始时的时间*/ speed = speedInput.value; startButton.textContent = '结束运动'; //隐藏geoMarker geoMarker.setStyle(null); //设置显示范围 //map.getView().setCenter(center); map.on('postcompose', moveFeature); /** postcompose事件-- 地图渲染时都会触发 */ map.render(); } } /** * @param {boolean}结束动画 */ function stopAnimation(ended) { animating = false; startButton.textContent = '开始运动'; //如果动画取消就开始动画 var coord = ended ? routeCoords[routeLength - 1] : routeCoords[0]; /** @type {ol.geom.Point} */ (geoMarker.getGeometry()).setCoordinates(coord); //移除监听 map.un('postcompose', moveFeature); /** 解除postcompose 事件 */ } startButton.addEventListener('click', startAnimation, false); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
白云城资源网 Copyright www.dyhadc.com
暂无“openlayers 3实现车辆轨迹回放”评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年12月29日
2024年12月29日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]