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