美文网首页Web 前端开发 @IT·互联网
对百度地图js-api多车辆的路线显示及点击显示信息的总结

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

作者: 贵在坚持shion_hxc | 来源:发表于2017-02-20 20:24 被阅读0次

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

  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

相关文章

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

    总结一下最近研究百度地图的一些成果,针对物流路线的自定义复杂覆盖物的写法。获取密钥、初始化百度地图这些基本的在这里...

  • 百度地图开发禁用点击事件

    在百度地图二次开发的时候,有的界面只是想显示自己的数据,不希望点击之后出现详情信息,比如公交路线、附近等等,那么在...

  • 基于Android平台的全球地图方案

    现状 百度地图、高德地图在国外无法显示详细地面信息或显示不全面,Google Map在国内不好使。 需求 根据坐标...

  • 前端如何做到滚动条+内边距+变量问题解决

    今天遇到一共要求做一个点击查询数据,要求显示数据,并且点击事件触发百度地图显示对应数据并且按距离排序问题,如图 这...

  • iOS 表格Cell展开

    simpleCell:显示简单的信息,点击显示/隐藏 detailCell detailCell:显示详细的信息,...

  • 百度地图API调用

    调用百度地图的API可以非常方便的实现我们需要的地图的功能,今天研究了一下调用百度地图API,显示定位信息、地图标...

  • 坐错车?

    今天,与好友相约出去玩。由于对这个城市不太熟,是用百度地图查的路线。于是,一脸自信地坐上地图显示的公交车。 路上风...

  • 百度地图知识

    在ios中点击标注(BMKAnnotationView)会弹出一个气泡显示信息,我们怎么能默认进入地图后,就显示标...

  • 2015/3/26

    1. android 如何使用百度地图显示 某些地理位置信息(图标)? answer: 1. 1)初始化百度地图空...

  • Echart不显示地图问题

    Echart不显示地图的问题 使用百度Echart的时候遇到不会显示地图的问题,是现在Echart不直接提供地图需...

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/fdbrwttx.html