之前有一篇博客簡單寫了一個模擬demo,根據物體當前的速度和方向預測多少時間後所在的位置,具體計算是參考《(譯)計算距離、方位以及更多經緯度之間的點》,現在重新用計算公式實現,代碼如下:
let from, to;
let createVelLine = obj => {
const DEG2RAD = Math.PI / 180;
const RAD2DEG = 180 / Math.PI;
const radius = 6371.0088; //km
const KTS2KPH = 1.85200;
let pred_secs = 30; //預測未來30s的軌跡線
//角度轉弧度
let latFrom = obj.latitude * DEG2RAD;
let lonFrom = obj.longitude * DEG2RAD;
let bearing = obj.rotation;
//30s後預測點的距離
if (map.getView().getZoom() < 8) pred_secs *= 4;
let distance = obj.speed * KTS2KPH * (pred_secs / 3600); //公里 H
//計算預測點座標
let latTo = Math.asin(
Math.sin(latFrom) * Math.cos(distance / radius) +
Math.cos(latFrom) * Math.sin(distance / radius) * Math.cos(bearing));
let lonTo = lonFrom + Math.atan2(
Math.sin(bearing) * Math.sin(distance / radius) * Math.cos(latFrom),
Math.cos(distance / radius) - Math.sin(latFrom) * Math.sin(latTo)
);
lonTo = ((lonTo + 3 * Math.PI) % (2 * Math.PI)) - Math.PI;
//弧度轉角度
let lat_dist = latTo * RAD2DEG;
let lon_dist = lonTo * RAD2DEG;
//轉換成起點和終點座標
from = ol.proj.fromLonLat([obj.longitude, obj.latitude]);
to = ol.proj.fromLonLat([lon_dist, lat_dist]);
}
在更新數據的位置調用該函數傳參即可。