在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()可以用来实现这个吗?
答案 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