2014-01-27 43 views
1

我正在製作一個應用程序來跟蹤通過GPS驅動的路線,對於我使用SQLite的數據庫。當前位置發生變化時,數據(緯度,經度,日期)將被保存到數據庫中,所以我在我的數據庫中有許多座標+日期的列表。Android java從sqlite計算距離很多座標

現在,我想要計算整個路線的距離。我知道開始和結束位置以及中間位置。我也知道如何計算兩個位置之間的距離。我不知道如何計算所有分段的距離。有人能幫我嗎?

我這是怎麼計算兩個位置之間的距離:

private double calculateDistance(double fromLong, double fromLat,double toLong, double toLat) { 
    double d2r = Math.PI/180; 
    double dLong = (toLong - fromLong) * d2r; 
    double dLat = (toLat - fromLat) * d2r; 
    double a = Math.pow(Math.sin(dLat/2.0), 2) + Math.cos(fromLat * d2r) 
      * Math.cos(toLat * d2r) * Math.pow(Math.sin(dLong/2.0), 2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    double d = 6367000 * c; 
    return Math.round(d); 

} 
+0

我可以在兩個座標之間計算,但我琬t要計算的整個路線 –

+0

您需要計算每個段和總和。由於錯誤彙總,這也很複雜。 – KarlP

+0

我也在想它,但我不知道如何...與列表,或類似的東西? –

回答

0

OK,因爲你正在努力。這是一個開始:

假設你有一份準備好的聲明是這樣的:

select lat, lon from position order by save_date 

您能不能總結段是這樣的:

double total = 0.0; 
double a_lat; 
double a_lon; 


// first lat 
if(rs.next() == false) return 0.0; // nothing in db. 

a_lat = rs.getDouble("lat"); 
a_lon = rs.getDouble("lon"); 

while(rs.next()) { 
    b_lat = rs.getDouble("lat"); 
    b_lon = rs.getDouble("lon"); 

    double segment = calcLength(a_lat, a_lon, b_lat, b_lon); 
    if(segment < MINIMUM_SEG_LENGTH) { 
     continue; // skip this point, it's too close to the previous. 
    } 
    total+=segmentLength; 

    a_lat = b_lat; // oops, forgot this. 
    a_lon = b_lon; 
} 

return total; 
+0

如果分段很短,由於積累錯誤,總長度不會很準確。如果段長度太小,最好簡單地跳過點。 – KarlP

+0

謝謝,我會試試:) –