在 PostGIS 中从 EPSG:4326 转换为 UTM

Convert from EPSG:4326 to UTM in PostGIS

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

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

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

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

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

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) 要从 lat/long 几何中获取 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