对百度地图js-api多车辆的路线显示及点击显示信息的总结

总结一下最近研究百度地图的一些成果,针对物流路线的自定义复杂覆盖物的写法。
获取密钥、初始化百度地图这些基本的在这里就不讲了,详细的参考百度地图官方文档。
这里会详细介绍:

  1. 自定义车辆图标并在当前位置上标注;
  2. 点击车辆图标绘制车辆的规划路线(已走过的和未走过的用不同颜色标注)和各个状态点的状态信息;
  3. 定义自定义覆盖物;
  4. 点击状态点切换显示、隐藏提示信息;
  5. 自动调整最佳视野

先上效果图

  1. 初始化显示车辆当前位置


    1.jpg
  2. 点击车辆图标绘制车辆的规划路线(已走过的和未走过的用不同颜色标注)和各个状态点的状态信息,并自动调整视野


    2.jpg
  3. 点击状态点切换显示、隐藏提示信息(自定义覆盖物)
3.jpg

下面是代码和分析

首先模拟两辆车的数据(两辆车的处理方式和多辆车的方式基本一致)

var car1 = [
        ["113.208619", "23.170208","广州","装车","2016-12-05 19:47:03"],        
        ["112.622218","26.979794","","装车","2016-12-05 19:47:03"],
        ["113.006332","28.263503","长沙","当前位置","2016-12-05 19:47:03"],
        ["111.731111","40.842",,"呼和浩特","暂未到达目的地"]
    ];
var car2 = [
        ["120.230199","30.215376","","装车","2016-12-05 19:47:03"],   
        ["108.945456","34.366566","西安","当前位置","2016-12-05 19:47:03"],
        ["87.504831","43.937895",,"乌鲁木齐","暂未到达目的地"]     
    ];

1.自定义车辆图标并在当前位置上标注;
ps:默认倒数第二个位置为当前位置,楼主偷懒将当前位置的坐标直接拿来用了,项目中看实际情况灵活运用

初始化百度地图详见百度地图api

currentLocation(["113.006332","28.263503"]);
currentLocation(["108.945456","34.366566"]);
function currentLocation(curPosArr){
    var curPt = new BMap.Point(curPosArr[0],curPosArr[1]);
    var curIcon = new BMap.Icon("img/working.png",new BMap.Size(28,20));
    var curMarker = new BMap.Marker(curPt,{icon:curIcon});
    mp.addOverlay(curMarker);
};

2.点击车辆图标绘制车辆的规划路线(已走过的和未走过的用不同颜色标注);
ps:这一步是最关键也是最复杂的一步;

currentLocation(["113.006332","28.263503"],car1);
currentLocation(["108.945456","34.366566"],car2);
function currentLocation(curPosArr,carArr){
    var curPt = new BMap.Point(curPosArr[0],curPosArr[1]);
    var curIcon = new BMap.Icon("img/working.png",new BMap.Size(28,20));
    var curMarker = new BMap.Marker(curPt,{icon:curIcon});
    mp.addOverlay(curMarker);
    var isDraw = false;                             //状态:确定是否已经绘制过路线
    curMarker.onclick = function(){                 //给当前标注添加点击事件 ->绘制当前车辆的路线图
        drawPath(carArr,isDraw);                    //绘制路径
        isDraw = true;                              //切换状态为已经绘制过路径
    }
};
function drawPath(carArr,isDraw){
    if(isDraw){                 //若绘制过路线  返回 false
        return false;
    };
    var pointArr = [];
    var ptNum = 0;  
    var driving = new BMap.DrivingRoute(mp);    //创建驾车实例    
    for(var i = 0,len = carArr.length;i<len;i++){
        var point = new BMap.Point(carArr[i][0],carArr[i][1]);
        pointArr[i] = point;
    };
    var len = pointArr.length-1;
    initRoute(ptNum);
    function initRoute(num){
        driving.search(pointArr[num],pointArr[num+1]);
        driving.setSearchCompleteCallback(function(){
            var plan = driving.getResults().getPlan(0);         
            var pts = plan.getRoute(0).getPath();
            var lineCor = ptNum == (len-1) ? 'red':"#1aea0a";
            var lineSty = ptNum == (len-1) ? 'dashed':"solid";
            var polyline = new BMap.Polyline(pts,{strokeColor:lineCor, strokeWeight:3, strokeOpacity:0.8,strokeStyle:lineSty}); 
            mp.addOverlay(polyline);            
            //查找下两个点
            ptNum++;
            if(ptNum < len){
                initRoute(ptNum);
            }
        });
    };                  
    mp.setViewport(pointArr);       //自动调整视野
};

