我提供了Haversine Distance 公式的实现,您可以使用它来计算两个经度/纬度对之间距离的近似值。返回的距离可以是任何距离单位,只要您知道该单位中的地球半径即可。对于这个例子,我以公里和英里为单位提供了地球的半径。
请注意传递索引为 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 原生数组排序函数中的 hasrsineDistance 函数轻松按距离对位置进行排序。
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;
});