代码之家  ›  专栏  ›  技术社区  ›  Programster

PostGIS ST_Distance_球体或Haversine

  •  0
  • Programster  · 技术社区  · 8 年前

    我用过 ST_Distance_Spheroid 在PostgreSQL(带有Postgis)中,计算沃金和爱丁堡之间的距离,如下所示:

    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公里(592053.100454442米)的成绩。

    不幸的是,当我使用网络上的各种资源进行相同的计算时,我始终得到543公里的分数,这个分数相差了8.2%。

    幸运的是,第三个消息来源澄清了他们使用的是哈弗辛公式。我不确定其他两个消息来源。

    我是在查询中做错了什么,还是因为使用的公式不同?如果是这样的话,哪种计算方法最接近乌鸦能飞的最短距离?

    1 回复  |  直到 7 年前
        1
  •  2
  •   JGH    7 年前

    swapped 纬度和经度如果你把它们按正确的顺序排列,你会得到544430米。计算距离的方法是使用大圆弧,这是球体上点之间的最短距离。

    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_球体签名在2.2.0中被弃用。请使用 圣约远球体

    推荐文章