3

我想在 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;

我知道"POINT(5262418.33128724 -839958.963432011)"它应该近似于243625.00,4046330.00UTM 30N。如果我进行从 4326 到 UTM 的转换,我会得到正确的结果,但不是从 UTM 到 4326。

  • 查询有什么问题?
  • 并且无论如何都可以从 EPSG:4326 中的坐标获取 UTM 时区,因为我不知道它们属于 30N 还是 29N?
4

3 回答 3

8

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

于 2015-09-28T12:43:41.937 回答
1

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

于 2015-09-28T12:42:01.537 回答
0

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

于 2015-09-28T12:43:08.080 回答