Широта / долгота + расстояние + курс -> широта / долгота
Итак: у меня есть следующая функция, адаптированная по формуле, найденной в Интернете, которая берет две координаты широты / долготы и находит расстояние между ними в милях (вдоль сферической Земли):
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].
Здесь тот факт, что мои навыки геометрии оставили меня полностью, вступает в игру:)
Любая помощь приветствуется!
Спасибо, Дэн
1 ответ
Я получаю большинство таких формул из Авиационного формуляра.
Формула, которую он дает:
Широта / долгота с учетом радиуса и расстояния
Точка {широта, долгота} - это расстояние 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
Этот алгоритм ограничен такими расстояниями, что dlon
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", чтобы обозначить истинный курс (в радианах по часовой стрелке от севера), и расстояния, которые он дает, указаны в радианах дуги вдоль поверхности земли. Это объясняется (вместе с формулами для перевода туда и обратно из морских миль) в первом разделе Формуляра. Также ознакомьтесь с "Замечаниями по реализации" и "Работающими примерами" на этой странице.