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