在PostGIS中从EPSG:4326转换为UTM

Est*_*n S 2 gis postgis utm

我想在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;
Run Code Online (Sandbox Code Playgroud)

我知道"POINT(5262418.33128724 -839958.963432011)"它应该是243625.00,4046330.00UTM 30N中的近似值.如果我从4326转换为UTM,我得到了正确的结果,但不是从UTM到4326.

  • 查询有什么问题?
  • 无论如何从EPSG坐标中得到UTM时区:4326因为我不知道它们是属于30N还是29N?

Tom*_*ico 7

1)您的查询是正确的,但您的坐标是反转的.WKT格式的正确坐标顺序POINT(x y)也是POINT(longitude latitude)

此查询为您提供预期结果:

SELECT ST_AsText(ST_Transform(ST_GeomFromText('POINT(-5.86424016952515 36.5277099609375)',4326),32630)) As check;
Run Code Online (Sandbox Code Playgroud)

2)要从纬度/经度几何获得UTM区域,您可以使用以下公式:

ST_X(input_geometry)+180)/6)+1
Run Code Online (Sandbox Code Playgroud)

做一些调整.

为此我们使用此功能:

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;
Run Code Online (Sandbox Code Playgroud)

与此查询一起使用:

SELECT get_utmzone(ST_GeomFromText('POINT( -5.86424016952515 36.5277099609375)',4326));
Run Code Online (Sandbox Code Playgroud)

结果应该是 32630