2010-05-25 47 views
2

有人可以幫助我用原生JavaScript填充空白嗎?在JavaScript中從一個LatLng獲取學位(0-360)

function getHeading(lat1, lon1, lat2, lon2) { 
    // Do cool things with math here 

    return heading; // Should be a number between 0 and 360 
} 

我一直在搞這個很長一段時間,似乎無法讓我的代碼正常工作。

+1

氣味像功課,我 – 2010-05-25 22:23:48

回答

10

Chris Veness在Calculate distance, bearing and more between Latitude/Longitude points下有軸承標題有很好的JavaScript實現。

您可能希望增強谷歌的LatLng原型與getHeading方法,如下所示(使用v3 API):

Number.prototype.toRad = function() { 
    return this * Math.PI/180; 
} 

Number.prototype.toDeg = function() { 
    return this * 180/Math.PI; 
} 

google.maps.LatLng.prototype.getHeading = function(point) { 
    var lat1 = this.lat().toRad(), lat2 = point.lat().toRad(); 
    var dLon = (point.lng() - this.lng()).toRad(); 

    var y = Math.sin(dLon) * Math.cos(lat2); 
    var x = Math.cos(lat1) * Math.sin(lat2) - 
      Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon); 

    var brng = Math.atan2(y, x); 

    return ((brng.toDeg() + 360) % 360); 
} 

然後可以這樣使用:

var pointA = new google.maps.LatLng(40.70, -74.00); 
var pointB = new google.maps.LatLng(40.70, -75.00); 

pointA.getHeading(pointB); // Returns 270 degrees 

否則,如果你喜歡一個全球性的功能,而不是增加谷歌的LatLng,你可以這樣做:

function getHeading(lat1, lon1, lat2, lon2) { 
    var lat1 = lat1 * Math.PI/180; 
    var lat2 = lat2 * Math.PI/180; 
    var dLon = (lon2 - lon1) * Math.PI/180; 

    var y = Math.sin(dLon) * Math.cos(lat2); 
    var x = Math.cos(lat1) * Math.sin(lat2) - 
      Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon); 

    var brng = Math.atan2(y, x); 

    return (((brng * 180/Math.PI) + 360) % 360); 
} 

用法:

getHeading(40.70, -74.00, 40.70, -75.00); // Returns 270 degrees 
+0

愛你的人。這很好。 – 2010-05-25 22:25:02

相關問題