Пересчет десятичных координат в градусы. Как перевести географические координаты в прямоугольные

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

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

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

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

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

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

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

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

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

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

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

Обсудить в форуме

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

Географические координаты одной и тоже точки могут быть выражены в разных форматах. В зависимости от того, представлены минуты и секунды как значения от 0 до 60 или от 0 до 100 (десятичные доли).

Формат координат обычно записывают следующим образом: DD - градусы, MM - минуты, SS - секунды, если минуты и секунды представлены как десятичные доли, то пишут просто DD.DDDD. Например:

DD MM SS: 50° 40" 45"" в.д., 40 50" 30"" с.ш. - Градусы, минуты, секунды

DD MM.MM: 50° 40.75" в.д., 40 50.5" с.ш. - Градусы, десятичные минуты

DD.DDDDD: 50.67916 в.д., 40.841666 с.ш. - Десятичные градусы.

Многие программы не понимают координаты выраженные в форме, допускающем пробелы, такие как DD MM SS или DD MM.MM. Для нормальной работы, координаты рекомендуется хранить в форме DD.DDDDD.

Существует много способов осуществить данную конвертацию рассмотрим 3 основных (в порядке эффективности).

Правильно настроить GPS

Для того, чтобы не иметь проблем с переводом координат, проще всего сразу настроить GPS так, чтобы он отображал значения координат в формате DD.DDDDD . Однако, это может быть не удобно для тех, кто ориентируется в поле по топокартам с нанесенной координатной сеткой, где координаты подписаны в другом числовом формате. С другой стороны в этом случае, рекомендуется и саму координатную сетку подписывать в этом формате.

Использовать специальный скрипт

Если вы работаете в Arcview GIS, вы можете воспользоваться специальным скриптом, который осуществит пересчет за вас.

