我想在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。
答案 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是长。