3.显示各个状态点的状态
定义复杂的自定义覆盖物

function ComplexCustomOverlay(point,state,time) {
    this._point = point;
    this.state = state;
    this.time = time;
};
ComplexCustomOverlay.prototype = new BMap.Overlay();
ComplexCustomOverlay.prototype.initialize = function(map) {
    this._map = map;
    var div = this._div = document.createElement("div");
    $(div).addClass('state-wrap');
    var str =   '<div class="logistics-wrap">';
        str +=      '<div class="logistics-state">'+this.state+'</div>';
        str +=      '<div class="logistics-time">'+this.time+'</div>';
        str +=  '</div>';
    div.innerHTML = str;
    mp.getPanes().labelPane.appendChild(div);
    var he = div.offsetHeight;
    this._he = he;          //当前div的高度
    return div;
};
ComplexCustomOverlay.prototype.draw = function() {
    var map = this._map;
    var pixel = map.pointToOverlayPixel(this._point);
    this._div.style.left = pixel.x -24+"px";
    this._div.style.top = pixel.y -this._he+5+ "px";
};
自定义复杂覆盖物结束,具体样式可以写在样式表中,然后调用(注:创建实例必须在自定义覆盖物后面调用)
var myComOverlay = new ComplexCustomOverlay(point,state,time);      //创建自定义覆盖物实例
mp.addOverlay(myComOverlay);

