如何计算纬度和经度的距离

时间:2016-11-09 19:39:50

标签: javascript sql postgresql geolocation plpgsql

在Postgres 9.1+数据库中包含路线点:

create table doksyndm (
id serial primary key,
readingtime timestamp with time zone not null,
latitude float,
longitude float
 );

使用javascript中的navigator.geolocation调用从浏览器保存点数。

如何根据此数据计算路线长度? 路线不到300公里,因此点之间的直线长度可以相加。 它应该适用于Postgres 9.1及更新版本。

结果应该是一个数字,以千米为单位的点之间的总距离。 如果这是合理的话,数据库和javascript代码发送点可以重新考虑。

Calculate distance between two points in google maps V3中的答案如何在生产语言中实现这一点。

它们使用for循环,这在SQL中不可用。带有窗口函数的Maby SUM()可以用来实现这个吗?

1 个答案:

答案 0 :(得分:1)

我假设你想要从最早的点到下一个最早的距离,等等...

从Postgresql 9.3开始,有一个使用Godoc的优雅解决方案。

首先,安装postgis扩展,以便您可以使用其距离函数:

CREATE EXTENSION POSTGIS;

现在查询:

 SELECT SUM(st_distance(st_point(a.longitude,a.latitude)::geography,
                       st_point(b.longitude,b.latitude)::geography)
            ) / 1000 AS distance_km FROM doksyndm a
LEFT JOIN LATERAL
 (SELECT * FROM doksyndm WHERE readingtime > a.readingtime limit 1) b ON TRUE;

使用lateral join的此查询应适用于所有版本:

 SELECT SUM (st_distance(st_point(alon,alat)::geography,
              st_point(blon,blat)::geography))/1000 as distance_km FROM
    ( select distinct ON (a.readingtime) a.readingtime, 
                                        a.latitude as alat,
                                        a.longitude as alon, 
                                        b.latitude as blat ,
                                        b.longitude as blon
    FROM doksyndm a inner join doksyndm b on a.readingtime < b.readingtime
 ORDER by a.readingtime,b.readingtime) x