我所提供的Haversine Distance formula,你可以用它來計算兩個經度/緯度對之間的距離的接近近似的實現。返回的距離可以是任何距離單位,只要你知道所述單位中的地球半徑即可。在這個例子中,我提供了公里和英里數的地球半徑。
請注意傳遞索引爲0的經度和索引爲1的緯度的數組,因爲此函數被編寫爲可與GSON樣式的位置數據一起使用。
您必須先執行SQL查詢,然後計算查詢中結果可用後的距離。
var earth_radius = {
kilometers: 6371,
miles: 3959
};
function toRad(x) {
return x * Math.PI/180;
};
// starting point: [<Float> longitude, <Float> latitude]
// ending point: [<Float> longitude, <Float> latitude]
// units: <Number> earth_radius
function haversineDistance(starting_point, end_point, units) {
units || (units = 1);
var lat1 = parseFloat(starting_point[1]),
lat2 = parseFloat(end_point[1]);
var lon1 = parseFloat(starting_point[0]),
lon2 = parseFloat(end_point[0]);
var dLat = toRad(lat2 - lat1),
dLon = toRad(lon2 - lon1);
lat1 = toRad(lat1);
lat2 = toRad(lat2);
var arc = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
return (2 * Math.atan2(Math.sqrt(arc), Math.sqrt(1 - arc))) * units;
};
// LOS ANGELES, CA
var start = [-118.24, 33.97];
// SAN FRANCISCO, CA
var end = [-122.41, 37.77];
var dist_kilometers = haversineDistance(start, end, earth_radius['kilometers']);
var dist_miles = haversineDistance(start, end, earth_radius['miles']);
假設你已經取得的結果,從您的SQL查詢以及對客戶端的JavaScript可用的用戶的位置設置,你可以很容易地使用JavaScript的原生數組排序函數內的haversineDistance功能,您通過距離的位置排序。
var user_coords = [user_location.longitude, user_location.latitude];
sql_results.sort(function(a, b) {
var a_coords = [a.longitude, a.latitude];
var b_coords = [b.longitude, b.latitude];
var a_dist = haversineDistance(user_coords, a_coords, earth_radius['miles']);
var b_dist = haversineDistance(user_coords, b_coords, earth_radius['miles'])
return a_dist - b_dist;
});
我想這是正確的答案...我不認爲我可以創建一個C函數。所以我堅持我的建議。謝謝 –
有時候這些工具並不是工作所需要的。祝你好運! –