4.自定义复杂覆盖物和各个点的位置图标加入
最后整体的代码和用到的图片如下(ps:注意目录结构,图片在img文件夹里)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            body,
            html {
                width: 100%;
                height: 100%;
                margin: 0;
                font-family: "微软雅黑";
            }           
            #mapcontainer {
                width: 100%;
                height: 100%;
                position: relative;
            }
            .state-wrap{                
                padding-bottom: 16px;
                position: absolute;
                left: 0;
                top: 0;
                font-size: 12px;
                line-height: 16px;
                background:url(img/map_label.png) no-repeat left bottom;                
            }
            .logistics-wrap{
                background: #fff;
                padding: 10px;
            }
            .logistics-state,.logistics-time{
                padding-left: 25px;
                height: 25px;
                line-height: 25px;
                width: 125px;
                overflow: hidden;
                text-overflow : ellipsis;
                white-space: nowrap;
            }
            .logistics-state{
                background:url(img/state_icon.png) no-repeat left center;
            }
            .logistics-time{
                background:url(img/clock_icon.png) no-repeat left center;       
            }
        </style>
    </head>
    <body>
        <div id="mapcontainer"></div>
        <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的密钥"></script>
        <script src="//cdn.bootcss.com/jquery/1.11.0/jquery.min.js"></script>
        <script type="text/javascript">
            $(document).ready(function(){
                var car1 = [
                    ["113.208619", "23.170208","广州","装车","2016-12-05 19:47:03"],                    
                    ["112.622218","26.979794","","装车","2016-12-05 19:47:03"],           
                    ["113.006332","28.263503","长沙","当前位置","2016-12-05 19:47:03"],
                    ["111.731111","40.842",,"呼和浩特","暂未到达目的地"]
                ];
                var car2 = [
                    ["120.230199","30.215376","","装车","2016-12-05 19:47:03"],               
                    ["108.945456","34.366566","西安","当前位置","2016-12-05 19:47:03"],
                    ["87.504831","43.937895",,"乌鲁木齐","暂未到达目的地"]                 
                ];
                var mp = new BMap.Map("mapcontainer", {enableMapClick:false});
                mp.centerAndZoom(new BMap.Point(112.438233, 34.654336), 6);
                mp.enableScrollWheelZoom(); 
                currentLocation(["113.006332","28.263503"],car1);
                currentLocation(["108.945456","34.366566"],car2);
                //标注当前车辆坐标位置
                function currentLocation(curPosArr,carArr){
                    var curPt = new BMap.Point(curPosArr[0],curPosArr[1]);      //当前位置
                    var curIcon = new BMap.Icon("img/working.png",new BMap.Size(28,20));
                    var curMarker = new BMap.Marker(curPt,{icon:curIcon});
                    mp.addOverlay(curMarker);
                    var isDraw = false;             //是否已经绘制过路线
                    curMarker.onclick = function(){         
                        drawPath(carArr,isDraw);
                        isDraw = true;
                    }       
                };
                //绘制路线
                function drawPath(carArr,isDraw){
                    if(isDraw){                 //若绘制过路线  返回 false
                        return false;
                    };
                    var pointArr = [];
                    var ptNum = 0;      
                    var driving = new BMap.DrivingRoute(mp);    //创建驾车实例
                    // 复杂的自定义覆盖物
                    function ComplexCustomOverlay(point,state,time) {
                        this._point = point;
                        this.state = state;
                        this.time = time;
                    };
                    ComplexCustomOverlay.prototype = new BMap.Overlay();
                    ComplexCustomOverlay.prototype.initialize = function(map) {
                        this._map = map;
                        var div = this._div = document.createElement("div");
                        $(div).addClass('state-wrap');                  
                        var str =   '<div class="logistics-wrap">';
                            str +=      '<div class="logistics-state">'+this.state+'</div>';
                            str +=      '<div class="logistics-time">'+this.time+'</div>';
                            str +=  '</div>';
                        div.innerHTML = str;
                        mp.getPanes().labelPane.appendChild(div);
                        var he = div.offsetHeight;
                        this._he = he;          //当前div的高度
                        return div;
                    };
                    ComplexCustomOverlay.prototype.draw = function() {
                        var map = this._map;
                        var pixel = map.pointToOverlayPixel(this._point);
                        this._div.style.left = pixel.x -24+"px";
                        this._div.style.top = pixel.y -this._he+5+ "px";
                    };
                    /*自定义复杂覆盖物结束*/
                    for(var i = 0,len = carArr.length;i<len;i++){
                        var point = new BMap.Point(carArr[i][0],carArr[i][1]);
                        pointArr[i] = point;
                        var myIcon = new BMap.Icon("img/location_icon.png",new BMap.Size(9,9));
                        var marker = new BMap.Marker(point,{icon:myIcon});  // 创建标注
                        mp.addOverlay(marker);                              // 将标注添加到地图中    
                        //此处解决在for循环中添加事件总是执行最后一个的情况,传入参数并且立即执行
                        (function(point,state,time){                        
                            var myComOverlay = new ComplexCustomOverlay(point,state,time);
                            mp.addOverlay(myComOverlay);
                            marker.onclick = function(){                    //给各个点添加点击事件,显示、隐藏自定义复杂物
                                if(myComOverlay.isVisible()){
                                    myComOverlay.hide();
                                }else{
                                    myComOverlay.show();
                                }
                            }
                        })(point,carArr[i][3], carArr[i][4]);           
                    };
                    var len = pointArr.length-1;
                    initRoute(ptNum);
                    function initRoute(num){
                        driving.search(pointArr[num],pointArr[num+1]);
                        driving.setSearchCompleteCallback(function(){
                            var plan = driving.getResults().getPlan(0);
                            var pts = plan.getRoute(0).getPath();
                            var lineCor = ptNum == (len-1) ? 'red':"#1aea0a";
                            var lineSty = ptNum == (len-1) ? 'dashed':"solid";
                            var polyline = new BMap.Polyline(pts,{strokeColor:lineCor, strokeWeight:3, strokeOpacity:0.8,strokeStyle:lineSty});     
                            mp.addOverlay(polyline);                
                            //查找下两个点
                            ptNum++;
                            if(ptNum < len){
                                initRoute(ptNum);
                            }
                        });
                    };                  
                    mp.setViewport(pointArr);       //自动调整视野
                };
            })
        </script>
    </body>
</html>

用到的图标

clock_icon.png

location_icon.png

map_label.png

state_icon.png

working.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,401评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 今天分享关于公安机关公文写作的一些拙见,应该对初涉公安公文写作的小白们有些帮助,不求句句真知,但求抛砖引玉...
    艾小慕阅读 13,729评论 6 19
  • AMD https://github.com/amdjs/amdjs-api/wiki/AMD-(%E4%B8%...
    丁小时候阅读 314评论 0 0