31

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

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

update mytable set geography = ???

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

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

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

那么,我该怎么办?

4

3 回答 3

39

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

于 2010-03-26T14:36:46.583 回答
9

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

  • 将数值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,但是显式转换通常是这些事情的好习惯。

于 2014-10-28T04:28:12.063 回答
5

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

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

有或没有srid。

于 2011-09-05T16:29:46.510 回答