2013-03-19 151 views
0

我試圖實現從這個site功能。從初始位置,方位和距離得到的位置

φ2= ASIN(SIN(φ1)* COS(d/R)+ COS(φ1)* SIN(d/R)* COS(θ))

λ2=λ1+ ATAN2(罪(θ)* SIN(d/R)* COS(φ1),COS(d/R)-sin(φ1)* SIN(φ2))

//import static java.lang.Math.*;  
public static LatLng fromBearingDistance(double lat1, double lon1, double brng, double d) {  
    double R = 6371.0;  
    double lat2 = Math.asin(Math.sin(lat1)*Math.cos(d/R) + 
       Math.cos(lat1)*Math.sin(d/R)*Math.cos(brng)); 
    double lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(lat1), 
        Math.cos(d/R)-Math.sin(lat1)*Math.sin(lat2)); 
    return new LatLng(lat2,lon2); 
} 

從我的功能的結果是:0.0905,1.710當它應該是53.188 0.133與呼叫

fromBearingDistance(53.32055555555556f, 1.7297222222222224f, 
     96.02166666666666f, 124.8f); 

這是與樣本站點相同的座標。

這裏可能會發生什麼? - 代碼字面上就像是一樣。我改變的唯一的東西是增加雙倍的變數。

我用this網站將度數轉換爲小數。

回答

2

我認爲問題的一部分可能是您的緯度,經度和方位值顯示爲度,而您鏈接的頁面上的公式要求以弧度表示。如果向下滾動頁面,頁面作者實際上已經提供了計算的JavaScript實現,作爲代表位置的LatLon對象的方法。這裏的方法似乎與你正在嘗試做的事情相匹配。注意他在計算之前所做的第一件事是將所有內容都轉換爲弧度,而他所做的最後一件事情是轉換回度數。

/** 
* Returns the destination point from this point having travelled the given distance 
* (in km) on the given initial bearing (bearing may vary before destination is reached) 
* 
* see http://williams.best.vwh.net/avform.htm#LL 
* 
* @param {Number} brng: Initial bearing in degrees 
* @param {Number} dist: Distance in km 
* @returns {LatLon} Destination point 
*/ 
LatLon.prototype.destinationPoint = function(brng, dist) 
{ 
    dist = typeof(dist)=='number' ? dist : typeof(dist)=='string' && dist.trim()!='' ? +dist : NaN; 
    dist = dist/this._radius; // convert dist to angular distance in radians 
    brng = brng.toRad(); // 
    var lat1 = this._lat.toRad(), lon1 = this._lon.toRad(); 

    var lat2 = Math.asin(Math.sin(lat1)*Math.cos(dist) + 
         Math.cos(lat1)*Math.sin(dist)*Math.cos(brng)); 
    var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1), 
           Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2)); 
    lon2 = (lon2+3*Math.PI) % (2*Math.PI) - Math.PI; // normalise to -180..+180º 

    return new LatLon(lat2.toDeg(), lon2.toDeg()); 
} 

java.lang.Math類有自度來回轉換成弧度方法,所以它應該是很容易與他們改造你的代碼。

+0

非常好,現在工作完美。另外我想我錯誤地計算了實際數據! – Andrew 2013-03-19 16:28:51