百度地图API 移动的marker,移动marker点击事件及动态改变速度

前段时间研究了路书想用来监控公交但发现路书很多功能不足,比如说路书移动时点击事件不能触发,路书动态改变移动速度需要移动完两点之间的距离才能改变,添加多个路书会影像其他的移动速度等。后来自己用marker写了个类似路书的东西,如下:(注释很详细,这里不多说,有疑问可在下方留言)

<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>百度地图 API marker</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.3, user-scalable=no">
        <meta name="description" content="百度地图 API marker">
        <meta name="keywords" content="百度 API">
        <meta name="author" content="wg">
        <style>
            html,body,#map{
                height: 100%;
                width: 100%;
                margin: 0;
            }
        </style>
        <script src="http://api.map.baidu.com/api?v=1.4"></script>
        <script src="http://api.map.baidu.com/library/LuShu/1.2/src/LuShu_min.js"></script>
    <body>
        <div id="map"></div>        
        <script>

            var data = [//自定义数据
                {latitude: 34.27563, longitude: 108.99059,stationType: 01,getTime:'2017-09-29 10:35:01'},//stationType站点类型:00普通站点、01起点、02终点
                {latitude: 34.276365, longitude: 108.980291,stationType: 00,getTime:'2017-09-29 10:36:45'},
                {latitude: 34.276361, longitude: 108.969296,stationType: 00,getTime:'2017-09-29 10:36:55'},
                {latitude: 34.276164, longitude: 108.953575,stationType: 00,getTime:'2017-09-29 10:38:04'},
                {latitude: 34.287457, longitude: 108.953593,stationType: 00,getTime:'2017-09-29 10:39:05'}
            ];

            var map = new BMap.Map("map");    // 创建Map实例 
            map.enableScrollWheelZoom(true);     //开启鼠标滚轮缩放
            map.centerAndZoom(new BMap.Point(data[2].longitude,data[2].latitude), 16);  // 初始化地图,设置中心点坐标和地图级别

            var points = getPoints(data);//获取data数据中的经纬度点并格式化点为BMap点
            var times = getTimes(data);//获取data数据中的经纬度点的时间差(单位毫秒)
            var allPoints = [];


            //用站点画出公交路线,参数:站点、线路颜色、线路宽度、透明度
            var polyline = new BMap.Polyline(points, {strokeColor:"#5298ff", strokeWeight:6, strokeOpacity:0.8}); 
            map.addOverlay(polyline); 

            for(var i = 1; i < points.length; i++){//将所有的点分割为n个小点,用于移动过度动画              
                allPoints.push.apply(allPoints,getPoins(points[i-1],points[i],500));
            }

            var icon = new BMap.Icon("bus.png",new BMap.Size(50,28),{anchor: new BMap.Size(25,23)});//声明公交icon
            var mkrBus =new BMap.Marker(allPoints[0], { icon: icon});//声明公交标注

            move(allPoints,points,times);//参数:allPoints分割点、points实际数据点、每个点的时间差(单位:毫秒)

            //添加站点、起点、终点marker
            for(var j = 1;j<data.length; j++){
                var prvePoint = new BMap.Point(data[j-1].longitude,data[j-1].latitude);
                var newPoint = new BMap.Point(data[j].longitude,data[j].latitude);              
                addMarker(data[j-1].stationType,prvePoint);                     
            }           
            addMarker(data[data.length-1].stationType,new BMap.Point(data[data.length-1].longitude,data[data.length-1].latitude));

            /**
            *获取data数据中的经纬度点并格式化点为BMap点
            *@param data数据
            *@return points BMap经纬点数组
            */
            function getPoints(data){
                var points = [];
                for (var i = 0; i < data.length; i++) {
                    var x = data[i].longitude;
                    var y = data[i].latitude;
                    points[i] = new BMap.Point(x,y);

                }
                return points;
            }

            /**
            *获取data数据中的经纬度点的时间差(单位毫秒)
            *@param data数据
            *@return times 时间差数组
            */
            function getTimes(data){
                var times = [];
                for (var i = 1; i < data.length; i++) {
                    var d1 = new Date(data[i-1].getTime);
                    var d2 = new Date(data[i].getTime);
                    times[i-1] = parseInt(d2 - d1);

                }
                return times;
            }

            /**
            *添加起点、终点、站点和公交标注
            *@param type 类型,站点00、起点01、终点02
            *@param point BMap经纬点
            */
            function addMarker(type,point){
                if(type == "00"){
                    //创建图标 size定义Icon大小,anchor定义偏移量
                    var icon00 = new BMap.Icon("stationPoint.png",new BMap.Size(14,14),{anchor: new BMap.Size(7,10)});
                    var mkr00 =new BMap.Marker(point, { icon: icon00});//创建标注
                    map.addOverlay(mkr00);//将标注添加到地图上
                }else if(type == "01"){
                    var icon01 = new BMap.Icon("start.png",new BMap.Size(32,32),{anchor: new BMap.Size(16,28)});
                    var mkr01 =new BMap.Marker(point, { icon: icon01});
                    map.addOverlay(mkr01); 
                }else if(type == "02"){
                    var icon02 = new BMap.Icon("end.png",new BMap.Size(32,32),{anchor: new BMap.Size(16,28)});
                    var mkr02 =new BMap.Marker(point, { icon: icon02});
                    map.addOverlay(mkr02);
                }
            }




            /**
            *获取prvePoint和newPoint之间的num个点
            *@param prvePoint 起点
            *@param newPoint 终点
            *@param num 取两中间的点个数
            *@return points 两点之间的num个点的数组   
            */
            function getPoins(prvePoint,newPoint,num){
                var lat ;
                var lng ;
                var points = [];
                if(prvePoint.lng>newPoint.lng&&prvePoint.lat>newPoint.lat){         
                    lat = Math.abs(prvePoint.lat-newPoint.lat)/num;
                    lng = Math.abs(prvePoint.lng-newPoint.lng)/num;
                    points[0] = prvePoint;
                    for(var i = 1;i<num-1;i++){
                        points[i] = new BMap.Point(prvePoint.lng-lng*(i+1),prvePoint.lat-lat*(i+1)); 
                    }
                }
                if(prvePoint.lng>newPoint.lng&&prvePoint.lat<newPoint.lat){         
                    lat = Math.abs(prvePoint.lat-newPoint.lat)/num;
                    lng = Math.abs(prvePoint.lng-newPoint.lng)/num;
                    points[0] = prvePoint;
                    for(var i = 1;i<num-1;i++){
                        points[i] = new BMap.Point(prvePoint.lng-lng*(i+1),prvePoint.lat+lat*(i+1)); 
                    }
                }
                if(prvePoint.lng<newPoint.lng&&prvePoint.lat>newPoint.lat){         
                    lat = Math.abs(prvePoint.lat-newPoint.lat)/num;
                    lng = Math.abs(prvePoint.lng-newPoint.lng)/num;
                    points[0] = prvePoint;
                    for(var i = 1;i<num-1;i++){
                        points[i] = new BMap.Point(prvePoint.lng+lng*(i+1),prvePoint.lat-lat*(i+1)); 
                    }
                }
                if(prvePoint.lng<newPoint.lng&&prvePoint.lat<newPoint.lat){         
                    lat = Math.abs(prvePoint.lat-newPoint.lat)/num;
                    lng = Math.abs(prvePoint.lng-newPoint.lng)/num;
                    points[0] = prvePoint;
                    for(var i = 1;i<num-1;i++){
                        points[i] = new BMap.Point(prvePoint.lng+lng*(i+1),prvePoint.lat+lat*(i+1)); 
                    }
                }

                return points;
            }

            /**
            *@param prvePoint 起点
            *@param newPoint 终点
            *@param points 取两中间的点个数
            *@param speed 速度(单位km/h)
            *@param mkrBus 公交标标注
            */
            function move(allPoints,points,times){
                var paths = allPoints.length;    //获得有几个点
                var time = times[0]/500;
                var j=0;
                mkrBus.addEventListener("click",attribute); 
                function attribute(){
                    alert("点击事件触发");                    
                }
                map.addOverlay(mkrBus);

                var label = new BMap.Label("陕A11111",{offset:new BMap.Size(0,-20)});
                label.setStyle({ border :"1px solid #e0dcd5" ,borderRadius: "5px"})
                mkrBus.setLabel(label);
                i=0;
                function resetMkPoint(i){

                    if(mkrBus.getPosition().lng==points[j].lng&&mkrBus.getPosition().lat==points[j].lat){
                        time = times[j]/500;
                        console.log("第"+i+"个点和points比较值为:"+(mkrBus.getPosition().lng==points[j].lng&&mkrBus.getPosition().lat==points[j].lat));
                        console.log("每次时间为:"+time);
                        j++;
                    }
                    mkrBus.setPosition(allPoints[i]);
                    if(i < paths){
                        setTimeout(function(){
                            i++;
                            resetMkPoint(i);
                        },time);
                    }
                }
                setTimeout(function(){
                    resetMkPoint(0);
                },time)
            }

        </script>


    </body>
</html>
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值