Вопрос

Итак:У меня есть следующая функция, адаптированная на основе формулы, найденной в Интернете, которая принимает две широты / широты и находит расстояние между ними в милях (вдоль сферической Земли).:

public static double distance (double lat1, double lon1, double lat2, double lon2) {
        double theta = toRadians(lon1-lon2);
        lat1 = toRadians(lat1);
        lon1 = toRadians(lon1);
        lat2 = toRadians(lat2);
        lon2 = toRadians(lon2);

        double dist = sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(theta);
        dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000;

        return dist;
    }

Насколько я могу судить, это работает просто отлично.

Что мне нужно, так это вторая функция, которая, используя точно такую же модель геометрии Земли, принимает единственную пару широта / долгота [A], курс и расстояние и выводит новую пару широта / долгота [B], такую, что если вы стартовали в точке [A] и проехали заданное расстояние по заданному курсу, вы окажетесь в точке [B].

Вот тут-то и вступает в игру тот факт, что мои навыки геометрии полностью покинули меня :)

Любая помощь была бы высоко оценена!

Спасибо, -Дэн

Это было полезно?

Решение

Я получаю большинство этих типов формул от Авиационный Формуляр.

Формула, которую он дает, такова:

Широта/lon заданный радиус и расстояние

Точка {широта, lon} - это расстояние d от радиус tc от точки 1, если:

 lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
 IF (cos(lat)=0)
    lon=lon1      // endpoint a pole
 ELSE
    lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
 ENDIF 

Этот алгоритм ограничен такими расстояниями , что длон < pi/2, то есть те, которые простираются вокруг менее чем на одну четверть окружности земли по долготе.Полностью общий, но более сложный алгоритм необходим, если разрешены большие расстояния:

    lat =asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
     dlon=atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(lat))
     lon=mod( lon1-dlon +pi,2*pi )-pi

Обратите внимание, что он использует "tc" для обозначения истинного курса (в радианах по часовой стрелке с Севера), а расстояния, которые он указывает, указаны в радианах дуги вдоль поверхности земли.Это объясняется (вместе с формулами для пересчета туда и обратно из морских миль) в первом разделе Формуляра.Кроме того, ознакомьтесь с "Примечаниями по реализации" и "Отработанными примерами" на этой странице.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top