2017-10-13 118 views
0

我想顯示一個基於到每個位置的用戶距離的列表。這些位置是以Firebox的JSON形式接收的。如何根據緯度和經度獲得兩個地點之間的距離?

獲取用戶的位置,我使用的是:

navigator.geolocation.getCurrentPosition(function(position) { 
     var latitude = position.coords.latitude; 
     var longitude = position.coords.longitude; 

你知道的方式來解決這JSON的距離,並列出它(具有多個子節點)?

謝謝。

+0

你還收到'{lat,lng}'的清單嗎? –

+0

是的,我收到每個位置的{lat,lng,...}列表。 – featorres

+0

我會給你寫答案 –

回答

1

你有兩種方式可以進入一些其他的緯度/經度緯度/經度之間的距離:

- 使用谷歌API

function getDistanceOneToOne(lat1, lng1, lat2, lng2) 
    { 
     const Location1Str = lat1 + "," + lng1; 
     const Location2Str = lat2 + "," + lng2; 

     let ApiURL = "https://maps.googleapis.com/maps/api/distancematrix/json?"; 

     let params = `origins=${Location1Str}&destinations=${Location2Str}&key=${GOOGLE_API_KEY}`; // you need to get a key 
     let finalApiURL = `${ApiURL}${encodeURI(params)}`; 

     let fetchResult = await fetch(finalApiURL); // call API 
     let Result = await fetchResult.json(); // extract json 

     return Result.rows[0].elements[0].distance; 
    } 

這需要移動網絡連接,但它提供了駕駛距離(與駕駛導航儀完全相同)PLUS更多信息(例如,持續時間到達),與提供直線距離的第二種方法不同。

對於上述你需要get a Google Api Key。這裏更多的信息:Google Maps Api

- 用純數學

這發生在本地設備上,它提供了兩個緯度/經度之間的直線距離。

function distance(lat1, lon1, lat2, lon2, unit) { 
    var radlat1 = Math.PI * lat1/180 
    var radlat2 = Math.PI * lat2/180 
    var theta = lon1-lon2 
    var radtheta = Math.PI * theta/180 
    var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta); 
    dist = Math.acos(dist) 
    dist = dist * 180/Math.PI 
    dist = dist * 60 * 1.1515 
    if (unit=="K") { dist = dist * 1.609344 } 
    if (unit=="M") { dist = dist * 0.8684 } 
    return dist 
} 

運行上述每個項目之一,你會得到每個的距離。希望有所幫助。

相關問題