1. 程式人生 > 其它 >使用騰訊位置服務API完成車輛軌跡回放(模擬真實的速度和方向)

使用騰訊位置服務API完成車輛軌跡回放(模擬真實的速度和方向)

產品需求:

根據能夠回放出來車輛的執行軌跡路線、執行方向和速度。

需求分析:

1、首先因為是Web網頁端的功能,所以需要用到的是地圖模組的API,可以選擇百度地圖或者騰訊地圖。

2、由於需要位置資訊,所以地圖需要支援點到點的路線繪製功能。

3、關鍵點:需要一個小車,並且小車是可以根據不同的方向而改變車頭朝向。

因為前兩點功能百度地圖API可以滿足,但是第三點,騰訊地圖LBS,更新了新版本的介面,圖示可以自動根據方向改變朝向。所以選擇騰訊地址,減少開放量,另外就是直接API支援,減少了很多的BUG。

開發前的準備:

1、在騰訊位置服務中註冊為開發者:

2、在控制檯配置Key

配置完成之後,就可以通過開發文件-web前端-JavaScript-API來獲取騰訊位置服務的LBS元件

開始開發:

第一步:畫頁面,初始化地圖:

把key中的XXXXXXXXXXX更換為我們剛才在騰訊地圖LBS後臺獲取的key。

<!DOCTYPE html>
<html lang="en">
 
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>marker軌跡回放-全域性模式</title>
</head>
<script charset="utf-8" src="https://map.qq.com/api/gljs?v=1.exp&key=XXXXXXXXXXX"></script>
<style type="text/css">
  html,
  body {
    height: 100%;
    margin: 0px;
    padding: 0px;
  }
 
  #container {
    width: 100%;
    height: 100%;
  }
</style>
 
<body>
  <div id="container"></div>
  <script type="text/javascript">
    var center = new TMap.LatLng(30.465512, 114.402740);
    //初始化地圖
    var map = new TMap.Map("container", {
      zoom: 15,
      center: center
    });
 
  </script>
</body>
 
</html>

效果如圖所示:

第二步:畫路線,並根據路線模擬執行

這裡需要注意的是,如果路線比較複雜,儘可能的使用分鐘級,甚至秒級的座標,這樣繪製的軌跡也會更精準。速度的展示,需要後臺在記錄座標的時候計算好,並實時反饋。

 <script type="text/javascript">
    var center = new TMap.LatLng(39.984104, 116.307503);
    //初始化地圖
    var map = new TMap.Map("container", {
      zoom: 15,
      center: center
    });
 
    var path = [
      new TMap.LatLng(39.98481500648338, 116.30571126937866),
      new TMap.LatLng(39.982266575222155, 116.30596876144409),
      new TMap.LatLng(39.982348784165886, 116.3111400604248),
      new TMap.LatLng(39.978813710266024, 116.3111400604248),
      new TMap.LatLng(39.978813710266024, 116.31699800491333)
    ];
 
    var polylineLayer = new TMap.MultiPolyline({
      map, // 繪製到目標地圖
      // 折線樣式定義
      styles: {
        'style_blue': new TMap.PolylineStyle({
          'color': '#3777FF', //線填充色
          'width': 4, //折線寬度
          'borderWidth': 2, //邊線寬度
          'borderColor': '#FFF', //邊線顏色
          'lineCap': 'round' //線端頭方式
        })
      },
      geometries: [{
        styleId: 'style_blue',
        paths: path
      }],
    });
 
    var marker = new TMap.MultiMarker({
      map,
      styles: {
        'car-down': new TMap.MarkerStyle({
          'width': 40,
          'height': 40,
          'anchor': {
            x: 20,
            y: 20,
          },
          'faceTo': 'map',
          'rotate': 180,
          'src': 'https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/car.png',
        }),
        "start": new TMap.MarkerStyle({
          "width": 25,
          "height": 35,
          "anchor": { x: 16, y: 32 },
          "src": 'https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/start.png'
        }),
        "end": new TMap.MarkerStyle({
          "width": 25,
          "height": 35,
          "anchor": { x: 16, y: 32 },
          "src": 'https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/end.png'
        })
      },
      geometries: [{
        id: 'car',
        styleId: 'car-down',
        position: new TMap.LatLng(39.98481500648338, 116.30571126937866),
      },{
        "id": 'start',
        "styleId": 'start',
        "position": new TMap.LatLng(39.98481500648338, 116.30571126937866)
      }, {
        "id": 'end',
        "styleId": 'end',
        "position": new TMap.LatLng(39.978813710266024, 116.31699800491333)
      }]
    });
    marker.moveAlong({  
      'car': {
        path,
        speed: 250
      }
    }, {
      autoRotation:true
    })
  </script>

另外需要後臺配合的是:

1、把汽車的軌跡座標,按照秒級/分鐘級記錄,同時記錄下軌跡記錄的時間。

2、把座標繪製成軌跡,而不是僅僅設定起點和終點。

3、軌跡與軌跡之間用地圖計算出來距離,然後除以時間計算出來速度。前端地圖實時更新 marker.moveAlong中的car的速度。來達到軌跡回放跟實際車輛執行速度一致的目的。

總結:
使用騰訊位置服務API,是目前最簡單的可以花軌跡+Mark圖示跟隨軌跡移動+Mark圖示可以自適應轉向的實現。