我正在尝试将一堆纬度/经度对加载到PostGIS地理类型中,以便能够按位置查询。
特别是我有一个包含浮动纬度和经度列以及geography(Point, 4326)
列的表格。我想做
update mytable set geography = ???
文档似乎表明以下内容应该有效:
update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' ||
longitude || ')');
没有。我不知道它是什么意思解释这一点,但它只允许经度介于-90和90之间,所以它显然不是经度。
那么,我该怎么办?
答案 0 :(得分:37)
...叹息。我的愚蠢。显然,正确的顺序是经度,纬度。我被骗以为两个坐标都有相同的范围(-180到180),所以想到了一些更微妙的东西。
答案 1 :(得分:8)
以下是制作地理类型的一些方法:
将数字long
和lat
列转换为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
的情况下工作,但是显式转换通常是这些事情的好习惯。
答案 2 :(得分:5)
要在lat和lng之间执行交换,您可以使用:
update mytable set geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' || st_y(geom) || ')');
有或没有srid。