2010-10-21 71 views
6

我想要做的是:用戶選擇地圖上的開始和目的地,然後從他們的座標中我想顯示地圖上的位置列表中的最近點位置。我有一個簡單的Sqlite數據庫,其中包含可能位置的經度,緯度和名稱。找到最近的Gps指向用戶位置形成一個列表

我做了一些研究,這是我發現:

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

,但這是爲使用它與MySQL和某種空間搜索擴展。 有沒有可能使用android api或external libs做類似的事情?

public Point dialogFindClosestLocationToPoint(geometry.Point aStartPoint){ 
List<PointWithDistance> helperList=new ArrayList<PointWithDistance>(); 
try { 
openDataBase(); 
Cursor c=getCursorQueryWithAllTheData(); 
if(c.moveToFirst()) 
do{ 
    PointWithDistance helper=new PointWithDistance(c.getDouble(1),c.getDouble(2),c.getString(3)); 
    int distance=returnDistanceBetween2Points(aStartPoint, helper); 
    if(distance<MAX_SEARCH_DISTANCE){ 
    helper.setDistance(distance); 
    Log.i("values", helper.name); 
    helperList.add(helper); 
    } 
}while (c.moveToNext()); 
Collections.sort(helperList,new PointComparator()); 

if(helperList!=null) 
return helperList.get(0); 
else return null; 
}catch(SQLException sqle){ 

throw sqle; 

} 
finally{ 
close(); 
} 

這是在PointComparator()類的代碼:

public int compare(PointWithDistance o1, PointWithDistance o2) { 
    return (o1.getDistance()<o2.getDistance() ? -1 : (o1.getDistance()==o2.getDistance() ? 0 : 1)); 
} 

PointWithDistance哪裏是包含一個對象:緯度,經度,距離,名稱

然而這種解決方案不提供正確的回報信息......我意識到這是不可擴展的,而且非常緩慢。我需要一個解決方案,該解決方案可以用最多1000行的數據庫快速執行。

編輯:我有這個代碼現在分揀錯誤我把它換成(應該是<代替>)

回答

2

我一直在尋找一些非常相似,前一段時間:

Android sqlite sort on calculated column (co-ordinates distance)

我是用我的服務器上一個MySQL查詢,MySQL允許你創建一個虛擬列,執行由距離計算和排序,然後你可以設置最大結果返回或最大距離 - 它工作得很好:

Select Lat, Lon, acos(sin($lat)*sin(radians(Lat)) + cos($lat)*cos(radians(Lat))cos(radians(Lon)-$lon))$R As dist From MyTable ORDER BY dist DESC 

我想在我的應用程序執行相同的操作 - 爲了從用戶locati拉開距離拉的所有點讓我展示最接近的。我最終選擇了上述鏈接中提出的解決方案,但意識到它可能不是最佳解決方案,但是可以達到我想要的目的。

+0

我相信你已經通過PHP傳遞變量。 $ lat是您當前的緯度,$ lon是當前的緯度。但是什麼是$ R? – 2012-12-16 19:54:00

+0

不是$ R地球半徑?請參閱:http://www.movable-type.co.uk/scripts/latlong.html – leochab 2013-07-05 07:08:15

1

我還沒有試過運行你的代碼,但它似乎將工作,只是它效率不高。就像你實際上不需要排序一樣,你需要的是最少的提取。

你可以限制你的查詢只是大小爲(2 * MAX_SEARCH_DISTANCE)^ 2(用你的點在中間的方格) 這樣你就可以本地化你的查詢,並且這會返回給你更少的結果來計算距離(?也許不太可能)。對於 當然,這不會幫助,如果您的所有地點都在本地化廣場

另外,我想你可以使用,而不是歐氏哈密頓距離 歐幾里得距離=開方((lat0 - lat1)^ 2 +(lon0 - lon1)^ 2) hamitonian distance =(lat0-lat1)+(lon0 - lon1)

+0

我實際上使用Android Location api中定義的函數來計算兩個gps座標之間的距離。因爲我發現它非常精確,它也考慮到地球的形狀。 「你需要提取的最低限度。」什麼是最好的方式來做到這一點? – DArkO 2010-10-21 18:08:13

3

Thi使用R-Tree可以最有效地完成某種事情。 JSI library提供了一個Java實現,我成功地使用了80,000個位置的索引,每秒處理數千次查找。但是,它可能無法在Android上運行。

+0

是的,我發現一些信息,r-樹是一個很好的解決方案,但我還沒有找到任何Android的圖書​​館到目前爲止。我會繼續尋找並嘗試上面提到的。 – DArkO 2010-10-21 18:19:25

相關問題