Перевод координат GPS

  • Главная
  • Статьи

Содержание

Пересчёт координат точек из одной системы координат в другую в PHOTOMOD GeoCalculator

Краткая руководство по работе с инструментом пересчета

Обсудить в форуме Комментариев — 6

Пересчёт точек из одной системы координат в другую (например, из СК-42 в WGS-84) — часто встречающаяся задача. Эти преобразования можно сделать при помощи бесплатной программы PHOTOMOD GeoCalculator от компании «Ракурс». В программе предустановлена база наиболее часто употребляемых в нашей стране систем координат. Их можно довольно гибко модифицировать под собственные нужды, а так же добавлять собственные. Кроме того, программа прекрасно работает под Wine, что может быть полезно для пользователей ОС Linux.

Рис. 1: Основное окно программы.

Ниже приводится описание типичного процесса пересчёта координат.

Для осуществления пересчёта необходимо провести подготовку координат к загрузке в программу. GeoСalculator понимает текстовые файлы (.txt, .csv) в которых разделителем колонок выступает запятая, а разделителем целой и дробной части числа – точка. Всего может быть не более 4 колонок: 1-я – имя точки; 2-я – широта точки, 3-я – долгота точки; 4-я – высота точки. Подготовить набор данных можно с помощью OO Calc или Excel.

Рис. 2: Пример текстового файла, оформленного для работы в GeoCalculator.

Обратите внимание, что в примере текстового файла первая строчка содержит имена столбцов таблицы — эта строчка необязательна, более того, программа попытается её пересчитать, так что будьте внимательны.

В одной (любой) из половинок рабочего окна программы, предназначенном для точек, загружаем точки для пересчёта. Все они должны находиться в одной системе координат. Затем, в окошке над точками выбираем ту систему координат в которой они находятся. В окошке напротив выбираем систему координат в которую мы хотим точки пересчитать. Например, WGS84 широта/долгота. Проблема заключается в том, что в безе GeoСalculator формат записи координат WGS84 широта/долгота — градусы минуты секунды, а нам для последующей работы было бы более удобно иметь их в десятичных градусах. Чтобы произвести соответствующие настройки идём: Базы данных→ Система координат.

Рис. 3: Окно выбора системы координат

выбираем широта-долгота WGS 84 и нажимаем кнопку Изменить. Появляется окно с настройками СК:

Рис. 4: Диалог изменения параметров системы координат.

Жмём на кнопку выбора единиц измерения для широты и долготы и выставляем «градусы», меняем название системы координат на более подходящее, например, «WGS84-десятичные градусы» (если не изменить название, то у вас в базе будет 2 системы координат с одинаковым названием и вы будете в них путаться), сохраняем.

Итак, всё готово для пересчёта. Можно нажимать стрелочку в левом верхнем углу окна для осуществления пересчёта в соответствующем направлении.

Рис. 5: Процесс пересчёта координат запускается путём нажатия стрелочек в левом верхнем углу окна.

Когда пересчёт осуществлён, сохраняем результат в файл .txt. Остался последний штрих: GeoСalculator вычислил значения высоты для наших точек (колонка «H») — их можно удалить с помощью Excel или OO Calc. Теперь, у нас есть необходимый текстовый файл с координатами в WGS-84.

При межевании участка, определении его поворотных точек, кадастровый инженер использует специальное gps-оборудование. Он получает координаты, которые указываются при формировании межевого плана, а в выписке из ЕГРН указываются данные в совсем другом формате. Как не запутаться в многообразии форматов и кадастровые координаты перевести в gps координаты, расскажем ниже.

Форматы GPS координат

GPS координаты служат заменой адресу, они нужны, чтобы быстро найти нужную локацию с помощью навигатора. Это может быть как отдельное устройство, так и смартфон с функцией навигатора.

Все автомобилисты, любители активного отдыха в дикой природе и дальних поездок пользуются gps отметками. Однако, у всех были случаи, когда были указаны верные параметры, а навигатор все равно привел не туда. Такое может случиться из-за путаницы в форматах, для записи которых нет единого стандарта.

В целом, система, по которой записываются координаты, похожа на ту, что проходят в школе на уроках географии. Точно так же есть широта и долгота, но запись осуществляется более детально.

Как могут быть записаны географические координаты:

  • Градусы с десятичной дробью
  • Градусы и минуты с десятичной дробью
  • Градусы, минуты и секунды.

Есть ещё другие форматы записи, но они имеют узкоспециализированное назначение и в повседневной жизни не используются.

Стоит отметить, что для каждого формата записи географических данных должны быть произведены соответствующие настройки на навигаторе. Если вы введете данные о местоположении точки в формате «градусы, минуты, секунды» в навигатор, который настроен на формат «градусы с дробью», навигатор выдаст ошибку или приведет вас неизвестно куда.

