OpenLayers學習筆記(十二)— 飛機速度矢量線預測(二)

之前有一篇博客簡單寫了一個模擬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]);
}

在更新數據的位置調用該函數傳參即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章