2014-09-24 85 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