2016-03-19 28 views
0

這是我會怎麼做手工......有沒有辦法計算從一點到另一點的方位?

我有這三個座標:

var coordinateOne = [-72.642883, 42.201343]; 
var coordinateTwo = [-72.639532, 42.200784]; 
var coordinateThree = [-72.637823, 42.199687]; 

我有了這個圖,這是在中心的第一座標:

var map = new mapboxgl.Map({ 
    container: 'map', 
    style: 'mapbox://styles/mapbox/streets-v8', 
    center: coordinateOne, 
    zoom: 19 
}); 

我可以手動設置軸承,使下一個座標直線前進(不完全,但足夠接近此示例):

map.easeTo({ bearing:109, pitch:60, zoom:19 }); 

然後,我可以飛直行到第二個座標:

map.flyTo({ center:coordinateTwo, zoom: 19 }); 

然後我可以手動重新設置軸承,把第三個座標直行:

map.easeTo({ bearing:130, pitch:60, zoom:19 }); 

然後我就可以一直向前飛到第三個座標:

map.flyTo({ center:coordinateThree, zoom: 19 }); 

有沒有辦法每次自動計算該方位值,這樣e ach flyTo總是直行嗎?


我發現this question,它涵蓋了Java中的這個想法。根據那裏的代碼,我想出了以下代碼關閉,但有更多的垂直角度,而不是直接對齊下一個點。

function bearing(lat1, lon1, lat2, lon2) { 
    var longDiff = lon2 - lon1; 
    var y  = Math.sin(longDiff) * Math.cos(lat2); 
    var x  = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(longDiff); 

    return (toDegrees(Math.atan2(y, x)) + 360) % 360; 
} 

function toDegrees (angle) { 
    return angle * (180/Math.PI); 
} 

回答

0

我發現TurfJS包括bearing測量,所以我使用的。

我放在一起這個函數返回兩個點之間的軸承:

function bearingBetween(coordinate1, coordinate2) { 
    var point1 = { 
    "type": "Feature", 
    "geometry": { 
     "type": "Point", 
     "coordinates": [coordinate1[0], coordinate1[1]] 
    } 
    }; 
    var point2 = { 
    "type": "Feature", 
    "geometry": { 
     "type": "Point", 
     "coordinates": [coordinate2[0], coordinate2[1]] 
    } 
    }; 
    return turf.bearing(point1, point2); 
} 

我用我的easeTo行:

map.easeTo({ bearing: bearingBetween(coordinateOne, coordinateTwo), pitch: 60, zoom: 19 }); 

是TurfJS用來計算這是在代碼的packages/turf-bearing/index.js文件。

相關問題