Прямая геодезическая задача

математика java геометрия Гис

Знатоки, скажите пожалуйста, правильно ли я решаю прямую геодезическую задачу.

Есть объект на карте, который имеет широту и долготу. Хотим определить точку (широта, долгота), в которой будет находиться этот объект пройдя заданное расстояние в метрах по заданному курсу (азимуту). Причем маршрут будет представлять собой всегда пярмую на карте с меркаторской проекцией (т.е. курс постоянный).

Входные данные:
Ш1, Д1 - широта, долгота начальной точки в радианах;
S - расстояние в метрах между первой точкой и точкой, которую нужно определить;
К - курс в радианах (азимут), угол по часовой стрелки от норда (истинного норда);
R - радиус сферы в метрах (землю принимаем за сферу).
Выходные данные:
Ш2, Д2 - широта, долгота конечной точки в радианах.

Мое решение:
1) Перехожу в проекцию меркатора
X1 = R*Д1 - координата Х первой точки
Y1 = R*ln(tg(pi/4 + Ш1/2)) - координата Y первой точки
2) Нахожу приращение (по Х и У координатам) на которое сдвинется объект
DX = S*sin(K)
DY = S*cos(K)
3) Нахожу координаты второй точки по смещению
X2 = X1 + DX
Y2 = Y1 + DY
4) Перехожу обратно из проекции меркатора
Д2 = Х2/R
Ш2 = 2*arctg(exp(Y2/R)) - pi/2

Все это дело я реализовал на Java. В общем хз, правильно ли это. Брал метод sphericalBetween класса GreatCircle из библиотеки openMap от BBN, но он, так понимаю, считает кратчайшее расстояние (т.е. дуга на карте с проекцией меркатора, где курс не постояный). На больших расстояниях моя реализация выдает вообще фигню какую то.

Примечание:
// набросал такую реализацию
public Geo forecastByDist(Geo geo) {
// Расстояние между точками в метрах
double distance = 5000000;

double aX = EARTH_RADIUS * geo.lonRad();
double aY = EARTH_RADIUS * Math.log(Math.tan(
Math.PI/4 + geo.latRad()/2));

double dX = distance*Math.sin(Math.toRadians(15.0d));
double dY = distance*Math.cos(Math.toRadians(15.0d));

double bX = aX + dX;
double bY = aY + dY;

double bLon = Math.toDegrees(bX/EARTH_RADIUS);
double bLat = Math.toDegrees(2*Math.atan(Math.exp(bY/EARTH_RADIUS)) - Math.PI/2);

// Geo - структурка для долготы широты
return new Geo(bLat, bLon);
}

Примечание:
беляеиф, спасибо ОГРОМНОЕ за помощь! Теперь все стало на свои места! А задачки почитаю, люблю такие вещи. А от программы требуется визуализировать движение объекта на карте. Т.е. через равные промежутки Dt производить просчет второй точки.
Ответы:
В общем анализировать лень, но как я понял, твоя задачка непростая. Если азимут постоянный, то при любом азимуте, неравном 90 градусов, путь будет стремиться по спирали к одному из полюсов, причем точного конца спирали нет, но общая длина спирали будет конечна! Поэтому при больших расстояниях фигня будет обязательна, и еще при написании программы, если ты знаешь, что пишешь, надо понимать, какая именно должна быть фигня при боьльших растсояниях
Теперь не лень стало почитать твое "решение". Если я его правильно понял, то  оно очевидно неправильное. В "проекции меркатора" (да и вообще в любой проекции сферы на плоскость) расстояния не сохраняются, поэтому в момент перехода в проекцию сразу же теряется\ возможность контролироватьпройденное расстояние.
Собствено говоря для решения я илчно вижу 2 пути:
1. Попробовать составить дифур или что там?, определяющий нужную кривую, решить дифур и применив полученные метоыд подставить в программу
2. Ходить мелкими шажками, причем тем более мелкими, чем ближе ты находишься к полюсу (при этом смотреть, чтобы не зациклиться ввиду конечности длины)
А вообще, очень советую в детсве читать эту книгу http://n-t.ru/ri/mk/sk.htm и уже первая глава там ( http://n-t.ru/ri/mk/sk001.htm ) очень близко относится к твоему вопросу
Кстати, вот еще в тему
http://ru.wikipedia.org/wiki/%D0%9B%D0%BE%D0%BA%D1%81%D0%BE%D0%B4%D1%80%D0%BE%D0%BC%D0%B8%D1%8F
Теперь дифур решать уже не нужно - там решение приведено


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

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

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.