Я обеспечил реализацию 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']);
Предполагая, что вы сделали результирующий набор из вашего запроса, а также местоположения пользователей, доступных на стороне клиента JavaScript, вы можете легко отсортировать места по расстоянию, используя функцию haversineDistance внутри JavaScripts родной функции массива сортировки ,
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;
});
Я думаю, это правильный ответ ... Я не думаю, что смогу создать функцию С. Так что я застрял с тем, что предложил. Спасибо –
Иногда инструменты просто не то, что нужно для работы. Удачи! –