1. 程式人生 > 實用技巧 >百度地圖分佈圖(百度地圖api司機位置實時定位分佈圖)

百度地圖分佈圖(百度地圖api司機位置實時定位分佈圖)

就類似於我們使用共享單車app的時候,可以看到我們周圍的空閒單車分佈。e代駕 在後臺管理系統需求裡也有此功能,目的是為了實時看到目標城市下的所有司機狀態。

一、controller

//controller file

//$drivers 是拿到當前城市所有的司機資訊 
foreach($drivers as $driver) {
            
                $driver_phone=$driver['phone'];
                $last_latitude=$driver->position->baidu_lat;
                
$last_longitude=$driver->position->baidu_lng; $last_phone=$driver['phone']; $last_name=$driver['name']; $driver_name=$driver['user']; //極速查勘的司機 空閒-藍 2 忙碌-紫 4 $_iStatusJiSuChaKan = $this->getDriverStatusJiSuChaKan($driver
['user'],$_iStatus); if(!empty($_iStatusJiSuChaKan)){ $_iStatus = $_iStatusJiSuChaKan; } $addPoint.=sprintf('marker = addDriver(%s, %s, "%s",%s);'."\n", $last_latitude, $last_longitude, $driver_name, $_iStatus); }
$data['list']=$addPoint; //然後把$data丟給view
//print_r($data);
Array
(
    [city] => 北京
    [addPoint] => marker = addDriver(32.059339, 118.787148, "BJ9010",0);
marker = addDriver(40.018634, 116.479259, "BJ9017",0);
marker = addDriver(39.855547, 116.504390, "BJ5780",0);
marker = addDriver(40.019712, 116.472373, "BJ6162",0);
marker = addDriver(39.898936, 116.518997, "BJ6792",0);
marker = addDriver(39.876989, 116.481366, "BJ9031",1);
marker = addDriver(39.951750, 116.520674, "BJ6900",0);
marker = addDriver(39.852491, 116.281912, "BJ7063",0);
marker = addDriver(39.981293, 116.522406, "BJ7185",0);
marker = addDriver(39.986936, 116.322063, "BJ7516",0);
)

