Преобразование из EPSG: 4326 в UTM в PostGIS

Я хочу преобразовать EPSG:4326 в UTM (30N/EPSG:32630 или 29N/EPSG:32629) в PostGIS. Я делаю следующий запрос, но получаю неправильные результаты:

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?

person Esteban S    schedule 28.09.2015    source источник


Ответы (3)


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

person Tom-db    schedule 28.09.2015
comment
Выше небольшая опечатка. Вы должны изменить: SELECT utmzone(ST_GeomFromText('POINT( -5.86424016952515 36.5277099609375)',4326)); с помощью: SELECT get_utmzone(ST_GeomFromText('POINT( -5.86424016952515 36.5277099609375)',4326)); - person aborruso; 03.04.2017
comment
Источник функции? Возможно, lists.osgeo.org/pipermail/postgis-users/2005 -декабрь/ - person Peter Krauss; 14.09.2018

Во-первых, следующая документация OpenGIS WKT Point(x,y) your POINT(36.5277099609375 -5.86424016952515) находится к югу от экватора, поэтому вам нужно использовать 29S(EPSG:32729) и 30S(EPSG:32730)

person Jendrusk    schedule 28.09.2015

Причина в том, что это не POINT(36.5277099609375 -5.86424016952515), а POINT(-5.86424016952515 36.5277099609375)потому что долгота и широта зависят от системы. Обычно X=долгота и Y=широта, но, например. в Google Maps X — это широта, а Y — это долгота.

person Esteban S    schedule 28.09.2015
comment
Это не ответ, может быть комет. Это всего лишь дополнение к тексту Томмазо 2015 года, ...ваши координаты перевернуты - person Peter Krauss; 14.09.2018