Страница 1 из 1

Преобразование координат

Добавлено: 21 дек 2014, 17:18
nuriahmetov
Здравствуйте! Не смог найти решение сам, подскажите кто знает...

В таблице поле "pnt" с точкой (POINT) определено в srid=900913. Действия пользователей записываются в другую таблицу - логи. Итак - получаем исходное значение (строка):

Код: Выделить всё

010100002031BF0D00219AA121A0B34A41E43DF24F31805F41
На клиент надо вернуть данные в "человеческом" виде - градусы минуты секунды:

Код: Выделить всё


SELECT ST_AsLatLonText('010100002031BF0D00219AA121A0B34A41E43DF24F31805F41')
>>53°14'56.977"N 79°44'14.121"W

Все здорово, но надо в srid=4326. Представляется что получиться должно что-то вроде

Код: Выделить всё

059° 21ʹ 21.60ʺ
031° 26ʹ 22.56ʺ
Пробую так:

Код: Выделить всё


SELECT ST_AsLatLonText(ST_Transform('010100002031BF0D00219AA121A0B34A41E43DF24F31805F41', 4326));

Получаем:

Код: Выделить всё

ОШИБКА: функция st_transform(unknown, integer) не уникальна
SQL-состояние: 42725
Подсказка: Не удалось выбрать лучшую кандидатуру функции. Возможно, вам следует добавить явные преобразования типов.
Символ: 24
Я вижу что st_transform получает первый аргумент как "unknown". А как это победить? Или, может, я совсем не туда иду...
Идеи?

Re: Преобразование координат

Добавлено: 21 дек 2014, 19:50
KolesovDmitry
nuriahmetov писал(а): В таблице поле "pnt" с точкой (POINT) определено в srid=900913. Итак - получаем исходное значение (строка):

Код: Выделить всё

010100002031BF0D00219AA121A0B34A41E43DF24F31805F41
На клиент надо вернуть данные в "человеческом" виде - градусы минуты секунды:

Код: Выделить всё


SELECT ST_AsLatLonText('010100002031BF0D00219AA121A0B34A41E43DF24F31805F41')
>>53°14'56.977"N 79°44'14.121"W

Все здорово, но надо в srid=4326.
А как определил, что это не 4326?

А что выведет (хочется убедиться, что координаты не в широта/долгота):

Код: Выделить всё

SELECT ST_AsText(pnt);

Re: Преобразование координат

Добавлено: 21 дек 2014, 21:42
trir
однако RTFM
Надо wkb превратить в geometry

Re: Преобразование координат

Добавлено: 22 дек 2014, 10:13
nuriahmetov
спасибо!

Re: Преобразование координат

Добавлено: 22 дек 2014, 10:19
nuriahmetov
А как определил, что это не 4326?
А что выведет (хочется убедиться, что координаты не в широта/долгота):

Код: Выделить всё

SELECT ST_AsText(pnt);
никак - из определения таблицы

Код: Выделить всё


SELECT ST_AsText('010100002031BF0D00219AA121A0B34A41E43DF24F31805F41');
>> "POINT(3499840.2627442 8257733.24916026)"

Re: Преобразование координат

Добавлено: 22 дек 2014, 12:21
nuriahmetov
Как всегда - все очевидно :D
ST_Transform ожидает геометрию, не строку - надо явно преобразовывать к типу. Моя ошибка была в том, что надо писать '010100002031BF0D00219AA121A0B34A41E43DF24F31805F41'::geometry а не '010100002031BF0D00219AA121A0B34A41E43DF24F31805F41::geometry'

Решение:

Код: Выделить всё


SELECT ST_AsLatLonText(
ST_Transform(
ST_GeomFromWKB('010100002031BF0D00219AA121A0B34A41E43DF24F31805F41'::geometry), 4326
)
)
>> "59°21'21.600"N 31°26'22.560"E"