PostGIS ST_Distance_Spheroid 或 Haversine

Posted

技术标签:

【中文标题】PostGIS ST_Distance_Spheroid 或 Haversine【英文标题】:PostGIS ST_Distance_Spheroid or Haversine 【发布时间】:2018-07-22 17:28:36 【问题描述】:

我在 PostgreSQL(使用 Postgis)中使用ST_Distance_Spheroid 来计算 Woking 和 Edinburgh 之间的距离,如下所示:

CREATE TABLE pointsTable (
    id serial NOT NULL,
    name varchar(255) NOT NULL,
    location Point NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO pointsTable (name, location) VALUES 
( 'Woking', '(51.3168, -0.56)' ),
( 'Edinburgh', '(55.9533, -3.1883)' );

SELECT ST_Distance_Spheroid(geometry(a.location), geometry(b.location), 'SPHEROID["WGS 84",6378137,298.257223563]')
FROM pointsTable a, pointsTable b
WHERE a.id=1 AND b.id=2;

我得到了 592 公里(592,053.100454442 米)的结果。

不幸的是,当我使用网络上的各种资源进行相同的计算时,我始终在 543 公里左右,相差 8.2%。

source 1 - 338 英里(543.958 公里) source 2 - 544.410km source 3 - 543.8公里

幸运的是,第三个消息来源澄清说他们使用的是半正弦公式。我不确定其他两个来源。

是我在查询中做错了什么,还是因为使用的公式不同?如果是这样,在保持恒定高度的情况下,哪种计算最接近乌鸦可以飞的最短距离?

【问题讨论】:

【参考方案1】:

你swapped经纬度。如果你把它们按正确的顺序排列,你会得到 544 430m。距离计算使用大圆弧,这是球面上点之间真正的最短距离。

WITH src AS (
  select st_geomfromtext('POINT(-0.56 51.3168)',4326) pt1,
         st_geomfromtext('POINT(-3.1883 55.9533)',4326) pt2)
SELECT 
   ST_DistanceSpheroid(pt1, pt2, 'SPHEROID["WGS 84",6378137,298.257223563]') Dist_sphere,
   ST_Distance(pt1::geography, pt2::geography) Dist_great_circle
FROM src;

   dist_sphere    | dist_great_circle
------------------+-------------------
 544430.941199621 |   544430.94119962
(1 row)

在旁注中,有一个警告

ST_Distance_Spheroid 签名在 2.2.0 中已弃用。请用 ST_DistanceSpheroid

【讨论】:

这是我所希望的最佳解决方案。我以为一切都是纬度,经度而被抓住了,但点当然是 x,y 格式。

以上是关于PostGIS ST_Distance_Spheroid 或 Haversine的主要内容,如果未能解决你的问题,请参考以下文章

错误:匹配 postgis 自定义模式时,函数 postgis_lib_version() 不存在

PostGIS总结

postgersql+postgis

PostGIS中的ST是啥?

安装 PostGIS 的问题

postgresql与postgis结合示例