2010-10-11 96 views
1

我在做應用程序,其中使用sqlite數據庫文件來獲取數據。 db中有店名,地址,城市,緯度,經度等欄目。如何從當前位置獲得10個最近的位置

我能夠獲得位置的經緯度,並且能夠使用經度和緯度值計算當前位置和商店位置之間的距離(以db爲單位)。

這裏我的問題是 我需要/顯示距離當前位置最近(距離)的10個商店名稱(從d​​b)。

請建議我或者給一個參考鏈接來解決這個問題

謝謝

回答

2

thousands upon thousands of sites,讓您計算兩點間的距離公式。大多數人認爲你想考慮地球的曲率;沒有這一點,它是簡單的幾何(畢達哥拉斯定理)。在僞代碼:

的sqrt((X1-X2)^ 2 +(Y1-Y2)^ 2)

建設,體現了無論公式您在ORDER BY條款選擇一個SQL查詢,考慮到記錄您正在搜索的固定點的經度和緯度。既然你不關心絕對距離,而只是距離的大小,你可能會做一些東西來節省CPU時間,比如跳過畢達哥拉斯定理的平方根部分。

要將結果集限制爲10,請在查詢中使用LIMIT 10,您將獲得前10個匹配。

+0

烏拉圭回合的答覆您好感謝,ü意味着我需要在查詢本身使用上面給出的公式。我的疑問是,如果我們提交經緯度數據,可以得到距離..... – praveenb 2010-10-12 04:35:59

1

請注意,如果您有很多位置,SQLite將不會是進行地理查詢的理想平臺。您必須爲每個查詢的每一行執行一次距離計算,這將是CPU密集型和緩慢的。

您可能最好定位一個可以進行地理索引並以兼容格式提供數據的庫。 (嘗試搜索「Java地理索引」。)Lucene有一個地理擴展,但我不知道它是否超出了Alpha。

0

另一種方法是將「最近的」代碼移動到網絡中某個應用程序服務器上。這樣你就不會在移動設備上執行任何cpu密集型的東西,它只需要一個活動的inet連接。

0

我最近創建了一個應用程序,就像這樣,這是我如何做它:

distance = locationA.distanceTo(locationB); 

        if (distance <= 1000 * 10) 
//the 1000 stands for one kilometer, times 10 means 10 kilometers 
{ 

          point = new GeoPoint(
           (int) (lat * 1E6), 
           (int) (lng * 1E6)); 
         OverlayItem overlayItem = new OverlayItem(point, name, 
           suburb+", "+state+", "+postcode); 
         itemizedOverlay.addOverlay(overlayItem); 


       }