百度地圖從後臺獲取實時座標點以實現車輛實時跟蹤
要想實現車輛實時跟蹤,就必須實時獲取車輛的座標點,然後展示在百度地圖上。而實現實時獲取車輛座標點的功能,有兩個方案:方案①定義一個函式getCars(),此函式的功能是通過ajax訪問後臺介面,從而返回車輛的實時位置資訊。然後利用setInterval() 方法,每隔2000毫秒(根據業務需求確定)就呼叫一次獲取車輛實時位置資訊的函式; 方案②:定義一個獲取車輛實時位置資訊的函式getCars(),並在此函式中使用setTimeout() 方法在2000毫秒後重新呼叫上面的函式getCars()。
方案確定好後,怎樣具體實現跟蹤功能呢,且跟蹤時需要將車輛在跟蹤期間走過的路徑繪製出來。
首先,在實現跟蹤之前,應該先把所有車輛當前的位置資訊定位在百度地圖上,且每個車輛對應百度地圖中的一個marker,然後給每個車輛的marker新增一個滑鼠滑過開啟資訊視窗的功能。被開啟的資訊視窗中有一個“跟蹤”按鈕,當用戶點選“跟蹤”按鈕時,就每隔2000毫秒呼叫已經定義好的獲取車輛實時位置資訊的函式getCars()。在getCars()函式中,首先通過ajax呼叫後臺介面,以從後臺獲取到車輛的實時位置資訊;然後將此實時位置資訊push到一個全域性陣列trackMap中,此陣列存放被跟蹤車輛所走過的軌跡座標點;隨後,利用Polyline將trackMap中最新的兩個座標點用線段連線起來,再利用addOverlay將此線段新增到百度地圖中,以作為被跟蹤車輛所走過的歷史軌跡路線;最後,利用marker的setPosition()方法,將代表被跟蹤車輛的marker移動到最新的位置trackMap[trackMap.length - 1
]處,即可。至此,就實現了車輛的實時跟蹤。
var trackMap = [];
function getCars(){ map.panTo(trackMap[trackMap.length - 1]);//將地圖的中心點更改為給定的點。 map.setZoom(14);//將檢視切換到指定的縮放等級,中心點座標不變。 $.ajax({ async:false, cache:true, url: "獲取車輛實時位置資訊的介面", type: 'GET', dataType:'text', success: function(result){ var result = eval('('+ result +')'); /*** 實時獲取經緯度資訊 ***/ sitsLongitude = result.lontitude; sitsLatitude = result.latitude; trackMap.push(new BMap.Point(sitsLongitude, sitsLatitude));//push() 方法可向陣列的末尾新增一個或多個元素,並返回新的長度。 carContent = '<div><br/>經度: '+sitsLongitude+'<br/>緯度: '+sitsLatitude+'<p style="color:green; margin-left:65%;">正在跟蹤中</p></div>'; //addOverlay(overlay: Overlay) : 將覆蓋物新增到地圖中,一個覆蓋物例項只能向地圖中新增一次 //Polyline(points: Array<Point>, opts: PolylineOptions) : 建立折線覆蓋物物件 //PolylineOptions: 此類表示Polyline建構函式的可選引數。 if (trackMap.length > 2) { map.addOverlay(new BMap.Polyline([trackMap[trackMap.length-2], trackMap[trackMap.length - 1]], {strokeColor: "blue", strokeWeight: 3, strokeOpacity: 1, strokeStyle:"dashed"})); } addMouseoverHandler(carContent, carMarker); carMarker.setPosition(trackMap[trackMap.length-1]);//setPosition:設定標註的地理座標 }, error:function(e){ alert("獲取物資資訊失敗"); } }); setTimeout(function(){ //setTimeout() 方法用於在指定的毫秒數後呼叫函式或計算表示式。setTimeout() 只執行 code 一次。如果要多次呼叫,請使用 setInterval() 或者讓 code 自身再次呼叫 setTimeout()。 getCars(); }, 2000); }
需要注意的是:
1. 在使用setPosition()方法設定被跟蹤車輛的最新位置時,應在跟蹤之前,就將代表車輛的marker新增至地圖中,不然setPosition()不會起作用的。具體將車輛marker新增到地圖中的操作,即是跟蹤之前的定位操作,參考我之前的一篇文章:。
2. 為marker新增滑鼠滑過事件addMouseoverHandler(),也參考定位的那篇文章。只是在跟蹤時,需要將最新的經緯度資訊重新獲取後再展示即可。