【问题标题】:How do I convert a latitude/longitude pair into a PostGIS geography type?如何将纬度/经度对转换为 PostGIS 地理类型?
【发布时间】:2011-02-01 04:29:29
【问题描述】:

我正在尝试将一组纬度/经度对加载到 PostGIS 地理类型中,以便能够按位置进行查询。

特别是我有一个带有浮动纬度和经度列和一个geography(Point, 4326) 列的表。我想做

update mytable set geography = ???

文档似乎表明以下内容应该有效:

update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' ||
                                                           longitude || ')');

它没有。我不知道它将这一点解释为什么意思,但它只允许经度介于 -90 和 90 之间,所以它显然不是经度。

那么,我该怎么办?

【问题讨论】:

  • 通过电子邮件发送列表或访问 irc.freenode.net #postgis
  • 我在#postgis。死一般的寂静。邮寄名单是我的下一个停靠港。

标签: database postgresql gis postgis


【解决方案1】:

...叹息。我的愚蠢。显然正确的顺序是经度,纬度。我被愚弄了,以为两个坐标的范围相同(-180 到 180),所以认为发生了更微妙的事情。

【讨论】:

  • 经纬度排序肯定会引入很多错误。
  • 这仍然是一个可怕的答案,您应该接受@MikeT 的建议,使用 ST_MakePoint 而不是引入舍入错误的字符串连接。
  • 你的意思是那些在我发布问题三年和四年后以及我不再遇到问题很久之后制作的那些?
  • @DRMacIver 也许他认为你完全暂停了你的生活并进入了低温睡眠,直到出现答案
【解决方案2】:

以下是制作地理类型的一些不同方法:

  • 将数字 longlat 列转换为 geog 地理类型:

     UPDATE mytable SET geog = ST_SetSRID(ST_MakePoint(long, lat), 4326)::geography
    
  • 使用简单转换将 geom 几何列 (SRID=4326) 转换为 geog 地理类型:

     UPDATE mytable SET geog = geom::geography
    
  • 将投影的 geom 几何列转换为 geog 地理类型:

     UPDATE mytable SET geog = ST_Transform(geom, 4326)::geography
    

请注意,最后两个示例适用于任何几何类型。此外,从几何到地理的转换通常是隐式的,这些示例在没有 ::geography 的情况下工作,但是显式转换通常是这些事情的好习惯。

【讨论】:

    【解决方案3】:

    要在 lat 和 lng 之间进行交换,您可以使用:

    update mytable set geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' ||  st_y(geom) || ')');
    

    有或没有 srid。

    【讨论】:

    • 这个方法会有一些有损舍入错误(即float8textfloat8)。此外,ST_X 仅适用于 POINT 几何类型。
    猜你喜欢
    • 2016-03-21
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多