2012-06-15 3 views
0

У меня есть таблица, например:сортировать результаты по расстоянию от местоположения Javascript

CREATE TABLE places (id UNIQUE, name, latitude, longitude) 

я тогда петля через мой набор данных и рассчитать расстояние между местоположением пользователей и моих строк, то я отображение в виде списка в HTML ,

Моя проблема в том, что я не знаю, как отсортировать этот список по возрастающему порядку расстояния.

Я могу сохранить расстояние обратно в таблицу мест, а затем сделать еще один выбор * с возрастающим порядком ...?

Могу ли я не делать что-то вроде выбора моих результатов, а заказать их, запустив функцию javascript. в основном что-то вроде этого:

tx.executeSql('select * from places order by ' 
function getdistance(userLat, UserLong, places.latitude, places.longitude) 

спасибо,

ответ

0

Потому что вы вызываете функцию, которую вы хотите в Javascript, вы не можете использовать функцию, определенную внешние по отношению к ядру базы данных в качестве оператора сравнения, особенно если они используются с помощью синтаксиса вы предоставляете, где в настоящее время оцениваются извне от запрос - вам нужны данные, чтобы найти значение для оценки порядка возврата данных. Невозможно получить данные!

Вместо этого вы можете создать таблицу с лишним пустым столбцом, а затем вычислить ее с помощью Javascript на стороне клиента в HTML. Это позволит нескольким пользователям использовать приложение, и вы можете сортировать его там.

Конечно, если вам это удобно, вы можете создать или определить функцию C в SQLite - я не знаком с процессом, но описан в их документации here. Это позволит вам вызвать его в самом SQL; Select *, Distance(UserLat, UserLong, places.latitude, places.longitude) as dist from places, uservalues order by dist

В качестве альтернативы, как и было предложено, вы можете сохранить данные обратно в базу данных, но это ограничит параллелизм.

Наконец, вы можете использовать MySQL или другую систему баз данных, которая более полно представлена.

+0

Я думаю, это правильный ответ ... Я не думаю, что смогу создать функцию С. Так что я застрял с тем, что предложил. Спасибо –

+0

Иногда инструменты просто не то, что нужно для работы. Удачи! –

1

Я обеспечил реализацию 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; 
}); 
+0

Как этот сценарий может использоваться для решения вопроса? –

+0

Он мог использовать функцию, которую я предоставил, чтобы отсортировать его результирующий набор в JavaScript, по желанию. – severeon

+0

Я использую SQLite из phonegap, который будет использоваться для iOS, Android и Blackberry. результирующий набор возвращается как массив? и если да, то я предполагаю, что могу использовать вашу функцию сортировки. –

Смежные вопросы