在PostGIS中将EPSG:4326转换为UTM

4

我想在PostGIS中将坐标系从EPSG:4326转换为UTM(30N/EPSG:32630或29N/EPSG:32629)。我执行以下查询,但结果不正确:

SELECT ST_AsText(ST_Transform(ST_GeomFromText('POINT(36.5277099609375 -5.86424016952515)',4326),32630)) As check;

当应该是大约为243625.00,4046330.00 在UTM 30N中时,我得到了" POINT(5262418.33128724 -839958.963432011)"。如果我将其从4326转换为UTM,则得到正确的结果,但不是从UTM到4326。

  • 查询有什么问题?
  • 是否有任何方法可以从EPSG:4326中的坐标获取UTM时区,因为我不知道它们属于30N还是29N?
3个回答

9

1)您的查询是正确的,但是您的坐标被颠倒了。在WKT格式中,正确的坐标顺序是POINT(x y),也可以是POINT(longitude latitude)

这个查询将给您期望的结果:

SELECT ST_AsText(ST_Transform(ST_GeomFromText('POINT(-5.86424016952515 36.5277099609375)',4326),32630)) As check;

2) 要从经纬度几何图形中获取UTM区域,您可以使用以下公式:

ST_X(input_geometry)+180)/6)+1

通过一些调整,我们可以使用以下函数:

CREATE OR REPLACE FUNCTION get_utmzone(input_geom geometry)
  RETURNS integer AS
$BODY$
DECLARE
   zone int;
   pref int;
BEGIN
   IF GeometryType(input_geom) != 'POINT' THEN
     RAISE EXCEPTION 'Input geom must be a point. Currently is: %', GeometryType(input_geom);
   END IF;
   IF ST_Y(input_geom) >0 THEN
      pref:=32600;
   ELSE
      pref:=32700;
   END IF;
   zone = floor((ST_X(input_geom)+180)/6)+1;
   RETURN zone+pref;
END;
$BODY$
LANGUAGE plpgsql IMMUTABLE;

使用以下查询:

SELECT get_utmzone(ST_GeomFromText('POINT( -5.86424016952515 36.5277099609375)',4326));

结果应该是32630

上面有一个小错误。您必须修改:SELECT utmzone(ST_GeomFromText('POINT( -5.86424016952515 36.5277099609375)',4326));为:SELECT get_utmzone(ST_GeomFromText('POINT( -5.86424016952515 36.5277099609375)',4326)); - aborruso
函数的源代码在哪里?也许在 https://lists.osgeo.org/pipermail/postgis-users/2005-December/010253.html。 - Peter Krauss

1

首先,根据OpenGIS WKT Point(x,y)的文档,您的POINT(36.5277099609375 -5.86424016952515)位于赤道以南,因此您需要使用29S(EPSG:32729)和30S(EPSG:32730)。


0
原因是因为不是POINT(36.5277099609375 -5.86424016952515),而是POINT(-5.86424016952515 36.5277099609375),因为经纬度取决于系统。通常X=经度,Y=纬度,但例如在Google地图中,X是纬度,Y是经度。

这不是一个答案,可能只是一条评论。仅仅是对Tommaso 2015年的文本“...你的坐标被倒置了”进行加强。 - Peter Krauss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接