【问题标题】:How to calculate distance from latitude and longitude如何计算经纬度的距离
【发布时间】:2016-11-09 19:39:49
【问题描述】:

在 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 中的答案如何用 produral 语言实现。

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

【问题讨论】:

  • 对此的答案包含 C#、Javascript 和 Java 中的代码。他们使用 sql 中不可用的 for 循环。如何在 sql 或 Postgres 中实现这一点?可能应该使用一些窗口函数。
  • ???有很多没有循环的答案。这个想法是引入haversine公式,你可以用任何你想要的语言来应用它。有了那个你已经知道的代表,你不能指望得到一个没有任何解决问题尝试的问题的复制意大利面答案。
  • mlinth 很好的答案看起来像复制和粘贴答案。有问题的尝试描述不是强制性的。那么为什么我不应该期待这样的答案呢?

标签: javascript sql postgresql geolocation plpgsql


【解决方案1】:

我假设您想要从最早点到下一个最早点的距离,依此类推...

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

首先,安装 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;

这个使用distinct on 的查询应该适用于所有版本:

 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

【讨论】:

  • CREATE EXTENSION POSTGIS 返回ERROR: could not open extension control file "/usr/share/postgresql/9.1/extension/postgis.control": No such file or directory 此目录中还有其他扩展但没有 postgis。如何在 Debian Squeeze x64 Linux 的 Postgres 9.1 中安装 postgis?
  • 从未尝试过,但有一个指南,例如这里:postgis.net/install
  • 此页面写道,postgis 在 9.1 中不受支持。如何使用公式而不是 postgis 进行距离计算?
  • 好吧,我在页面上看不到。 Postgis 一直在比 9.1 更旧的 Postgres 版本上运行,所以我确信可以安装它。只需谷歌“安装 postgis linux”。安装 postgis 并使用它的距离计算比编写自己的函数更容易。
  • 好吧,鉴于它出现在 Teemu 发布的链接中,可能是的,但请注意,您的坐标需要以弧度表示。这里有答案:stackoverflow.com/questions/6975669/…
猜你喜欢
  • 2011-12-02
  • 1970-01-01
  • 2016-06-27
  • 2015-08-14
  • 1970-01-01
  • 2012-10-13
  • 2012-01-26
  • 2023-03-08
  • 2013-04-16
相关资源
最近更新 更多