在PostGIS中从EPSG:4326转换为UTM

时间:2015-09-28 10:49:53

标签: 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;

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

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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