Найти объект

Как найти кадастровые координаты?

Данные о каждом участке, зарегистрированном в ЕГРН и нанесенном на публичную кадастровую карту, называются кадастровыми координатами.

Чтобы узнать их и другую информацию, воспользуйтесь простым и многофункциональным сервисом egrnka.ru. Заказать развернутую выписку из ЕГРН для получения полной информации об участке, найти надел на карте и получить краткую справку о нем можно в два клика.

Чтобы получить кадастровые координаты участка, достаточно знать его адрес или кадастровый номер.

Для чего нужен перевод кадастровых координат в GPS?

Перевести gps координаты в географические может понадобиться во множестве ситуаций.

Допустим, если вы проводите межевание участка или хотите расположить на участке несколько сооружений так, чтобы они не мешали друг другу и не нарушали норм пожарной безопасности.

Четкое обозначение границ участка защитит от территориальных споров с соседями, случайного выхода на смежную территорию во время строительства. Также, строительство будет невозможно, если на смежной территории находится исторический памятник, объект государственной важности или другие объекты, строительство рядом с которыми ограничено или и вовсе запрещено.

Чтобы это выяснить, понадобится наложить координаты вашего участка на географическую карту и проверить, не совпадают ли они с теми точками, на которых строить нельзя. Обычно такой стоп-лист выдается с разрешением на строительство.

Как перевести координаты из выписки ЕГРН в формат GPS?

Есть множество программ, которые можно использовать чтобы перевести gps координаты в географические онлайн. Можно воспользоваться специальным калькулятором для конвертации, но результат будет ненадежным и может отличаться от действительности.

Загвоздка может заключаться в том, что у каждого региона своя особая система координат, в которой шифруются кадастровые данные в ЕГРН. Система обозначения в gps едина и может отличаться от кадастровой. В результате конвертация может быть неверной и, тем более, не иметь юридической силы.

Гораздо надежнее будет обратиться в местную государственную геодезическую службу. У ее инженеров точно есть все необходимые допуски и квалификации, точное измерительное оборудование для межевания участка, отметки его поворотных точек и нахождения точных координат.

Еще одним плюсом обращения в государственные инстанции станет то, что результаты изысканий будут заверены гербовой печатью. Следовательно, они могут быть использованы в дальнейшем. Нати свой участок на карте можно вбив адрес или кадастровый номер в поисковой строке выше.

Найти объект