二、view

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="/css/bootstrap.css" />
<script type="text/javascript" src="/js/jquery.min.js"></script>
<script type="text/javascript" src="/js/map.js"></script>
<title>司機位置實時分佈圖</title>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=ECfffb5..........." ></script>  //這裡是申請的appkey
<script type="text/javascript" src="http://api.map.baidu.com/library/GeoUtils/1.2/src/GeoUtils_min.js"></script>
<style type="text/css">
body, html,#map_canvas {width: 100%;height: 100%;overflow: hidden;margin:0;}
.container-fluid {padding:0px;}
.shoppingcart{position:absolute;top:10px;width:203px;color:#000;height:28px;right:0px;font-weight:bold;font-size:15px;}
.cart_open {padding:0 5px;right:200px;margin-bottom:5px;}
.cart_open dl {margin:0;padding:0;height:30px;padding-left:8px;clear:both}
.cart_open dd {float:left;padding-top:5px;padding-right:0px;line-height:20px;}
.cart_open a {color:red;}
.cart_open dd.name {width:75%;height:20px;display:block;text-align:left;}
.cart_open span {clear:both;line-height:20px;font-size:12px;color:#F00;text-align:center;color:#000;display:block;color:#000}
.flyout-menu {display:none;position:absolute;visibility:hidden;z-index:999999;}
</style>
</head>
<body>
    <div class="container-fluid">
        <div class="row-fluid">
        
<div class="span9">
    <div id="map_canvas"></div>
    <div class="shoppingcart" id="shoppingcart"></div>
</div>
<div class="span3" style="margin-top:20px;">
   
</div>
<div class="span3">
<div style=" float:left;width:23px; height:25px; display: inline ;background:url(/img/us_cursor.gif) no-repeat 0px -21px;"></div>
<div style=" float:left;display: inline ;">空閒</div><div style=" float:left;width:23px; height:25px; display: inline ;background:url(/img/us_cursor.gif) no-repeat -23px -21px;"></div>
<div style=" float:left;display: inline ;">工作</div><div style=" float:left;width:23px; height:25px; display: inline ;background:url(/img/us_cursor.gif) no-repeat -46px -21px;"></div>
<div style=" float:left;display: inline ;">極速查勘(空閒)</div><div style=" float:left;width:23px; height:25px; display: inline ;background:url(/img/us_cursor.gif) no-repeat -69px -21px;"></div>
<div style=" float:left;display: inline ;">代保養</div><div style=" float:left;width:23px; height:25px; display: inline ;background:url(/img/us_cursor.gif) no-repeat -92px -21px;"></div>
<div style=" float:left;display: inline ;">極速查勘(工作)</div></div>
<div class="span3">
    <label class="alert alert-info">當前城市:北京</label> 
<form class="navbar-form pull-left span12" id="driver-map-form" action="r=driver/map" method="post">        <label>司機工號:</label>
        <input type="text" name="driver_id" id="driver_id" value="" class="span11" autocompl
ete="off">
    <label>地圖查詢地址:</label>
    <input type="text" name="address" id="address" value="北京" class="span11" autocomplete="off">
    <label>服務型別:</label>
    <select name="service_type" id="service_type">
<option value="">全部</option>
<option value="00000000000000000000000000000001">代駕</option>
<option value="00000000000000000000000000000010">車後-代洗車</option>
<option value="00000000000000000000000000000100">車後-代保養</option>
<option value="00000000000000000000000000001001">平安-急速查勘</option>
<option value="00000000000000000000000000010001">平安-坐享式理賠</option>
<option value="00000000000000000000000000100000">車後-充電英雄</option>
<option value="00000000000000000000000001000000">車後-代驗車</option>
<option value="00000000000000000000000010000000">女司機</option>
<option value="00000000000000000000010000000000">專職女司機</option>
<option value="00000000000000000000000100000000">貨車司機</option>
<option value="00000000000000000000001000000000">金牌接駕司機</option>
</select>    <button type="submit" class="btn">查詢</button>
    </form>      
        </div>
</div>

<script type="text/javascript">
var markers = [];

function addMarkers(){
    bds = map.getBounds();
    for(i=0;i<markers.length;i++){
        var result = BMapLib.GeoUtils.isPointInRect(markers[i].getPosition(), bds);
        if(result == true)
            map.addOverlay(markers[i]);
        else
            map.removeOverlay(markers[i]);
    }
}

function addDriver(latitude, longitude, driver_id, status, $message){
    var marker;
    var point = new BMap.Point(longitude, latitude);
    var myIcon = new BMap.Icon("/img/us_cursor.gif", new BMap.Size(23, 25), {
        offset: new BMap.Size(10, 25),
        imageOffset: new BMap.Size(0-status*23,-21)
    });

        var marker = new BMap.Marker(point, {icon: myIcon});
        message = '';
        var opts = {title : '<span style="font-size:16px;color:#0A8021">' + driver_id + '</span>'};
        var infoWindow = new BMap.InfoWindow('', opts);  // 建立資訊視窗物件

        //map.addOverlay(marker);
        marker.addEventListener("click", function(){

        //這裡是或許司機最新狀態
            $.ajax({
                url: "index.php",
                data: {r:'client/ajax',method:'driver_get', driver_id:driver_id},
                success: function(data){
                    infoWindow.setTitle('<span style="font-size:16px;color:#0A8021">' + data.driverInfo.name+ ' ' + driver_id + '</span>');
                    switch(data.driverInfo.state){
                        case "0":
                            infoWindow.setContent($message);
                              break;
                          case "1":
                              infoWindow.setContent(data.driverInfo.name + '工作中');
                              break;
                          case "2":
                              infoWindow.setContent(data.driverInfo.name + '已下班');
                              break;
                    }
                },
                dataType: "json"
            });
            this.openInfoWindow(infoWindow);
        });
        markers.push(marker);
}


//這裡是從後端讀取的資料,獲取當前城市的司機座標和工號
marker = addDriver(32.059339, 118.787148, "BJ9010",0);
marker = addDriver(40.018634, 116.479259, "BJ9017",0);
marker = addDriver(39.855547, 116.504390, "BJ5780",0);
marker = addDriver(40.019712, 116.472373, "BJ6162",0);
marker = addDriver(39.898936, 116.518997, "BJ6792",0);
marker = addDriver(39.876989, 116.481366, "BJ9031",1);
marker = addDriver(39.951750, 116.520674, "BJ6900",0);
marker = addDriver(39.852491, 116.281912, "BJ7063",0);
marker = addDriver(39.981293, 116.522406, "BJ7185",0);
marker = addDriver(39.986936, 116.322063, "BJ7516",0);

var all_count = 0;
var all_longtitude = 0;
var all_latitude = 0;

var options = {
  onSearchComplete: function(results){
    // 判斷狀態是否正確
    var i = 0;
    if(local.getStatus() == BMAP_STATUS_SUCCESS){
        for(i = 0; i < results.getCurrentNumPois(); i++){
            all_count++;
            all_longtitude += results.getPoi(i).point.lng;
            all_latitude += results.getPoi(i).point.lat;

            addPointWithPic(results.getPoi(i).point.lat, results.getPoi(i).point.lng,results.getPoi(i).title+":"+results.getPoi(i).address, 4);
        }
    }

    if(all_count>0){
        var point = new BMap.Point(all_longtitude/all_count,all_latitude/all_count);
        map.centerAndZoom(point, 12);
    }else{
        var point = new BMap.Point(116.39633672727,39.922375818182);
        map.centerAndZoom(point, 5);
    }

    address = $('input#address').prop("defaultValue");
    $('input#address').val(address);
  }
};

var map = new BMap.Map("map_canvas");
var opts = {anchor: BMAP_ANCHOR_TOP_RIGHT, offset: new BMap.Size(10, 10)};
map.addControl(new BMap.NavigationControl(opts));

map.enableScrollWheelZoom();
map.addEventListener("tilesloaded", addMarkers);
map.addEventListener("zoomend", addMarkers);
map.addEventListener("moveend", addMarkers);

var ac = new BMap.Autocomplete(
    {"input" : "address",
     "location" : "北京"
});




var local = new BMap.LocalSearch("北京", options);
console.log(local);
local.search("北京");

//定時重新整理
$().ready(function(){
    if (self == top) {
        setInterval(function(){location.href = 'r=driver/map'}, 300000);
    }
})
</script>
        </div>
    </div>
</body>
</html>

三、js

function addClient(latitude, longitude){
    var point = new BMap.Point(longitude, latitude);
    var myIcon = new BMap.Icon("http://openapi.baidu.com/map/images/us_mk_icon.png", new BMap.Size(22, 21), {
        offset: new BMap.Size(22, 21),
        imageOffset: new BMap.Size(0, 0) 
    });
    

    translateCallback = function (point){
        var marker = new BMap.Marker(point, {icon:myIcon});
        map.addOverlay(marker);
    }    

    BMap.Convertor.translate(point,2,translateCallback);    
}


function addPoint(latitude, longitude, message, title){
    var marker;
    var point = new BMap.Point(longitude, latitude);

    translateCallback = function (point){
        marker = new BMap.Marker(point);
        var opts = {title : '<span style="font-size:14px;color:#0A8021">' + title + '</span>'};
        var infoWindow = new BMap.InfoWindow(message, opts);  // 建立資訊視窗物件

        map.addOverlay(marker);
        marker.addEventListener("click", function(){          
           this.openInfoWindow(infoWindow);  
        });
    }    

    BMap.Convertor.translate(point,2,translateCallback);    
}

function addPointWithPic(latitude, longitude, message, index){
    var point = new BMap.Point(longitude, latitude);
    var myIcon = new BMap.Icon("../img/us_cursor.gif", new BMap.Size(23, 21), {
        offset: new BMap.Size(10, 21),
        imageOffset: new BMap.Size(0 - index * 23,0) 
    });
    
    var marker = new BMap.Marker(point, {icon:myIcon});
    var opts = {};
    
    var infoWindow = new BMap.InfoWindow(message, opts);  // 建立資訊視窗物件
    
    map.addOverlay(marker);
    
    marker.addEventListener("click", function(){          
        this.openInfoWindow(infoWindow);  
    });
}

function addPointIndex(latitude, longitude, index, message){
  var point = new BMap.Point(longitude, latitude);

  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 marker = new BMap.Marker(point, {icon: myIcon});
  map.addOverlay(marker);

  var opts = {
    /*
    width : 250,     // 資訊視窗寬度
    height: 100,     // 資訊視窗高度
    title : title // 資訊視窗標題
     */
    }

    var infoWindow = new BMap.InfoWindow(message, opts);  // 建立資訊視窗物件

    marker.addEventListener("click", function(){          
       this.openInfoWindow(infoWindow);  
    });
}

四、image

五、測試效果圖

六、線上效果(晚上,20:36分)