2013-10-20 35 views
0

如何計算「我當前的地理位置」(我使用navigator.geolocation.watchPosition獲得的座標)和同時說10個其他(固定)座標之間的距離?「我當前的地理位置」和其他座標之間的計算

我想跟蹤距離,所以如果「我當前的地理位置」在某個座標==的特定半徑範圍內,會發生一些令人驚奇的事情。

我可以使用Haversine距離公式解決這個問題嗎?

所有的計算都在一個較小的區域(一個城市)內,所以我需要以米爲單位而不是以公里爲單位來計算結果。

謝謝你的時間和輸入!

/a。

回答

0

harvesine公式只是一個特殊的公式。但它適用於你的問題。如果你想要更好的結果,你可以嘗試vincenty公式。它使用橢球體地球。只需循環遍歷每一點並計算距離即可。

+0

或者,我可以使用谷歌地圖API相同功能? – adamloke

+0

你是什麼意思?有Google方向API。如果這是你的意思,那麼是的。 – Bytemain

0

在赤道5座標(小數點後0.00001)= 1.1057米Latidude & 1.1132米經度。

隨着座標從赤道移動到極點,經度值下降。

 
Degree| Latidude | Longitude 
------------------------------ 
0° | 1.1057 m |1.1132 m 
15° | 1.1064 m |1.0755 m 
30° | 1.1085 m |0.9648 m 
45° | 1.1113 m |0.7884 m 
60° | 1.1141 m |0.5580 m 
75° | 1.1161 m |0.2890 m 
90° | 1.1169 m |0.0000 m 

如果你的距離很小,你可以使用帶有latidude校正的Pythagoras或使用Haversine。

下面的代碼使用半正弦波

var lat1 =55.00001;//Point 1 nearest 
var lng1 =-2.00001 ; 
//var lat1 =55.00002;//Point 2 nearest 
//var lng1 =-2.00002 ; 

//Array of points 
var coordArray = [[55.00000,-2.00000],[55.00003,-2.00003],[55.00006,-2.00006],[55.00009,-2.00009],[55.00012,-2.00012]]; 

function toRad(Value) { 
    /** Converts numeric degrees to radians */ 
    return Value * Math.PI/180; 
} 

function Round(Number, DecimalPlaces) { 
    return Math.round(parseFloat(Number) * Math.pow(10, DecimalPlaces))/Math.pow(10, DecimalPlaces); 
} 
function haversine(lat1,lat2,lng1,lng2){ 
    rad = 6371000; // meters 
    deltaLat = toRad(lat2-lat1); 
    deltaLng = toRad(lng2-lng1); 
    lat1 = toRad(lat1); 
    lat2 = toRad(lat2); 
    a = Math.sin(deltaLat/2) * Math.sin(deltaLat/2) + Math.sin(deltaLng/2) * Math.sin(deltaLng/2) * Math.cos(lat1) * Math.cos(lat2); 
    c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    return rad * c; 
} 
function calculate(){ 
    var result = haversine(lat1,coordArray [0][0],lng1,coordArray [0][1]); 
    var index = 0; 
    for (var i=1;i<coordArray.length;i++){ 
     var ans = haversine(lat1,coordArray [i][0],lng1,coordArray [i][1]); 
     if (ans < result){ 
      result = ans; 
      index++; 
     } 

    } 
    document.write("Result = " +Round(result,2)+ " Meters Point = "+ (index+1)); 
} 

Fiddle

+0

謝謝!這有幫助! – adamloke

+0

它完全回答你的問題嗎? –

相關問題