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的主要内容,如果未能解决你的问题,请参考以下文章