百度地图实现轨迹播放

百度地图实现轨迹播放

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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大龄牛码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值