【问题标题】:How to configure PostgreSQL with Postgis to calculate distances如何使用 Postgis 配置 PostgreSQL 以计算距离
【发布时间】:2019-02-25 23:17:11
【问题描述】:

我知道这可能是个愚蠢的问题,但我正在寻找一段时间,但找不到正确的答案。 我安装了 PostGIS 的 PostgreSQL 数据库。在一张表中,我有带有 lon lat 的条目(假设列是 place、lon、lat)。

我应该在这张表中添加什么或/以及我可以使用什么程序,以便能够以米为单位计算这些地方之间的距离。

我读到有必要知道一个地方的 SRID 才能计算距离。是否有可能不知道/使用它,但仍然能够仅根据 lon lat 以米为单位计算距离?

【问题讨论】:

    标签: postgresql gis postgis


    【解决方案1】:

    简答:

    只需使用ST_MakePoint 即时转换您的 x,y 值(注意开销!)并计算与给定点的距离,默认 SRS 将为WGS84

    SELECT ST_Distance(ST_MakePoint(lon,lat)::GEOGRAPHY,
                       ST_MakePoint(23.73,37.99)::GEOGRAPHY) FROM places;
    

    使用GEOGRAPHY 会得到以米为单位的结果,而使用GEOMETRY 会得到以度为单位的结果。当然,知道坐标对的 SRS 是计算距离的必要条件,但是如果你能控制数据质量并且坐标是一致的(在这种情况下,省略 SRS),那就不用担心了。如果您计划使用外部数据执行操作,这将开始变得棘手,您也不知道 SRS 并且它可能与您的不同。

    长答案:

    好吧,如果您使用的是 PostGIS,那么您首先不应该在分隔列中使用 x,y。你可以很容易地添加一个几何/地理列做这样的事情。

    这是你的桌子...

    CREATE TABLE places (place TEXT, lon NUMERIC, lat NUMERIC);
    

    包含以下数据..

    INSERT INTO places VALUES ('Budva',18.84,42.92),
                              ('Ohrid',20.80,41.14);
    

    以下是添加地理类型列的方法:

    ALTER TABLE places ADD COLUMN geo GEOGRAPHY;
    

    添加列后,您可以通过以下方式将坐标转换为地理/几何图形并更新表格:

    UPDATE places SET geo = ST_MakePoint(lon,lat);
    

    要计算距离,您只需要使用函数ST_Distance,如下(距离以米为单位):

    SELECT ST_Distance(geo,ST_MakePoint(23.73,37.99)) FROM places;
    
       st_distance   
    -----------------
     686560.16822422
     430876.07368955
    (2 Zeilen)
    

    如果你的位置参数在WKT,你也可以使用:

    SELECT ST_Distance(geo,'POINT(23.73 37.99)') FROM places;
       st_distance   
    -----------------
     686560.16822422
     430876.07368955
    (2 Zeilen)
    

    【讨论】:

    • 谢谢@Jim!那行得通,我可以准确地计算距离。但它显示的结果与在谷歌地图中测量距离不同。 Select ST_DISTANCE(ST_MakePoint(51.501428, -0.191247)::GEOGRAPHY, ST_MakePoint(51.506544, -0.189391)::GEOGRAPHY); 结果是 605m,但是用谷歌地图测量时它显示为 652m。哪一个是正确的,如果我的错误,我该如何解决?
    • @chamber5 geography 类型将隐式使用 spheroidal 代数(基于 WGS84 椭球,实现 Vincenty 的距离公式);这可能是您将获得的最精确的测量结果。不是 100% 确定谷歌 究竟 计算的是什么;它要么完成庞大的任务并考虑到海拔(非常不可能),要么基于球形代数(可能),或者基于他们的Web Mercator i> 投影,它不适合 anything 距离相关(很可能,在该比例上存在差异)。顺便说一句,确保您在空间索引几何/地理列!
    • @chamber5 你后面的评论提出了一个很好的观点。我还要考虑到这个距离是以“直线”的形式计算的,而谷歌地图可能正在使用道路网络(这里我只是在推测......从未使用谷歌地图进行 GIS 操作)。长话短说:在 PostGIS 中,没有比这更精确的了。我希望这可以帮助你进一步......干杯!
    猜你喜欢
    • 2014-05-15
    • 1970-01-01
    • 2014-08-28
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多