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

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
nuriahmetov
Новоприбывший
Сообщения: 4
Зарегистрирован: 16 дек 2014, 11:00
Репутация: 0

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

Сообщение nuriahmetov » 21 дек 2014, 17:18

Здравствуйте! Не смог найти решение сам, подскажите кто знает...

В таблице поле "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". А как это победить? Или, может, я совсем не туда иду...
Идеи?
i7-4770K 3.50GHz, 2x8 GiB DDR3 1867 MHz, PLEXTOR PX-256M5Pro
Linux 3.17.6-300.fc21.x86_64, KDE 4.14.3, PostgreSQL 9.3.5
POSTGIS=2.1.4 GEOS=3.4.2 PROJ=4.8.0 GDAL=1.11.1
Python 2.7.8, SQLAlchemy 0.9.8, geoalchemy2 0.2.4, Flask 0.10.1, flask-sqlalchemy 2.0

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

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

Сообщение KolesovDmitry » 21 дек 2014, 19:50

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);

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 21 дек 2014, 21:42

однако RTFM
Надо wkb превратить в geometry

nuriahmetov
Новоприбывший
Сообщения: 4
Зарегистрирован: 16 дек 2014, 11:00
Репутация: 0

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

Сообщение nuriahmetov » 22 дек 2014, 10:13

спасибо!
i7-4770K 3.50GHz, 2x8 GiB DDR3 1867 MHz, PLEXTOR PX-256M5Pro
Linux 3.17.6-300.fc21.x86_64, KDE 4.14.3, PostgreSQL 9.3.5
POSTGIS=2.1.4 GEOS=3.4.2 PROJ=4.8.0 GDAL=1.11.1
Python 2.7.8, SQLAlchemy 0.9.8, geoalchemy2 0.2.4, Flask 0.10.1, flask-sqlalchemy 2.0

nuriahmetov
Новоприбывший
Сообщения: 4
Зарегистрирован: 16 дек 2014, 11:00
Репутация: 0

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

Сообщение nuriahmetov » 22 дек 2014, 10:19

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

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

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

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


SELECT ST_AsText('010100002031BF0D00219AA121A0B34A41E43DF24F31805F41');
>> "POINT(3499840.2627442 8257733.24916026)"
i7-4770K 3.50GHz, 2x8 GiB DDR3 1867 MHz, PLEXTOR PX-256M5Pro
Linux 3.17.6-300.fc21.x86_64, KDE 4.14.3, PostgreSQL 9.3.5
POSTGIS=2.1.4 GEOS=3.4.2 PROJ=4.8.0 GDAL=1.11.1
Python 2.7.8, SQLAlchemy 0.9.8, geoalchemy2 0.2.4, Flask 0.10.1, flask-sqlalchemy 2.0

nuriahmetov
Новоприбывший
Сообщения: 4
Зарегистрирован: 16 дек 2014, 11:00
Репутация: 0

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

Сообщение nuriahmetov » 22 дек 2014, 12:21

Как всегда - все очевидно :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"
i7-4770K 3.50GHz, 2x8 GiB DDR3 1867 MHz, PLEXTOR PX-256M5Pro
Linux 3.17.6-300.fc21.x86_64, KDE 4.14.3, PostgreSQL 9.3.5
POSTGIS=2.1.4 GEOS=3.4.2 PROJ=4.8.0 GDAL=1.11.1
Python 2.7.8, SQLAlchemy 0.9.8, geoalchemy2 0.2.4, Flask 0.10.1, flask-sqlalchemy 2.0

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя