Ошибка в формуле вычисления координат для проекции Меркатора
-
- Участник
- Сообщения: 79
- Зарегистрирован: 24 дек 2015, 11:28
- Репутация: 1
Ошибка в формуле вычисления координат для проекции Меркатора
Уважаемые участники форума, имеется проблема с давно и хорошо известной картографической эллиптической проекцией Меркатора, которая возникла при попытке программно реализовать известные для нее численные методы расчетов.
На странице :
https://blog.foxylab.com/prakticheskaya-kartografiya/
в разделе "Эллиптическая проекция Меркатора" приведена итерационная формула для вычисления
широты методом последовательных приближений ( итерационным ) по известным координатам в метрах
( последняя формула в этом разделе на этой странице. Хотел вставить скриншот этого места страницы,
но рисунки не вставляются ).
При программной реализации в Delphi 7 этот метод прекрасно работает без каких-либо замечаний
и выдает результат с требуемой точностью.
На странице :
https://ru.wikipedia.org/wiki/Проекция_Меркатора
для того же самого ( вычисление широты ) приведена другая итерационная формула
( последняя формула на этой странице ),
при программной реализации метода по этой формуле итерационный процесс демонстрирует
крайнюю неустойчивость и, фактически, является расходящимся ( или очень плохо сходится,
в отличие от первой формулы ). Хотя в отдельных случаях и выдается правильный результат, совпадающий с результатом по первой формуле, но чаще происходит следующее :
итерационный процесс либо вылетает по причине превышения допустимого числа итераций, либо выдает значение с недопустимо большой погрешностью, либо выдает откровенно неверный результат. Для южного полушария ( отрицательные исходные значения метров пареметра "y" ) в качестве значений выдается откровенная белиберда или вылетает по причине недопустимых значений аргументов в используемых тригонометрических функциях.
Обе формулы работают со следующими параметрами земного эллипсоида :
радиус идеальной земной сферы - 6 371 000 метров;
большая полуось - a = 6 378 245 метров;
малая полуось - b = 6 356 863 метров.
Понятно, что в приведенной формуле ошибка. Но вот какая ?
Может, просто опечатка, а может, она неверно выведена ?
Может, кто-нибудь владеет какой-либо информацией на этот счет и может ею поделиться ?
Каким образом были выведены формулы по обоим вариантам ?
Имеются ли другие формулы расчетов широты для известных метров ?
Я состряпал простейший проект в Delphi 7, который демонстрирует все перечисленные выше эффекты и
который я использовал для отладки. Если он кому-то интересен, то выложу его здесь.
На странице :
https://blog.foxylab.com/prakticheskaya-kartografiya/
в разделе "Эллиптическая проекция Меркатора" приведена итерационная формула для вычисления
широты методом последовательных приближений ( итерационным ) по известным координатам в метрах
( последняя формула в этом разделе на этой странице. Хотел вставить скриншот этого места страницы,
но рисунки не вставляются ).
При программной реализации в Delphi 7 этот метод прекрасно работает без каких-либо замечаний
и выдает результат с требуемой точностью.
На странице :
https://ru.wikipedia.org/wiki/Проекция_Меркатора
для того же самого ( вычисление широты ) приведена другая итерационная формула
( последняя формула на этой странице ),
при программной реализации метода по этой формуле итерационный процесс демонстрирует
крайнюю неустойчивость и, фактически, является расходящимся ( или очень плохо сходится,
в отличие от первой формулы ). Хотя в отдельных случаях и выдается правильный результат, совпадающий с результатом по первой формуле, но чаще происходит следующее :
итерационный процесс либо вылетает по причине превышения допустимого числа итераций, либо выдает значение с недопустимо большой погрешностью, либо выдает откровенно неверный результат. Для южного полушария ( отрицательные исходные значения метров пареметра "y" ) в качестве значений выдается откровенная белиберда или вылетает по причине недопустимых значений аргументов в используемых тригонометрических функциях.
Обе формулы работают со следующими параметрами земного эллипсоида :
радиус идеальной земной сферы - 6 371 000 метров;
большая полуось - a = 6 378 245 метров;
малая полуось - b = 6 356 863 метров.
Понятно, что в приведенной формуле ошибка. Но вот какая ?
Может, просто опечатка, а может, она неверно выведена ?
Может, кто-нибудь владеет какой-либо информацией на этот счет и может ею поделиться ?
Каким образом были выведены формулы по обоим вариантам ?
Имеются ли другие формулы расчетов широты для известных метров ?
Я состряпал простейший проект в Delphi 7, который демонстрирует все перечисленные выше эффекты и
который я использовал для отладки. Если он кому-то интересен, то выложу его здесь.
- Игорь Белов
- Гуру
- Сообщения: 2230
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1503
- Откуда: Казань
Re: Ошибка в формуле вычисления координат для проекции Меркатора
Ответы в первых трёх формулах.KotAlex писал(а): ↑05 ноя 2019, 11:30в приведенной формуле ошибка. Но вот какая ?
Может, просто опечатка, а может, она неверно выведена ?
…
Каким образом были выведены формулы по обоим вариантам ?
В картографии используют конформное отображение эллипсоида на сферу для упрощения дальнейших преобразований. Формула (1) содержит соотношение между широтой на эллипсоиде φ и широтой на «сфере Гаусса» χ. На её основе строятся методы перехода от одного к другому либо в виде разложений в ряды, либо с использованием итераций.
После вычисления широты на сфере можно вычислять координату у в проекции Меркатора по простым формулам (2). На примере формулы (2) видно, что форм представления может быть много. Это относится и к формуле (1).
Формула (3) замечательна тем, что позволяет непосредственно из географической широты φ получить плоскую координату y. Она также может быть представлена в разных формах, привожу самую простую и удобную.
Во-первых, недавно предлагался вариант, где использовалось разложение в ряд для перехода от широты на сфере к широте на эллипсоиде: QMapControl и яндекс карты.KotAlex писал(а): ↑05 ноя 2019, 11:30Имеются ли другие формулы расчетов широты для известных метров ?
Во-вторых, специально для Вас только что на основе формулы (3) придумал итеративный алгоритм (4) – (7).
- Вложения
-
- Screenshot_2019-11-06_17-00-07.png (5.45 КБ) 3999 просмотров
The purpose of computing is insight, not numbers
-
- Участник
- Сообщения: 79
- Зарегистрирован: 24 дек 2015, 11:28
- Репутация: 1
Re: Ошибка в формуле вычисления координат для проекции Меркатора
Большое спасибо за ответ !
Учитывая прошедшее время после моего первого поста, я уже и не надеялся, что кто-либо ответит ...
Сегодня и в ближайшие дни попробую расковыряться с Вашими формулами и реализовать их в исходных кодах процедур. О результатах обязательно напишу.
В силу сложившихся обстоятельств, к большому сожалению, я не имею возможности оперативно и часто заглядывать на этот форум. Поэтому мои посты могут появляться здесь спустя весьма длительное время. Приношу извинения.
И еще одно. Вопрос, конечно, не в тему, но мне больше не у кого спросить.
Хотел поместить в пост картинку.
Когда-то давно, при добавлении в посты изображений можно было просто в нужном месте дать ссылку на файл картинки, расположенный на винчестере компьютера. Сейчас так почему-то не получается. Сейчас надо этот файл поместить в какое-то облачное хранилище и в посте дать адрес URL на этот файл ... Слишком сложно.
Это так, или я чего-то не понял ? Попроще никак ?
Учитывая прошедшее время после моего первого поста, я уже и не надеялся, что кто-либо ответит ...
Сегодня и в ближайшие дни попробую расковыряться с Вашими формулами и реализовать их в исходных кодах процедур. О результатах обязательно напишу.
В силу сложившихся обстоятельств, к большому сожалению, я не имею возможности оперативно и часто заглядывать на этот форум. Поэтому мои посты могут появляться здесь спустя весьма длительное время. Приношу извинения.
И еще одно. Вопрос, конечно, не в тему, но мне больше не у кого спросить.
Хотел поместить в пост картинку.
Когда-то давно, при добавлении в посты изображений можно было просто в нужном месте дать ссылку на файл картинки, расположенный на винчестере компьютера. Сейчас так почему-то не получается. Сейчас надо этот файл поместить в какое-то облачное хранилище и в посте дать адрес URL на этот файл ... Слишком сложно.
Это так, или я чего-то не понял ? Попроще никак ?
- Игорь Белов
- Гуру
- Сообщения: 2230
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1503
- Откуда: Казань
Re: Ошибка в формуле вычисления координат для проекции Меркатора
Жмите кнопку [Добавить файлы].KotAlex писал(а): ↑07 ноя 2019, 11:47Хотел поместить в пост картинку.
Написано также: «Можно прикреплять файлы, перетаскивая их в окно сообщения.»
The purpose of computing is insight, not numbers
-
- Участник
- Сообщения: 79
- Зарегистрирован: 24 дек 2015, 11:28
- Репутация: 1
Re: Ошибка в формуле вычисления координат для проекции Меркатора
Большое спасибо за изобретение, оно оказалось весьма полезным.Игорь Белов писал(а): ↑06 ноя 2019, 17:31... специально для Вас только что на основе формулы (3) придумал итеративный алгоритм (4) – (7).
Когда я набивал в исходном коде проекта процедуру итерации по Вашим формулам, то, откровенно говоря, не очень-то надеялся на результат, поскольку уже более чем сыт всевозможными криво работающими формулами.
Однако, к моему большому удивлению, Ваша итерация очень хорошо пошла с первого же запуска ...
При тестовом прогоне Ваш алгоритм продемонстрировал очень хорошие сходимость, устойчивость и точность.
Результаты такие.
Посмотрел по Вашей ссылке метод разложения в ряд для перехода от широты на сфере к
широте на эллипсоиде :
viewtopic.php?f=25&t=25373
Бр-р-р-р ... Лучше не надо ...
В реальном проекте пробовал реализовать прямые ( из градусов в метры ) и обратные ( из метров в градусы ) преобразования по ссылкам, которые приведены в моем первом посте:
Первая :
https://blog.foxylab.com/prakticheskaya-kartografiya/
Вторая :
https://ru.wikipedia.org/wiki/Проекция_Меркатора
И третий вариант - Ваши формулы итерационного обратного преобразования.
Для того, чтобы прямые и обратные преобразования по первым двум вариантам работали правильно и точно, необходимо подгонять для них параметры земного эллипсоида. Что я и сделал. Беда только в том, что после такой подгонки эти параметры перестают соответствовать друг другу ...
Обратные итерационные преобразования :
первый вариант - обеспечивает хорошие сходимость, устойчивость и точность.
второй - фактически не работает.
третий ( ваш ) вариант - обеспечивает хорошие сходимость, устойчивость и точность. При тестовом прогоне выдает результаты, у которых разность с первым вариантом исчезающе мала.
Вот так вот. Вроде как все, что могу сказать.
Еще раз большое спасибо.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 12 гостей