如何将纬度/经度对转换为 PostGIS 地理类型?

Posted

技术标签:

【中文标题】如何将纬度/经度对转换为 PostGIS 地理类型?【英文标题】:How do I convert a latitude/longitude pair into a PostGIS geography type? 【发布时间】: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。死一般的寂静。邮寄名单是我的下一个停靠港。 【参考方案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 几何类型。

以上是关于如何将纬度/经度对转换为 PostGIS 地理类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 cartopy 将显示坐标转换为地理坐标(纬度、经度)?

如何使用 bing 将城市/州转换为地理位置(纬度/经度)?

如何使用谷歌地图 api 将邮政编码转换为地理位置(纬度和经度)?

将地理位置纬度和经度转换为数字格式?

如何将地理坐标转换为像素?

无法将 SSMS 中的列转换为数据类型地理