【问题标题】:Calculate distance between 2 points (approximately)计算2点之间的距离(大约)
【发布时间】:2021-08-06 20:52:18
【问题描述】:

使用 PostGis 3.0、Postgres 12.4,我试图找到荷兰两点之间的距离。根据谷歌地图,这应该是大约 5 公里(直线,见下图)。 下面的函数都给出了大约 8 公里,这是相当遥远的。

我在某处找到的 calcDistance 存储过程做得相当不错(5 公里),但在查询包含大量记录的表时,这是一种相当慢的方法,按与某处随机点的最短距离排序。

我试图找到正确的球体,但似乎找不到正确的解决方案。我应该使用其他球体('SPHEROID["WGS 84", 6378137, 298.257223563]' 是我能找到的唯一一个)作为荷兰经线之间的距离(纬度 > 52.0)吗?

SELECT

    "calcDistance"(52.2209471, 6.8945723, 52.221687, 6.969117) as calcDistance,

    st_distancespheroid('POINT(52.2209471 6.8945723)'::geometry,
                        'POINT(52.221687 6.969117)'::geometry,
                                'SPHEROID["WGS 84", 6378137, 298.257223563]')/1000 as distancespheroid,

    st_distancesphere('POINT(52.2209471 6.8945723)'::geometry,
                        'POINT(52.221687 6.969117)'::geometry) as distancesphere,

    st_distance(
            ST_GeographyFromText('POINT(52.2209471 6.8945723)'),
            ST_GeographyFromText('POINT(52.2216870 6.9691170)')
    );

这是谷歌地图告诉我的:

【问题讨论】:

  • 您是否尝试在点声明中交换坐标? IIRC,它们应该以相反的顺序通过。一些违反直觉的东西......
  • 至少当我遇到完全相同的问题时,这有帮助:)
  • 确实如此。我的错。多么愚蠢。谢谢!

标签: postgresql postgis distance latitude-longitude


【解决方案1】:

您显示的坐标不在荷兰,而是在非洲之角附近的某处海域。不要忘记在 PostGIS 中,经度是第一个坐标。

如果你交换坐标,事情会开始变得更好:

SELECT st_distance(
          ST_GeographyFromText('POINT(6.8945723 52.2209471)'),
          ST_GeographyFromText('POINT(6.9691170 52.2216870)')
       );

  st_distance  
═══════════════
 5094.96164985
(1 row)

【讨论】:

    【解决方案2】:

    你切换了 x 和 y。它是经度,纬度,而不是相反。:

    SELECT ST_Distance('POINT(6.8945723 52.2209471)'::geography,
                       'POINT(6.969117 52.221687)'::geography);
    
     st_distance  
    ---------------
     5094.96164985
    (1 Zeile)
    

    演示:db<>fiddle

    【讨论】:

    • @Ronald 不要对自己太苛刻。这是迄今为止 GIS 中最常见的错误。我同意,这不是很直观 :) 干杯
    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2010-10-30
    相关资源
    最近更新 更多