1. 程式人生 > >百度地圖從後臺獲取實時座標點以實現車輛實時跟蹤

百度地圖從後臺獲取實時座標點以實現車輛實時跟蹤

       要想實現車輛實時跟蹤,就必須實時獲取車輛的座標點,然後展示在百度地圖上。而實現實時獲取車輛座標點的功能,有兩個方案:方案①定義一個函式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(),也參考定位的那篇文章。只是在跟蹤時,需要將最新的經緯度資訊重新獲取後再展示即可。