Простой и легкий в использовании приложение для определения координат различных форматов.
Вы хотите найти свою широту и долготу данные с карты ли? Если да, то это приложение для вас.
## Простой дизайн ##
Просто найдите свое местоположение на центре экрана (линия пересечения), то результат появится мгновенно! Или просто ввести значение самостоятельно! Поиск местоположения по имени места, города, штата или страны.
## Поддерживается множество форматов координат ##
Не показывать только лишь равнина или Долгота Широта данных, это приложение также поддерживает несколько форматов и систем координат. Такие, как система (УПМ, военной координатной сетки системы (МГРС) и Всемирная географическая справочная система (Georef) координат универсальной поперечной проекции Меркатора
## Datum преобразования ##
Это приложение также может преобразовывать координаты в EPSG, ESRI, IAU2000 ссылки из онлайн-базы данных.
Конвертируйте координаты широты и долготы, геодезические данные и проектируемые системы.
## Отслеживание и навигация ##
Закрепить местоположение на карте и начать навигацию. Пеленг и расстояние обновляются в режиме реального времени. Считывание больших координат для использования в полевых условиях.
## World Magnetic Model Calculator ##
Вычислить значения для геомагнитного поля, такие как магнитные декларации, напряженность, изменение магнитной сетки и многое другое
Это приложение использует WMM 2015 и / или WMM 2015 v2
## Импорт / Экспорт — AirDrop поддерживается ##
Импорт/Экспортируйте текущий список координат в стандартный файл .gpx и / или пользовательский формат .txt со всей информацией.
## Измерение расстояния ##
Измерьте расстояние между точками и / или создайте свои собственные линии.
## Высота ##
Получить данные о высоте в любом месте (в пределах суши)
## Apple Watch ##
Просмотреть координаты вашего текущего местоположения в различных форматах.
## Поделиться ##
Поделитесь результат через Twitter, электронная почта, Копировать в картонные и многое другое.
Поддерживаемые Выход / Поддерживаемые форматы входного:
Широта и долгота в градусах, минутах и ​​секундах DD.DD DMS
Стандартный UTM
UTM НАТО
MGRS (МГРС)
Georef
QTH Locator (Grid Square) / Площадь Maidenhead Сетка
WGS84 — World Mercator
Web Mercator
Geohash
what3words
Global Area Reference System (GARS)
Ordnance Survey National Grid
OSGB36
ISO 6709
Универсальная адресная система (NAC)
Irish Grid Reference / Coordinates
Plus Code (Open Location Code)
Mapcode
Dutch Grid
ECEF
Indian Kalianpur 1975
Open Postcode
Geohash-36
Guatemala GTM
RT90
SWEREF99
IRENET95 / Irish Transverse Mercator
KOSOVAREF01
HD 72 / EOV
Kertau (RSO) / RSO Malaya (m)
Timbalai 1948 / RSO Borneo (m)
EST97 Estonian 1997
LKS92 / Latvia TM
NZGD49
NZGD2000
CH1903
CH1903+
GGRS87
ETRS89-extended / LAEA Europe
NTF (Paris) / Lambert zone II
French DFCI Grid
ARINC 424
FMS
Поиск по названию места
Получить местоположение из метаданных местоположения фотографии
## Подписки ##
«Координаты» полностью бесплатна для использования со всеми функциями. Вы можете подписаться на это приложение, чтобы удалить рекламу.
Подписки на устройства доступны в этом плане и будут обновляться автоматически каждый месяц, шесть месяцев или год, если не отменены.
(В месяц) $ 2,99
(За шесть месяцев) $ 15,99
(В год) $ 28,99
Цены указаны для магазина в США. Цены в других магазинах будут различаться.
Оплата за подписку будет снята с вашей учетной записи iTunes при подтверждении покупки
Подписки автоматически продлеваются, если автоматическое продление не отключено по крайней мере за 24 часа до окончания текущего периода.
Подписками можно управлять, перейдя в настройки учетной записи iTunes после покупки или нажав «Купить / Управление подпиской» Автообновление можно отключить, зайдя в настройки учетной записи после покупки.
Подписка не может быть отменена в течение активного периода подписки
Политика конфиденциальности: https://mapnitude.com/privacy-policy
Условия использования: https://mapnitude.com/terms-of-service

0.00 X ↔ Y 0.00 X ↔ Y

Хотите пересчитать координаты из одной системы координат в другую?

Здесь Вы сможете преобразовать координаты точек из используемых в России местных систем координат (СК) в мировые или наоборот, а также из одной местной СК в другую местную. Пересчитать за один раз можно как одну точку, так и целыми контурами.

Необходимость пересчета возникает, например, при определении положения точки на публичной кадастровой карте, которая работает в мировой системе координат WGS-84 (проекция Меркатора), другие картографические сервисы также используют WGS-84 (долготу и широту): Google.Maps, Яндекс.Карты, OpenStreet и др.

Инструкция:

Выберите из выпадающих список слева исходную систему координат, справа — целевую систему координат. Введите координаты в левое текстовое поле. Вводите в одной строке по одной точке (пункту), координаты отделяйте друг от друга в строке: Tab, точкой с запятой, пробелом, либо запятой. Целую часть от дробной — точкой, либо запятой (если она не использована в качестве разделителя). При вводе долготы и широты вводите значения в градусах и десятичных долях градусов, отделяя целую часть от дробной точкой. Нажмите на кнопку Конвертировать. Вы можете менять направление конвертации с помощью кнопки . Для очистки текстовых полей нажмите кнопку Очистить.

Совет: Вы можете открыть программу серии Полигон и выделить всю таблицу с координатами, нажать на кнопку Копировать в программе, а затем вставить эту информацию в левое поле конвертера, нажать кнопку Конвертировать.

Внимание: конвертер «внутри» работает в математической системе координат, поэтому если Вы конвертируете из геодезической системы координат (местные СК), то поставьте галочку X ↔ Y в левой части. Если Вы конвертируете из мировой СК, например, WGS 84, то такую галочку ставить не нужно, так как эта система математическая. Для получения на выходе координат в нужной последовательности, используйте галочку X ↔ Y в правой части. Вы можете округлить координаты до сотых: как до конвертации — левая галочка 0.00, так и после — правая галочка 0.00.

Внимание: при большом количестве точек пересчет может занять некоторое время. Если операция выполняется слишком длительно, то обновите страницу клавишей F5. Конвертируйте меньшее количество информации за один раз.

Сервис работает бесплатно. Количество конвертируемых точек не ограничено.

Используя данный веб-сервис, пользователь соглашается с Политикой конфиденциальности и несет личную ответственность за загружаемые информационные материалы.

Сервис работает бесплатно, но Вы можете нас отблагодарить:

  • Поделитесь ссылкой в социальных сетях
  • Напишите на форумах об этом сервисе
  • Расскажите коллегам о существовании этого сервиса
  • Напишите отзыв на нашем сайте

Пособие по преобразованию между различными системами координат

Сами Салкосуо
Опубликовано 21.04.2008

Службы позиционирования, включая навигацию на основе GPS и картографические сайты, такие как Google Maps и Yahoo! Maps, становятся популярными среди пользователей. Множество организаций уже используют сервисы, связанные с использованием информации о географических координатах, и еще больше компаний пойдут по этому пути, как только осознают преимущества и потенциал подобных приложений. В 2006 году аналитическая компания Gartner отметила, что «приложения, связанные с позиционированием, станут массовыми в течение следующих двух-пяти лет» и что уже «значительное число организаций развернули мобильные бизнес-приложения, использующие позиционирование». (В разделе Ресурсы приведена ссылка на этот отчет.)

Когда организация решает реализовать приложение, использующее географическую систему координат, обычно написание такого приложения становится задачей разработчика. Построение приложения, использующего географические координаты, включает в себя много больших и маленьких задач, и одной из таких задач, относительно простой, будет преобразование координат из одной системы в другую. В этой статье представлен код, который выполняет такое преобразование и может помочь сэкономить множество часов работы.

Две различные системы координат

Прежде чем погрузиться в код, представленный в этой статье, необходимо обсудить координатные системы, для поддержки которых этот код предназначен: известная система широты и долготы и универсальная поперечная проекция Меркатора (Universal Transverse Mercator — UTM). Также нужно коснуться военной системы координат (Military Grid Reference System — MGRS), которая основана на UTM.

Широта и долгота

Системы широты и долготы, вероятно, самый известный способ определения географических координат. В ней местоположение представляется двумя числами. Широта — это угол от центра земли к некоторой параллели на земной поверхности. Долгота — это угол от центра земли к некоторому меридиану на земной поверхности. Широта и долгота могут быть выражены в десятичных градусах (DD) или градусах, минутах и секунда (DMS); в последнем случае получаются числа в таком формате — 49°30’00» S 12°30’00» E. Этот формат обычно используется в GPS-навигаторах.

Земля разделена экватором (0° широты) на северное и южное полушария, и нулевым меридианом (0° долготы), воображаемой линией от северного к южному полюсу, которая проходитчерез город Гринвич в Великобритании и делит планету на восточное и западное полушарие. Диапазон широт в северном полушарии от 0 до 90 градусов, а в южном полушарии — от 0 до -90 градусов. Диапазон восточного полушария от 0 до 180 градусов, а западного полушария от 0 до -180 градусов.

Рисунок 1. Земля с показанными линиями параллелей и меридианов

Кликните, чтобы увидеть увеличенное изображение

Дополнительную информацию можно найти в разделе Ресурсы.

Поперечная проекция Меркатора

Система координат UTM — это метод, использующий сетку для определения координат. Система UTM делит Землю на 60 зон, каждая из которых основана на поперечной проекции Меркатора. Проекция карты в картографии — это способ представить двумерную неровную поверхность на плоскости, как обычную карту. На рисунке 2 приведена поперечная проекция Меркатора:

Рисунок 2. Поперечная проекция Меркатора

Кликните, чтобы увидеть увеличенное изображение

Зоны долготы в UTM пронумерованы от 1 до 60; все зоны кроме двух, о которых будет рассказано позже, имеют ширину 6° от востока до запада. Зоны долготы полностью покрывают поверхность Земли между широтами 80°S и 84°N.

Также есть 20 зон широты, каждая в 8° высотой; эти зоны пронумерованы от C до X, буквы I и O пропущены. Зоны A, B, Y и Z находятся за пределами этой системы, они покрывают Арктику и Антарктику. На рисунке 3 приведены UTM зоны для Европы. На этом рисунке видны две нестандартные зоны долготы: зона 32V расширена для покрытия всей южной Норвегии, а зона 31V сокращена, чтобы покрывать только водное пространство.

Рисунок 3. Зоны UTM в Европе

Кликните, чтобы увидеть увеличенное изображение

Координаты в UTM представлены в формате зона долготы зона широты восточное склонение северное склонение, где восточное склонение — это проекционное расстояние от центрального меридиана зоны долготы, северное склонение — это проекционное расстояние от экватора. Значения восточного и северного склонений задаются в метрах. Например, координаты широты/долготы 61.44, 25.40 в UTM представлены как 35 V 414668 6812844; координаты широты/долготы -47.04, -73.48 соответствуют координатам 18 G 615471 4789269 в UTM.

В разделе Ресурсы приведена дополнительная информация по UTM и поперечной проекции Меркатора.

Военная система координат

Система координат MGRS — стандарт, используемый военными НАТО. MGRS основана на UTM и дальше делит каждую зону на квадраты 100х100 км. Эти квадраты идентифицируются двухбуквенным кодом, первая буква — восточно-западная позиция в зоне долготы, а вторая буква — северо-южная позиция.

Например, координата в UTM 35 V 414668 6812844 эквивалента координате MGRS 35VMJ1466812844. Точность координаты в MGRS задается с точностью в один метр и представлена с помощью 15 символов, где последние 10 символов представляют значения восточного и северного склонений в указанной сетке. В MGRS координаты могут быть представлены 15 символами, как в прошлом примере, или 13, 11, 9 или 7 символами; представленные таким образом значения будут соответственно иметь точность 1, 10, 100, 1000 или 10000 метров.

В этой статье подробно не разбирается MGRS, но скачиваемый код включает в себя преобразования между широтой/долготой и MGRS. В разделе Ресурсы приведена дополнительная информация.

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

Чтобы определить ширину и долготу — координаты местоположения на Земле, как минимум нужно иметь возможность видеть звезды или Солнце, иметь секстан и часы, показывающие время на меридиане GMT. Можно определить широту из угла между небесным телом и горизонтом, а долготу можно вычислить из вращения Земли. Эта статья не погружается в подобные подробности, но в разделе Ресурсы о них можно узнать больше. Вместо этого, предположим, что у нас уже есть координаты в формате DD, DMS или UTM.

Преобразование десятичных градусов в градусы/минуты/секунды и обратно

Крайне просто преобразовать координаты из формата DD в DMS. Ниже приведена формула для подобного преобразования:

DD: dd.ff DMS: dd mm ss dd=dd mm.gg=60*ff ss=60*gg

В этом примере gg — это дробная часть вычисления. Отрицательная широта означает местоположение в южном полушарии (S), а отрицательная долгота — в западном полушарии (W). Например, предположим, что имеются координаты в формате DD — 61.44, 25.40. Их можно преобразовать следующим образом:

lat dd=61 lat mm.gg=60*0.44=26.4 lat ss=60*0.4=24

Далее:

lon dd=25 lon mm.gg=60*0.40=24.0 lon ss=60*0.0=0

Таким образом, в формате DMS получаем следующие координаты — 61°26’24»N 25°24’00»E.

Ниже приведена формула для перехода от DMS к DD:

DD: dd.ff DMS: dd mm ss dd.ff=dd + mm/60 + ss/3600

Напомним, что места, расположенные в южном полушарии (S), имеют отрицательную широту, а места в западном полушарии (W) имеют отрицательную долготу.

Теперь выполним преобразование DMS координат 47°02’24»S, 73°28’48»W в формат DD:

lat dd.ff= — (47 + 2/60 + 24/3600 )=-47.04 lon dd.ff= — (73 + 28/60 + 48/3600)=-73.48

Таким образом, координаты в DD равны -47.04, -73.48.

Преобразование долготы/широты в UTM и обратно

В отличие от десятичных координат, которые можно определить с помощью хронометра и часов, координаты UTM невозможно определить без помощи вычислений. Хотя эти вычисления ничто иное, как простая тригонометрия и алгебра, формулы у них достаточно сложные. Если ознакомиться со статьей «The Universal Grids: Universal Transverse Mercator (UTM) and Universal Polar Stereographic (UPS)» (ссылка на неё приведена в разделе Ресурсы), то станет понятно, что я имею ввиду.

Формулы для преобразования UTM здесь не приводятся, но исходный код в следующем разделе немного освещает эту проблему, а в разделе Ресурсы есть ссылки на дополнительную информацию.

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

В этом разделе приведен исходный код класса библиотеки, который выполняет преобразования координат между десятичными градусами и UTM. Этот Java-класс называется com.ibm.util.CoordinateConversion и я хотел создать отдельный класс с методами для преобразования. Этот класс включает внутренние классы, которые на самом деле выполняют преобразования, и при необходимости эти классы могут быть вынесены из класса CoordinateConversion с помощью рефакторинга, чтобы создать пакет библиотеки или добавить классы в существующий пакет. Преобразования, выполняемые этим классом, имеют точность в 1 метр.

В исходном коде CoordinateConversion около 750 строк, так что в этой статье он представлен не полностью. Существенные методы описаны в следующих разделах, а полностью код доступен в разделе Материалы для скачивания.

Класс CoordinateConversion

CoordinateConversion — это главный класс, объекты которого создаются при необходимости выполнения преобразования координат. В листинге 1 приведены существенные public методы вместе с внутренними private классами, входящими в класс CoordinateConversion:

Листинг 1. CoordinateConversion

public class CoordinateConversion { public CoordinateConversion() { } public double utm2LatLon(String UTM) { UTM2LatLon c = new UTM2LatLon(); return c.convertUTMToLatLong(UTM); } public String latLon2UTM(double latitude, double longitude) { LatLon2UTM c = new LatLon2UTM(); return c.convertLatLonToUTM(latitude, longitude); } //..реализация пропущена private class LatLon2UTM { public String convertLatLonToUTM(double latitude, double longitude) { //..реализация пропущена } //..реализация пропущена } private class LatLon2MGRUTM extends LatLon2UTM { public String convertLatLonToMGRUTM(double latitude, double longitude) { //..реализация пропущена } //..реализация пропущена } private class MGRUTM2LatLon extends UTM2LatLon { public double convertMGRUTMToLatLong(String mgrutm) { //..реализация пропущена } //..реализация пропущена } private class UTM2LatLon { public double convertUTMToLatLong(String UTM) { //..реализация пропущена } //..реализация пропущена } private class Digraphs { //используется для получения двухбуквенных кодов //при преобразовании от долготы/широты к MGRS //..реализация пропущена } private class LatZones { //включает методы для определения зон широты //..реализация пропущена }

В следующем разделе подробно рассматриваются преобразования между долготой/широтой и UTM.

Преобразование от широты/долготы к UTM

Координаты преобразуются от широты/долготы в UTM с помощью метода String latLon2UTM(double latitude, double longitude). Реализация этого метода создает экземпляр внутреннего класса LatLon2UTM c = new LatLon2UTM(); и возвращает координаты UTM в виде 15-символьной строки с точностью 1 метр. Реализация методов класса LatLon2UTM приведена в листинге 2:

Листинг 2. public String convertLatLonToUTM(double latitude, double longitude)

public String convertLatLonToUTM(double latitude, double longitude) { validate(latitude, longitude); String UTM = «»; setVariables(latitude, longitude); String longZone = getLongZone(longitude); LatZones latZones = new LatZones(); String latZone = latZones.getLatZone(latitude); double _easting = getEasting(); double _northing = getNorthing(latitude); UTM = longZone + » » + latZone + » » + ((int) _easting) + » «+ ((int) _northing); return UTM; }

Этот метод выполняет преобразование, вызывая различные методы для получения зоны широты и зоны долготы, вычисления восточного и северного склонения и т.д. Входные данные проверяются в методе validate(), если выражение (latitude < -90.0 || latitude > 90.0 || longitude < -180.0 || longitude >= 180.0) принимает значение true, то сбрасывается исключительная ситуация IllegalArgumentException.

Метод setVariables() в листинге 3 устанавливает различные переменные, требующиеся для вычисления преобразований (дополнительная информация представлена в статье «The Universal Grids», ссылка на которую приведена в разделе Ресурсы:

Листинг 3. protected void setVariables(double latitude, double longitude)

protected void setVariables(double latitude, double longitude) { latitude = degreeToRadian(latitude); rho = equatorialRadius * (1 — e * e) / POW(1 — POW(e * SIN(latitude), 2), 3 / 2.0); nu = equatorialRadius / POW(1 — POW(e * SIN(latitude), 2), (1 / 2.0)); double var1; if (longitude < 0.0) { var1 = ((int) ((180 + longitude) / 6.0)) + 1; } else { var1 = ((int) (longitude / 6)) + 31; } double var2 = (6 * var1) — 183; double var3 = longitude — var2; p = var3 * 3600 / 10000; S = A0 * latitude — B0 * SIN(2 * latitude) + C0 * SIN(4 * latitude) — D0 * SIN(6 * latitude) + E0 * SIN(8 * latitude); K1 = S * k0; K2 = nu * SIN(latitude) * COS(latitude) * POW(sin1, 2) * k0 * (100000000) / 2; K3 = ((POW(sin1, 4) * nu * SIN(latitude) * Math.pow(COS(latitude), 3)) / 24) * (5 — POW(TAN(latitude), 2) + 9 * e1sq * POW(COS(latitude), 2) + 4 * POW(e1sq, 2) * POW(COS(latitude), 4)) * k0 * (10000000000000000L); K4 = nu * COS(latitude) * sin1 * k0 * 10000; K5 = POW(sin1 * COS(latitude), 3) * (nu / 6) * (1 — POW(TAN(latitude), 2) + e1sq * POW(COS(latitude), 2)) * k0 * 1000000000000L; A6 = (POW(p * sin1, 6) * nu * SIN(latitude) * POW(COS(latitude), 5) / 720) * (61 — 58 * POW(TAN(latitude), 2) + POW(TAN(latitude), 4) + 270 * e1sq * POW(COS(latitude), 2) — 330 * e1sq * POW(SIN(latitude), 2)) * k0 * (1E+24); }

Метод getLongZone() в листинге 4 и класс LatZones, доступный в исходном коде, используются, чтобы узнать зону долготы и зону широты. Зона долготы вычисляется по параметру longitude, а зоны широты обычно представлены как константы, с помощью массива в классе LatZones.

Листинг 4. protected String getLongZone(double longitude)

protected String getLongZone(double longitude) { double longZone = 0; if (longitude < 0.0) { longZone = ((180.0 + longitude) / 6) + 1; } else { longZone = (longitude / 6) + 31; } String val = String.valueOf((int) longZone); if (val.length() == 1) { val = «0» + val; } return val; }

Метод getNorthing() в листинге 5 и метод getEasting() в листинге 6 вычисляют значения северного и восточного склонения. Оба метода используют переменные, установленные в методе setVariables() из листинга 3.

Листинг 5. protected double getNorthing(double latitude)

protected double getNorthing(double latitude) { double northing = K1 + K2 * p * p + K3 * POW(p, 4); if (latitude < 0.0) { northing = 10000000 + northing; } return northing; }

Листинг 6. protected double getEasting()

protected double getEasting() { return 500000 + (K4 * p + K5 * POW(p, 3)); }

В листинге 7 приведены несколько примеров результатов работы программы, включая координаты в формате широта/долгота и соответствующие им UTM координаты:

Листинг 7. Тестовые преобразования от широты/долготы к значениям в UTM

( 0.0000 0.0000 ) «31 N 166021 0» ( 0.1300 -0.2324 ) «30 N 808084 14385» (-45.6456 23.3545 ) «34 G 683473 4942631» (-12.7650 -33.8765 ) «25 L 404859 8588690» (-80.5434 -170.6540) «02 C 506346 1057742» ( 90.0000 177.0000) «60 Z 500000 9997964» (-90.0000 -177.0000) «01 A 500000 2035» ( 90.0000 3.0000 ) «31 Z 500000 9997964» ( 23.4578 -135.4545) «08 Q 453580 2594272» ( 77.3450 156.9876) «57 X 450793 8586116» (-89.3454 -48.9306 ) «22 A 502639 75072»

Преобразование от UTM к широте/долготе

Преобразование от координат в формате UTM к широте/долготе выполняется несколько проще, чем обратный процесс. В статье «The Universal Grids» в разделе Ресурсы) приведены формулы преобразований. В листинге 8 приведен код метода convertUTMToLatLong(). Этот метод возвращает массив double значений, где первый элемент (с индексом массива ) — это широта, а второй элемент (с индексом массива ) — это долгота. Так как строковый параметр содержит координаты UTM с точностью до 1 метра, то и координаты в широте/долготе будут иметь такую же точность.

Листинг 8. public double convertUTMToLatLong(String UTM)

public double convertUTMToLatLong(String UTM) { double latlon = { 0.0, 0.0 }; String utm = UTM.split(» «); zone = Integer.parseInt(utm); String latZone = utm; easting = Double.parseDouble(utm); northing = Double.parseDouble(utm); String hemisphere = getHemisphere(latZone); double latitude = 0.0; double longitude = 0.0; if (hemisphere.equals(«S»)) { northing = 10000000 — northing; } setVariables(); latitude = 180 * (phi1 — fact1 * (fact2 + fact3 + fact4)) / Math.PI; if (zone > 0) { zoneCM = 6 * zone — 183.0; } else { zoneCM = 3.0; } longitude = zoneCM — _a3; if (hemisphere.equals(«S»)) { latitude = -latitude; } latlon = latitude; latlon = longitude; return latlon; }

Метод convertUTMToLatLong() разбивает координаты UTM во входном строковом параметре, которые имеют формат 34 G 683473 4942631, и использует метод getHemisphere() для определения полушария, где находится место с указанными координатами. Определить полушарие просто: зоны широты A, C, D, E, F, G, H, J, K, L и M находятся в южном полушарии, а остальные зоны находятся в северном полушарии.

Метод setVariables(), показанный в листинге 9, устанавливает значения переменных, требуемых для вычисления, и затем немедленно вычисляют широту. Долгота вычисляется с использованием зоны долготы.

Листинг 9. protected void setVariables()

protected void setVariables() { arc = northing / k0; mu = arc / (a * (1 — POW(e, 2) / 4.0 — 3 * POW(e, 4) / 64.0 — 5 * POW(e, 6) / 256.0)); ei = (1 — POW((1 — e * e), (1 / 2.0))) / (1 + POW((1 — e * e), (1 / 2.0))); ca = 3 * ei / 2 — 27 * POW(ei, 3) / 32.0; cb = 21 * POW(ei, 2) / 16 — 55 * POW(ei, 4) / 32; cc = 151 * POW(ei, 3) / 96; cd = 1097 * POW(ei, 4) / 512; phi1 = mu + ca * SIN(2 * mu) + cb * SIN(4 * mu) + cc * SIN(6 * mu) + cd * SIN(8 * mu); n0 = a / POW((1 — POW((e * SIN(phi1)), 2)), (1 / 2.0)); r0 = a * (1 — e * e) / POW((1 — POW((e * SIN(phi1)), 2)), (3 / 2.0)); fact1 = n0 * TAN(phi1) / r0; _a1 = 500000 — easting; dd0 = _a1 / (n0 * k0); fact2 = dd0 * dd0 / 2; t0 = POW(TAN(phi1), 2); Q0 = e1sq * POW(COS(phi1), 2); fact3 = (5 + 3 * t0 + 10 * Q0 — 4 * Q0 * Q0 — 9 * e1sq) * POW(dd0, 4) / 24; fact4 = (61 + 90 * t0 + 298 * Q0 + 45 * t0 * t0 — 252 * e1sq — 3 * Q0 * Q0) * POW(dd0, 6) / 720; lof1 = _a1 / (n0 * k0); lof2 = (1 + 2 * t0 + Q0) * POW(dd0, 3) / 6.0; lof3 = (5 — 2 * Q0 + 28 * t0 — 3 * POW(Q0, 2) + 8 * e1sq + 24 * POW(t0, 2)) * POW(dd0, 5) / 120; _a2 = (lof1 — lof2 + lof3) / COS(phi1); _a3 = _a2 * 180 / Math.PI; }

Метод setVariables() использует значения восточного и северного склонений для установки требуемых переменных. Эти переменные принадлежат обоим классам и устанавливаются в методе convertUTMToLatLong(String UTM) из листинга 8.

Другие методы

Исходный код также содержит другие public и private методы и классы. Например, туда включены методы и классы для преобразования координат между широтой/долготой и MGRS вместе с вспомогательными методами, выполняющими преобразование градусов в радианы и наоборот, и различными математическими операциями, такими как POW, SIN, COS, and TAN.

В этой статье приведено немного теории по мировым системам координат вместе с Java-классов для выполнения преобразования координат из одной системы в другую. Хотя не все формулы для преобразования координат были подробно здесь рассмотрены, они доступны в разделе Ресурсы. Обычно теоретические сведения не требуются в ежедневном процессе разработки, кроме редких случаев, когда нет другого способа, как я недавно убедился, когда мне пришлось выполнять задачу преобразования координат.

Мне потребовалось выполнять преобразования между широтой и долготой, UTM и MGRS, так что я выполнил базовые исследования и реализовал эти преобразования в Java-классе. Для меня разработка заняла несколько часов, и я надеюсь, что и другие также смогут сэкономить несколько часов для других задач и сочтут полезным использование класса CoordinateConversion в собственной работе.

Ресурсы для скачивания

  • Coordinate conversions made easy (EN): оригинал статьи
  • Gartner’s 2006 emerging technologies hype cycle highlights key technology themes (EN): пресс-релиз от Gartner содержит интересные сведения о распространенности приложений, использующих географические координаты.
  • The Universal Grids: Universal TransverseMercator (UTM) and Universal Polar Stereographic (UPS) (EN): статья Национального Графического и Картографического Агентства (National Imagery and Mapping Agency — NIMA) содержит формулы UTM и другую информацию о системе координат UTM. (Статья представлена в формате PDF.)
  • Location-based services (EN): (Valerie Bennett и Andrew Capella, developerWorks, март 2002): статья с введением в основные принципы, лежащие в основе систем, связанных с позиционированием.
  • Put yourself on the map with Google Maps API, DB2/Informix, and PHP on Linux (EN): (Marty Lurie and Aron Y. Lurie, developerWorks, март 2006): статья с исходным кодом, преобразующим ZIP-код в координаты широты и долготы.
  • Creating an automatically maintained spatial table from latitude-longitude column data (EN): (EN) (Robert Uleman, developerWorks, апрель 2006): статья о том как DB2 может помочь в превращении необработанных координат в полезную информацию.
  • В Wikipedia можно узнать об основных концепциях, представленных в этой статье:(EN)
    • географические системы координат
    • система координат на основе универсальной поперечной проекции Меркатора
    • Military Grid Reference System
    • поперечная проекция Меркатора
    • секстанты
    • морские хронометры
  • developerWorks Java technology zone: сотни статей обо всех аспектах Java-программирования.