百度地图实现轨迹播放
1、以下代码作为参考,也是实现轨迹的核心代码
2、为什么要帖出这个百度轨迹播放代码,是因为百度实现轨迹回放比高德地图复杂些,另外百度轨迹播放有些细节处理不好会导致使用效果很差,比如地图跟随小车移动如果控制不好,会导致效果很差等,减少大家在做百度轨迹的弯路
3、实现了根据一系列坐标数组,回放轨迹、自动播放轨迹、地图跟随小车移动
4、没解决到暂停播放功能,很奇怪,希望大家解决了,贴出解决办法
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML> <html> <head> <base href="<%=basePath%>"> <title>轨迹</title> <style type="text/css"> .Maptianw { width: 52px; height: 32px; line-height: 32px !important; border-radius: 3px; background: #1550B6; color: #ffffff !important; font-size: 12px; text-align: center; top: 11px; left: 430px; z-index: 1; cursor: pointer; } img { width: 32px; height: 32px; cursor: pointer; line-height: 32px !important; border-radius: 3px; background: #1550B6; } img:hover { cursor: pointer; line-height: 32px !important; border-radius: 3px; background: #ecedef; } .Maptianw input { display: block; margin: 10px 0px 0px 8px; float: left; } .Maptianw span { display: block; float: left; } </style> </head> <jsp:include page="/common/common.jsp" flush="true" /> <script type="text/javascript" src="<%=basePath%>company/login/js/jquery-1.11.1.min.js"></script> <script type="text/javascript" src="<%=basePath%>common/js/jquery-1.11.1.min.js"></script> <script type="text/javascript" src="<%=basePath%>common/js/bootstrap.min.js"></script> <script type="text/javascript"> var _bMap=null;//百度地图对象 var parent=null; var arrayPoints=null; var startlon=""; var endlat=""; var startpic='<%=basePath%>/map/images/icon_st.png'; var endpic='<%=basePath%>/map/images/icon_en.png'; var picCar='<%=basePath%>/map/images/car.png'; var play_start='<%=basePath%>/img/play_start.png'; var play_play='<%=basePath%>/img/play_play.png'; var play_stop='<%=basePath%>/img/play_stop.png'; var play_res="<%=basePath%>/img/play_set.png"; var movePolyline=new Array();//轨迹线 var lushu; var car; //汽车图标 var marker; var label; //信息标签 var centerPoint; //var timer; //定时器 var index = 0; //记录播放到第几个point var BMap; var followChk, playBtn, pauseBtn, resetBtn; //几个控制按钮 var me; hwui().require('upload',"slider",'attachment','accordion','autocomplete','calendar', 'colorpicker','combobox','datepicker','datetimepicker','dialog','editor', 'validator', 'tab', 'effect', 'grid', 'treeview','menu', 'numerictextbox','slider','tab','tooltip','effect','binder', 'dropdownlist', 'datetimepicker', 'message', 'treeview', 'editor',function($, hwui,config) { var $frame =$("#mapModalIframe"); var id='<%=request.getParameter("id")%>'; var personId='<%=request.getParameter("personId")%>'; var deadlineStarttime='<%=request.getParameter("deadlineStarttime")%>'; var deadlineEndtime='<%=request.getParameter("deadlineEndtime")%>'; followChk = document.getElementById("follow"); playBtn = document.getElementById("play"); resetBtn = document.getElementById("reset"); resetBtn.addEventListener("click", referesh); $frame.load(function () { //地图加载完成 document.getElementById('mapModalIframe').contentWindow.callMapInitSuccessFunc(function(){ parent = document.getElementById('mapModalIframe').contentWindow; parent.setCallHideControl(); parent.setCallbackMapAddress("","",""); BMap=parent.BMap; getPersonTrack(); }); }); /** *获取坐标 */ function getPersonTrack(){ arrayPoints=new Array(); _bMap=parent.customMap.mMap; $.ajax({ url:"", type:"post", dataType: "json", data:{taskId:id,personId:personId,startTime:deadlineStarttime,endTime:deadlineEndtime}, success: function(result) { if(result==null|| result=="" ||result.length<=0){ hwui.Msg.info("不存在轨迹!"); return; }; var points=""; var lon=""; var lat=""; for ( var int = 0; int < result.length; int++) { var lon=result[int].longitude; var lat=result[int].latitude; var point=lon+","+lat; points+=(points=="")?point:";"+point; if(int==0){ startlon=lon; endlat=lat; } arrayPoints.push(new parent.BMap.Point(lon, lat) ); } //轨迹 parent.mapMarker.addPolyline(parent.customMap,points,1,"#EE2C2C",4,null); //添加起点和终点 parent.mapMarker.addPictrueMarker2(parent.customMap,startlon,endlat,startpic,37,62,null,null); parent.mapMarker.addPictrueMarker2(parent.customMap,lon,lat,endpic,37,62,null,null); setControlPlay(true); if( result.length>1){ playRout(_bMap); } } }); } /** 路线回放 **/ function playRout(map){ if(arrayPoints.length<=0){ hwui.Msg.info("不存在轨迹!"); return; } map.setViewport(arrayPoints); //parent.getCallPanByPointAndLevel(startlon,endlat,15); parent.BMapLib.LuShu.prototype._move=function(arrayPoints,targetPos,effect) { var pointsArr=[arrayPoints,targetPos]; //点数组 me = this; //当前的帧数 currentCount = 0, //步长,米/秒 timer = 100, step = this._opts.speed / (1000 / timer), //初始坐标 init_pos = this._projection.lngLatToPoint(arrayPoints), //获取结束点的(x,y)坐标 target_pos = this._projection.lngLatToPoint(targetPos), //总的步长 count = Math.round(me._getDistance(init_pos, target_pos) / step); //如果小于1直接移动到下一点 if (count < 1) { me._moveNext(++me.i); return; } me._intervalFlag = setInterval(function() { //两点之间当前帧数大于总帧数的时候,则说明已经完成移动 if (currentCount >= count) { clearInterval(me._intervalFlag); //移动的点已经超过总的长度 if(me.i > me._path.length){ return; } //运行下一个点 me._moveNext(++me.i); }else { currentCount++; var x = effect(init_pos.x, target_pos.x, currentCount, count), y = effect(init_pos.y, target_pos.y, currentCount, count), pos = me._projection.pointToLngLat(new BMap.Pixel(x, y)); if(followChk.checked) { me._map.setCenter(pos); } //设置marker if(currentCount == 1){ var proPos = null; if(me.i - 1 >= 0){ proPos = me._path[me.i - 1]; } if(me._opts.enableRotation == true){ me.setRotation(proPos,arrayPoints,targetPos); } if(me._opts.autoView){ if(!me._map.getBounds().containsPoint(pos)){ me._map.setCenter(pos); } } } //正在移动 me._marker.setPosition(pos); //设置自定义overlay的位置 me._setInfoWin(pos); } },timer); }; //设置沿路线移动 lushu = new parent.BMapLib.LuShu(map,arrayPoints,{ defaultContent:"", autoView:true,//是否开启自动视野调整,如果开启那么路书在运动过程中会根据视野自动调整 defaultContent:"", icon : new BMap.Icon(picCar , new BMap.Size(52,26),{anchor : new BMap.Size(27, 13)}), speed: 1500, enableRotation:true,//是否设置marker随着道路的走向进行旋转 landmarkPois: [ ] }); setTimeout(function(){ play();//启动播放 },500); } //播放 function play() { //缩放到轨迹 parent.getCallPanByPointAndLevel(startlon,endlat,15); lushu.start(); setControlPlay(false); } //暂停 function pauseTrack() { setControlPlay(true); referesh(); } function setControlPlay(bln){ if(bln==true){ //播放 $("#play").attr("src",play_play); playBtn.removeEventListener("click", pauseTrack); playBtn.addEventListener("click", play); }else{ //暂停播放 $("#play").attr("src",play_res); playBtn.removeEventListener("click", play); playBtn.addEventListener("click", pauseTrack); } } function referesh(){ clearInterval( me._intervalFlag); _bMap.clearOverlays(); getPersonTrack(); } }); </script> <body> <iframe id='mapModalIframe' style='height: 500px;width: 100%;border: none;' src='<%=basePath%>map/selectAddress.jsp'> </iframe> <div id="hidden-for-desc" align="center"> <label>路线轨迹播放:</label> <label class="Maptianw" title="画面跟随"> <input id="follow" type="checkbox" checked="checked"><label for="follow" >跟随</label> </label> <a href='javascript:'><img id="play" src='<%=basePath%>/common/img/play_stop.png' title="播放轨迹" /></a> <a href='javascript:' style="display: none" ><img id="reset" style="display: none" src='<%=basePath%>/common/img/play_set.png' title="刷新路线" /></a> </div> </body> </html>