我正在使用PostgreSQL存储用户通过我的Android应用程序发送到服务器的位置。我需要找到用户在特定持续时间内行进的总距离。
用户位置存储在下表中:
CREATE TABLE userlocation
(
latitude character varying,
longitude character varying,
geopoint point,
userid integer,
locationtime timestamp
)
我使用以下hasrsine distance方法检索记录并计算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 :(得分:2)
上个月我遇到了同样的问题。
我将模块Earthdistance添加到PostgreSQL。这个插件添加了计算两点之间的大圆距离的函数。
安装很简单:
CREATE EXTENSION "cube";
CREATE EXTENSION "earthdistance";
希望有所帮助