Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Занимательная геодезия.doc
Скачиваний:
9
Добавлен:
24.11.2019
Размер:
465.41 Кб
Скачать

Геодезические задачи

Путешествовать по локсодроме очень просто, но за эту простоту приходится платить: локсодрома отправит вас в путешествие по неоптимальному маршруту. В частности, путь вдоль параллели (если это не экватор) не является кратчайшим! Для того, чтобы найти кратчайший путь на сфере, нужно провести окружность с центром в центре сферы, проходящую через эти две точки (или, что то же самое, пересечь сферу с плоскостью, проходящей через две точки и центр сферы). Невозможно спроецировать сферу на плоскость так, чтобы кратчайшие пути при этом переходили в прямые отрезки; проекция Меркатора, разумеется, не исключение, и ортодромы в ней выглядят сильно искаженными дугами. Некоторые пути (через полюс) в проекции Меркатора корректно изобразить невозможно: Примерно так проецируется кратчайший путь из Анадыря в Кардифф: сначала улетаем в бесконечность строго на север, а потом возвращаемся из бесконечности строго на юг. В случае движения по сфере кратчайшие пути строятся довольно просто с помощью аппарата сферической тригонометрии, а вот в случае эллипсоида задача существенно усложняется — кратчайшие пути не выражаются в элементарных функциях. (Замечу, что эта проблема, конечно же, не решается выбором сферической проекции Меркатора — построение кратчайших путей осуществляется на референсном эллипсоиде WGS 84 и никак не зависит от параметров проекции.) В ходе разработки API Яндекс.Карт версии 2.0 перед нами встала непростая задача — параметризовать построение кратчайших путей так, чтобы: — можно было легко пользоваться встроенными функциями для расчета кратчайших путей на эллипсоиде WGS 84; — можно было легко задать собственную систему координат с собственными методами расчета кратчайших путей. API Карт ведь можно использовать не только для показа карт земной поверхности, но и, скажем, поверхности Луны или какого-нибудь игрового мира. Для построения кратчайших путей (геодезических линий) в общем случае используется следующее простенькое и незатейливое уравнение: Здесь   — т.н. символы Кристоффеля, выражающиеся через частные производные фундаментального метрического тензора. Заставлять пользователя ТАКИМ образом параметризовать свою область картографирования нам показалось несколько негуманным :). Поэтому мы решили пойти другим путём, более приближенным к Земле и потребностям наших пользователей. В геодезии проблемы построениях кратчайших путей составляют т.н. первую (прямую) и вторую (обратную) геодезические задачи. Прямая геодезическая задача: дана исходная точка, направление движения (обычно — путевой угол, т.е. угол между направлением на север и направлением движения) и пройденное расстояние. Требуется найти конечную точку и конечное направление движения. Обратная геодезическая задача: даны две точки. Требуется найти расстояние между ними и направление движения. Обратите внимание, что направление движения (путевой угол) — непрерывная функция, которая изменяется на протяжении всего пути. Имея в своём распоряжении функции решения этих задач, мы с их помощью можем решить необходимые нам кейсы в API Карт: вычисление расстояний, отображение кратчайших путей и построение окружностей на земной поверхности. Мы заявили следующий интерфейс для пользовательских координатных систем: solveDirectProblem(startPoint, direction, distance) — Решает так называемую первую (прямую) геодезическую задачу: где мы окажемся, если выйдем из указанной точки в указанном направлении и пройдём, не сворачивая, указанное расстояние. solveInverseProblem(startPoint, endPoint, reverseDirection) — Решает так называемую вторую (обратную) геодезическую задачу: построить кратчайший маршрут между двумя точками на картографируемой поверхности и определелить расстояние и направление движения.  getDistance(point1, point2) — возвращает кратчайшее (вдоль геодезической линии) расстояние между двумя заданными точками (в метрах). (Функция getDistance выделена отдельно для тех случаев, когда расчет расстояний можно выполнить намного быстрее, чем решение обратной задачи.) Этот интерфейс показался нам достаточно простым для реализации в случаях, если пользователь картографирует какую-то нестандартную поверхность или пользуется нестандартными координатами. Со своей стороны мы написали две стандартных реализации — для обычной декартовой плоскости и для референсного эллипсоида WGS 84. Для второй реализации мы использовали формулы Винсенти. Кстати, непосредственно реализовывал эту логику runawayed, передаём ему привет :). Все эти геодезические возможности доступны в API Яндекс.Карт, начиная с версии 2.0.13. Welcome!