Для начала работы в Arcview должна быть создана или загружена таблица в формате DBF (создать такую таблицу можно, например, в Excel"e). Таблица в которой записаны исходные значения ДОЛЖНА быть открыта для записи Table\Start editing .

В этой таблице должно присутствовать 2 столбца (общее количество может быть больше) в которых должны быть записаны значения координат в формате DDMMSS то есть пробелов между цифрами быть не должно, например 505050.3214

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

Пересчитать значения координат самому в Excel

Формула для пересчета из dd mm ss в dd.ddddd:

Формула для пересчета из dd mm.mmmm в dd.ddddd:

Формула для пересчета из dd.ddddd в dd mm ss:

D D = T R U N C (D D D )

M M = T R U N C ((D D D D D ) * 60)

S S = ((D D D D D ) * 60 − M M ) * 60

где DDD - координаты в формате DD.DDDD , DD - градусы, MM (MM.MMMM) - минуты, SS - секунды

Если лень вводить формулы и создавать таблицу, можно загрузить готовую . Дальше потребуется только ввести свои координаты и скопировав столбцы с результатом вставить их в новую таблицу или текстовый файл, который можно будет потом импортировать в ГИС.

Чтобы еще больше облегчить пересчет координат в Excel можно использовать надстройку подключаемую к Excel. После ее подключения, в Excel добавляются несколько формул, позволяющих конвертировать значения из DDMMSS (в разных форматах в десятичные градусы). Скачать надстройку . Описание подключения и использования надстройки внутри архива.

  • ГРД__ГГ_ММСС - перевод градусов, введенных в 1 ячейку в виде ГГ,ММСС
  • ГРД__ГГММ_СС - перевод градусов, введенных в 1 ячейку в виде ГГММ,СС
  • ГРД__ГГ_ММ_СС - перевод градусов, введенных в 3 ячейки в виде ГГ ММ СС

Дней 10 назад в эфире на 20-ке познакомился с Володей, RW9AW. Не прошло и двух недель, как он со своим сыном Иваном UA9AGR у меня на кухне! Выяснилось, что оба заядлые путешественники и по дороге они успели побывать в гостях у Саши R1NA:-) Но я немного о другом. Я про славян из бывшего СССР. Если бы это было в чопорной Европе, то месяц бы шли переговоры о дате приезда, визах, отеле, валюте оплаты услуг транспорта, какой флаг вывесить в аэропорту в день приезда и другие протокольные нюансы. У нас всё проще: главное чтобы в этот день из дома не уехал:-) По приезду чай с какавой, помощь раненому в дороге Володе (кстати "рану" - ушибленный палец ноги привёз из Карелии - лестницы у R1NA крутые:-) Надо думать и водка была крепкая:-) Выяснилось, что общая история на протяжении 70 лет еще долго будет давать о себе знать: понимаем друг друга с полуслова, вышедшие ныне из упортебления слова из "совкового" лексикона, цитаты из Высоцкого (из Пушкина, кстати, тоже, хотя нынешнее поколение его знает примерно как творчество Байрона). И вместе с тем много нового: из первых уст про челябинский метеорит,

  • Контест:тактика и практика

    Вот. Попил кофе, полюбопытствовал как прошёл контест у других. Много интересного, хотя сам контест уже традиционный и его положение не совсем поспевает за временем. То что корреспондентов не хватает для полноценного контеста, к сожалению, уже не секрет несколько лет. Я об этом уже писал, графики приводил. :-) Через полчаса после начала тура работать уже не с кем, логгер ругается и даже очень тщательное прослушивание диапазона не добавляет новых корреспондентов, не говоря уже про темп связей. Поскольку я не слишком тяготею к получению спортивных разрядов, (следует признать что это исключение которое противоречит самому смыслу соревнования:-) то не обратил внимание на аспект непривлекательности контеста в этом смысле. Моё внимание на это обратил Алексей UT0RM. Дабы не прослыть не совсем работающим телефоном, просто процитирую:

    "Егор,приветствую!
    Как ты знаешь,я участия не прнимал, но почти два часа слушал тест. Нового и интересного для себя в тесте не заметил. Хотя, справедливости ради, отмечу, что народ тотально поменял ключи на клавиатуру. Ну,так и должно было статься. Только ретроград или ленивый не видит в этом толк. Сам тест - всё как всегда, участников мало, темп никакой. Тебе и многим другим приходилось циуцлять в пустоту, что, наверное, не доставляло большого удовольствия. Моё твёрдое мнение-чемпионат в том виде как он проводится, давно себя изжил,а может причина глубже. Ну,не знаю. Но мне в таком тесте стало не интересно. P.S.скрин с участниками чемпионата крикрепил "

  • CQ: С Новым Годом!

    Вот и пролетел еще один год. Внучка выросла настолько что уже понимает что означает охрана природы: её новогодняя работа на конкурс природозащитников не содержит ни одной сломаной еловой или сосновой веточки. Разве что руки-веточки, но они подняты с земли.

    Поздравляю всех с наступающим Новым 2019 годом! Желаю всем без исключения в Новом году счастья, чтобы ушли проблемы, а радости (и деньги:-) не переставали приходить. Чтобы вас любили близкие и уважали все остальные. Желаю чтобы помимо личного счастья и благополучия ваших семей, в этом году вы достали всех DX, подтвердили все недостающие до вашего DXCC 9B страны, заняли достойные по вашему мнению места в соревнованиях, получили массу удовольствия от общения на наших круглых столах и чаще встречали знакомые позывные на диапазонах! 73!

  • Прогресс наступает

    Уже пару лет не секрет, что SDR технологии всё более и более вытесняют традиционную радиотехнику из корпусов трансиверов. После нескольких "пристрелочных" вариантов в следствии бурного развития трансиверного софта появляются уже пракnически полные SDR трансиверы. Выясняется, что они намного удобнее традиционных. Особенно удобным оказалась "фишка" перекочевавшая из области мобильной связи - точпад. Как выразился бы человек моложе 25 лет - "отпад" :-) Вот полюбуйтесь.

  • КВ СВД

    :-) Эту аббревиатуру поймут только русские....
    На самом деле все догадались что на фото широкополосная логоперодическая 18-ти элементная антенна. Конечно на НЧ диапазонах со специальными ухищрениями, но работает от 1 до 30 мгц (если не лучше). Я могу ориентироваться только по своему опыту - по дороге на работу проходил мимо посольства Нигерии, там такая стояла. Ну и слышно было иногда... :-) Достаточно распространённая антенна для этих целей. Помните кино "ТАСС уполномочен заявить" , Трианон. :-) Так что реально большая антенна. Я бы сказал даже не винтовка, а гаубица:-)

  • Попытка показать FunCube1

    В интернете нашёл самый экономичный в смысле объёма выходнного файла инструмент показать вам видео с экрана: как происходит приём теле с FunCube-1. Но выяснилось, что защита Windows в половине случаев EXE-шный файл блокирует:-) Так что кто посмелее, и не закрылся брандмауэром "наглухо" может попробовать посмотреть как происходит приём пакетов с теперь горячо любимого всеми кубесатика. В файле "законсервирован" еще и проигрыватель:-)

    Вот короткий (забыл звук:-) 3 мБ а вот нормальный, со звуком и две минуты http://ham.cn.ua/vhf/FunCube.exe

  • Диплом, объявленный со спутника


    FUNCUBE-1
    Freq 145930 khz Mode BPSK Report 339

    Как полезно бывает смотреть спутники. Вот новость только что и с борта AO-73 FunCube-1 в тексте телеметрии:
    04.10.2014 19:17:23, 229636, FM5, The 73 on 73 award is organised by Paul Stoetzer, N8HM. Further details at http://amsat-uk.org/2014/08/18/73-on-73-award-announcement/

    А вот, собственно, положение: от Поля Стойцера N8HM

    Я рад заявить, что субсидирую новую награду, чтобы пропагандировать активность через AO-73 (FUNcube-1). Требования для получения этого диплома очень просты:

    1. Сработайте 73 уникальных (позывных) станции на AO-73.
    2. Контакты должны быть сделаны после 1 Сентября, 2014.
    3. Больше нет никаких требований:-)

    Награда для вас бесплатная (за счёт взносов на AMSAT-UK. и программа Fox AMSAT-NA). QSLs не требуются. Когда Вы выполните требования диплома, шлите вашу заявку в виде выписки из лога, включая callsign каждой станции, вид работы, номер орбиты, дата и время UTC на Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. , а также адрес на который следует отправить диплом. Насладитесь радиолюбительским Космосом - транспондером AO-73!

    73 Paul Stoetzer, Вашингтон N8HM, DC

  • 29.09.2014

    Приемник представляет собой детекторный приемник с УНЧ и предназначен для приема местной радиовещательной станции. все транзисторы с коэф. усиления не менее 20…30. L1 — регулятор размаха строк от старого телевизора. Литература 500схем для радиолюбителей\

  • 05.10.2014

    Практически каждый начинающий радиолюбитель стремится вначале своего творчества сконструировать сетевой блок питания (БП), чтобы впоследствии использовать его для питания различных экспериментальных устройств. И конечно, хотелось бы, чтобы этот БП «подсказывал» об опасности выхода из строя отдельных узлов при ошибках или неисправностях монтажа. На сегодняшний день существует множество схем, в том …

  • 29.09.2014

    Приемник предназначен для приема СВ ДВ диапазона. Источник питания — 3 элемента по 1,5В, ток потребления не превышает 3 мА. Контур магнитной антенны состоит из L1 L2 C1. при приеме ДВ катушки включены последовательно, а при приеме СВ L1 замыкается. С катушки L3 сигнал снимается и поступает на усилитель РЧ …

  • 08.10.2014

    На рисунке показана схема простого усилителя для головных телефонов(наушников) на 2-х транзисторах который имеет следующие характеристики: Выходная мощность 0,1Вт Коэффициент гармоник 0,07% Диапазон частот 20…20000Гц Напряжение питания 15В Ток потребления 120 мА Схема представляет собой двухкаскадный усилитель с выходным транзистором, работающий в линейном режиме А с током покоя около 120 …

  • 13.11.2014

    Усилитель класса АВ на базе TDA7375 предназначен для использования в качестве автомобильных усилителей. Микросхема имеет защиту от переполюсовки, защиту от статического электричества, от КЗ выходов на шину питания, на корпус и между собой. Усилитель на базе TDA7375 может переводится в режим МОНО простой установкой перемычек между входами, так же в …

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

    Службы позиционирования, включая навигацию на основе 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 градусов.

    Например, точка с координатами 61.44, 25.40 (в формате DD) или 61°26"24""N, 25°23"60""E (в формате DMS) находится в южной Финляндии. А точка с координатами -47.04, -73.48 (DD) или 47°02"24""S, 73°28"48""W (DMS) находится в южном Чили. На рисунке 1 приведено изображение Земли с перекрывающимися линиями параллелей и меридианов:


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

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

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


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

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

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

    Класс 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() из .

    Листинг 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) из .

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

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

    Заключение

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

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

    Loading...Loading...