2012-06-15 85 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想要一個功能,您不能使用已定義的外部數據庫引擎作爲比較操作的功能,特別是如果通過你提供的語法,它正在從外部評估使用查詢 - 您需要數據來查找值以評估數據應該返回的順序。數據無法在任何地方找到!

相反,您可以創建一個具有額外空列的表格,然後通過HTML在客戶端上通過Javascript進行計算。這將允許多個用戶使用該應用程序,並且您可以在那裏對其進行分類。當然,如果你對這樣做很滿意,你可以在SQLite中創建或定義一個C函數 - 我不熟悉這個過程,但是它的文檔here中有描述。這將允許你在SQL本身中調用它; Select *, Distance(UserLat, UserLong, places.latitude, places.longitude) as dist from places, uservalues order by dist

或者,如建議的那樣,您可以將數據保存回數據庫,但這會限制併發性。

最後,您可以使用MySQL或其他功能更強大的數據庫系統。

+0

我想這是正確的答案...我不認爲我可以創建一個C函數。所以我堅持我的建議。謝謝 –

+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']); 

假設你已經取得的結果,從您的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; 
}); 
+0

這個腳本如何被用來處理這個問題? –

+0

他可以根據需要使用我提供的函數按JavaScript對結果集進行排序。 – severeon

+0

我使用phonegap中的SQLite用於iOS,Android和黑莓應用程序。結果集是否會作爲數組返回?如果是這樣,那麼我想我可以使用你的排序功能。 –