Знатоки, скажите пожалуйста, правильно ли я решаю прямую геодезическую задачу.
Есть объект на карте, который имеет широту и долготу. Хотим определить точку (широта, долгота), в которой будет находиться этот объект пройдя заданное расстояние в метрах по заданному курсу (азимуту). Причем маршрут будет представлять собой всегда пярмую на карте с меркаторской проекцией (т.е. курс постоянный).
Входные данные:
Ш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 производить просчет второй точки.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.