2014-09-24 92 views
1

我正在使用PostgreSQL來存儲由我的android應用程序發送到服務器的用戶的位置。我需要找出用戶在特定時間段內的總行程。使用PostgreSQL查詢計算行程距離

用戶位置被存儲在下表中:

CREATE TABLE userlocation 
(
latitude character varying, 
longitude character varying, 
geopoint point, 
userid integer, 
locationtime timestamp 
) 

我檢索到的記錄,並使用以下半正矢距離的方法計算在Java的距離:

public double getdistance(final double lat1, final double lon1, final double lat2, final double lon2, final char unit) { 
    final double theta = lon1 - lon2; 
    double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) 
      + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) 
      * Math.cos(deg2rad(theta)); 
    dist = Math.acos(dist); 
    dist = rad2deg(dist); 
    dist = dist * 60 * 1.1515; 
    if (unit == 'K') { 
     dist = dist * 1.609344; 
    } else if (unit == 'N') { 
     dist = dist * 0.8684; 
    } 
    if (Double.isNaN(dist)) { 
     dist = 0.0; 
    } 
    return (dist); 
} 

然而這種計算是時間特別是在計算多天的距離時,因爲有很多記錄。我決定嘗試在數據庫級別進行距離計算以減少計算時間。我發現下面的查詢,讓我計算距離某一點:

SELECT latitude, longitude, geopoint <-> '19.23,72.89' AS distance FROM userlocation ORDER BY distance; 

我試圖創建一個查詢,要麼返回的總行駛距離或至少計算連續兩行和存儲之間的距離它在另一列,以便我用Java計算總和而不是距離計算。

我試過尋找解決方案,但是我一直找不到。關於SO的大部分問題都涉及兩點之間的距離計算。

我目前沒有PostGIS。有可能在PostgreSQL中計算距離,還是應該繼續使用我目前的方法?在那種情況下,可以選擇減少距離計算時間。

+0

喜久勝!你嘗試安裝接地距離嗎?我剛剛通過安裝過程修改了我的答案。 – Abincepto 2014-09-25 12:22:15

回答

2

上個月我有同樣的問題。

我將模塊Earthdistance添加到PostgreSQL中。這個插件添加函數來計算兩個點之間的大圓距離。

安裝簡單:

CREATE EXTENSION "cube"; 
CREATE EXTENSION "earthdistance"; 

希望幫助

+0

安裝接地距離。這有助於我不再需要轉換我之前從postgresql獲得的計算距離,並且直接以英里計算距離。謝謝。 – Joyson 2014-10-10 04:55:47

+0

總是樂於幫助:) – Abincepto 2014-10-10 08:06:16