百度地图API实现轨迹动态移动

先看实现效果
点A是动态移动的
1,先实例化百度地图,再在此实例上进行操作

 var map = new BMap.Map("allmap");
          map.centerAndZoom(new BMap.Point(116.404, 36.015), 6);
         map.enableScrollWheelZoom(true); //启动滚轮放大缩小
          map.addControl(new BMap.NavigationControl()); // 添加平移缩放控件
           map.addControl(new BMap.ScaleControl()); // 添加比例尺控件
           map.addControl(new BMap.OverviewMapControl()); //添加缩略地图控件

2,实例化一个驾车对象DrivingRoute

 var driving = new BMap.DrivingRoute(map, {renderOptions:{map: map,    autoViewport: true}});
      // map.clearOverlays()
       driving.search(p1, p2);//自动获得一个从p1到p2的驾车实例,一般有多个方案,默认选取第一个方案

3,为驾车实例设置回调函数

 driving.setSearchCompleteCallback(function(){

          // map.clearOverlays()

           var pts = driving.getResults().getPlan(0).getRoute(0).getPath(); //通过驾车实例,获得一系列路径上所以点的组成的数组

           var paths = pts.length; //获得点的个数

            console.log(paths);

           var point = pts[0];//设置起始点为point

           var markers =  addMarker(point,index) //起始点上实例化一个标点

           var marks = addmarker(p2,start_name,end_name)//为终点添加信息框



		    map.addOverlay(markers);

4,实现点和轨迹动画的关键。设置一个递归函数,i为轨迹中第i个点,在i与i+1之间添加线段,直到i等于终点,在整体上就相当于轨迹移动。

 var i=0;
          function dynamic(i){
             dynamicLine(pts[i].lng,pts[i].lat);//dynamicLine实现在i与i+1之间添加线段,下有参考代码
             if(i+10< paths){   //
                  setTimeout(function(){
                   i=i+10;//我这里是在i与i+10之间添加线段。
                    markers.setPosition(pts[i]);   //特别注意一下迭代的顺序
                    dynamic(i);
                   },1);
             }
          }
          dynamic(i);

5,dynamicLine参考代码:

function dynamicLine(lng,lat){
			var lng =lng;  //100+getRandom(40);;
			var lat =lat;  //35+getRandom(30);
			var point = [lng,lat];
			var newLinePoints = [];
			var len;
			//addMarker(point);//增加对应该的轨迹点
			points.push(point);
			bPoints.push(new BMap.Point(lng,lat));
			len = points.length;
		    newLinePoints = points.slice(len-2, len);//最后两个点用来画线。

			addLine(newLinePoints);//增加轨迹线
			//setZoom(bPoints);
			//setTimeout(dynamicLine, 1000);
		}
		 function addLine(points){

			var linePoints = [],pointsLen = points.length,i,polyline;
			if(pointsLen == 0){
				return;
			}
			// 创建标注对象并添加到地图
			for(i = 0;i <pointsLen;i++){
				linePoints.push(new BMap.Point(points[i][0],points[i][1]));
			}

			var line = new BMap.Polyline(linePoints, {strokeColor:"red", strokeWeight:3, strokeOpacity:0.5}); //创建弧线对象
	         map.addOverlay(line); //添加到地图中
		}

6,完整代码

function route(start,end,type,start_name,end_name){


     map.clearOverlays()
	 var points = []//[[104.067588,30.58204],[116.412175,39.920125]];//原始点信息数组
	 var bPoints = [];//百度化坐标数组。用于更新显示范                                                                     //当折线未加载完的时候,clear无法清除折线

     var p1 = start;
     var p2 =  end;//已经包装好的点

      index = -1;


      if (type=="自驾"||type=="乘车"){
         index=0;
         var driving = new BMap.DrivingRoute(map, {renderOptions:{map: map,    autoViewport: true}});
      // map.clearOverlays()
       driving.search(p1, p2);
       //driving.enableAutoViewport()


       driving.setSearchCompleteCallback(function(){

          // map.clearOverlays()

           var pts = driving.getResults().getPlan(0).getRoute(0).getPath(); //通过驾车实例,获得一系列点的数组

           var paths = pts.length; //获得有几个点

            console.log(paths);

           var point = pts[0];

           var markers =  addMarker(point,index)

           var marks = addmarker(p2,start_name,end_name)



		    map.addOverlay(markers);

          var i=0;
          function dynamic(i){
             dynamicLine(pts[i].lng,pts[i].lat);
             if(i+10< paths){            //
                  setTimeout(function(){
                   i=i+10;
                    markers.setPosition(pts[i]);   //特别注意一下迭代的顺序
                    dynamic(i);



                   },1);
             }
          }
          dynamic(i);

        })//driving回调函数结束


       }//if结束
      else if (type=="高铁"||type=="火车"){                      //无高铁,用火车代替
       index=1;

              var transit = new BMap.TransitRoute(map,
 {
     renderOptions: {map: map} ,
     onSearchComplete: function(result) {
        console.log("eee");
        if (transit.getStatus() == BMAP_STATUS_SUCCESS) {
            // 从结果对象中获取起点和终点信息

               // var plan = result.getPlan(0);
                // console.log(typeof(plan.getNumRoutes()));
            console.log("aaa");
            //plan.getNumRoutes()
        }
     }
 }
);
transit.search(p1,p2);
//transit.enableAutoViewport();
//成都104.067588,30.58204
//北京116.412175,39.920125
//郑州113.618085,34.758592
//重庆106.569621,29.573985
//上海121.48054,31.232965
//广州113.27875,23.137949
//var start= new BMap.Point(104.067588,39.58204);
//var end = new BMap.Point(116.412175,39.920125);
//transit.search(new BMap.Point(113.27875,23.137949), new BMap.Point(121.48054,31.232965));

 //console.log( transit.getStatus());
//var pt= transit.getResults().getPlan(0).getRoute(0).getPath();
// var phs = pt.length;
// console.log("aaaaaa");

       }
      else if (type=="飞机"){
       index=2;
        map.clearOverlays()

       var markers =  addMarker(end,index)
	   map.addOverlay(markers);

	   var points = [start,end];
	   bPoints.push(start);
	    bPoints.push(end);
	   var curve = new BMapLib.CurveLine(points, {strokeColor:"blue", strokeWeight:3, strokeOpacity:0.5}); //创建弧线对象
	   map.addOverlay(curve); //添加到地图中
	   setZoom(bPoints);

       }
      else {
         index = 3;
          map.clearOverlays()
         var markers =  addMarker(end,index)
	   map.addOverlay(markers);
	   var points = [start,end];
	   var line = new BMap.Polyline(points, {strokeColor:"yellow", strokeWeight:3, strokeOpacity:0.5}); //创建弧线对象
	   map.addOverlay(line); //添加到地图中
	    bPoints.push(start);
	    bPoints.push(end);
	   setZoom(bPoints);
         }
 //添加点
  function addMarker(point,index){

          var myIcon = new BMap.Icon("http://api.map.baidu.com/img/markers.png", new BMap.Size(23, 25), {

         offset: new BMap.Size(10, 25),

           imageOffset: new BMap.Size(0, 0 - index* 25)

           });

       var markers = new BMap.Marker(point, {icon: myIcon});
         return markers;

  }


  //添加线
  function addLine(points){

			var linePoints = [],pointsLen = points.length,i,polyline;
			if(pointsLen == 0){
				return;
			}
			// 创建标注对象并添加到地图
			for(i = 0;i <pointsLen;i++){
				linePoints.push(new BMap.Point(points[i][0],points[i][1]));
			}

			var line = new BMap.Polyline(linePoints, {strokeColor:"red", strokeWeight:3, strokeOpacity:0.5}); //创建弧线对象
	         map.addOverlay(line); //添加到地图中
		}

  //添加动画
   function dynamicLine(lng,lat){
			var lng =lng;  //100+getRandom(40);;
			var lat =lat;  //35+getRandom(30);
			var point = [lng,lat];
			var newLinePoints = [];
			var len;
			//addMarker(point);//增加对应该的轨迹点
			points.push(point);
			bPoints.push(new BMap.Point(lng,lat));
			len = points.length;
		    newLinePoints = points.slice(len-2, len);//最后两个点用来画线。

			addLine(newLinePoints);//增加轨迹线
			//setZoom(bPoints);
			//setTimeout(dynamicLine, 1000);
		}
   //设置随机数
   function getRandom(n){
			return Math.floor(Math.random()*n+1)
	    }
    //设置视图等级
   function setZoom(bPoints){
			var view = map.getViewport(eval(bPoints));
			var mapZoom = view.zoom;
			var centerPoint = view.center;
			map.centerAndZoom(centerPoint,mapZoom);
		}

}

7,代码看起来有些长,其实逻辑比较简单,希望读者有所收获~~

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值