使用 PostgreSQL 查询计算行驶距离

Posted

技术标签:

【中文标题】使用 PostgreSQL 查询计算行驶距离【英文标题】:Calculate distance travelled using PostgreSQL query 【发布时间】:2014-09-24 11:24:20 【问题描述】:

我正在使用 PostgreSQL 存储通过我的 android 应用程序发送到服务器的用户位置。我需要找到用户在特定时间段内行驶的总距离。

用户位置存储在下表中:

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

我检索了记录并使用以下haversine距离方法在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 中计算距离,还是应该继续我目前的方法?在这种情况下,是否有减少距离计算时间的替代方法。

【问题讨论】:

你好,Joyson!您是否尝试安装 earthdistance ?我只是在安装过程中修改了我的答案。 【参考方案1】:

上个月我也遇到了同样的问题。

我将模块 Earthdistance 添加到 PostgreSQL。这个插件添加了计算两点之间大圆距离的函数。

安装很简单:

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

希望有帮助

【讨论】:

安装的 Earthdistance。它有所帮助,因为我不再需要转换我之前从 postgresql 获得的计算距离,并且我直接以英里为单位获得距离。谢谢。 总是乐于提供帮助:)

以上是关于使用 PostgreSQL 查询计算行驶距离的主要内容,如果未能解决你的问题,请参考以下文章

计算手机实际行驶的距离[关闭]

如何在Android中计算行驶方向模式下两点之间的距离

如何获得两点之间的行驶距离?

如何在离散事件模拟中的 Anylogic 中绘制代理在图上行驶的距离?

gps行驶路程怎计算的知道的才说

Xamarin 和谷歌地图上的不同距离