Вычисление Lat и Long от подшипника и расстояния
Мне сложно свернуть голову вокруг какой-то тригонометрии. Я пытаюсь вывести широту и долготу назначения из начального лата и логарифма, а также расстояния и опоры.
К счастью, я нашел удивительный сайт, который точно описывает нужную мне функцию:
http://www.movable-type.co.uk/scripts/latlong.html "Точка назначения, заданная для расстояния и опоры от начальной точки" Я попробовал это в своей java-программе, но это не работает для меня. Я развернул его, как сказал сайт. Вот мой код:
double dist = 150/6371;
double brng = Math.toRadians(90);
double lat1 = Math.toRadians(26.88288045572338);
double lon1 = Math.toRadians(75.78369140625);
double lat2 = Math.asin( Math.sin(lat1)*Math.cos(dist) + Math.cos(lat1)*Math.sin(dist)*Math.cos(brng) );
double a = Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1), Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2));
System.out.println("a = " + a);
double lon2 = lon1 + a;
lon2 = (lon2+ 3*Math.PI) % (2*Math.PI) - Math.PI;
System.out.println("Latitude = "+Math.toDegrees(lat2)+"\nLongitude = "+Math.toDegrees(lon2));
Но он показывает, что результат:
a = 0.0
Latitude = 26.882880455723377
Longitude = 75.78369140625
Я не понимаю, где я делаю ошибку. Пожалуйста, кто-нибудь может помочь мне выяснить проблему.
Thanx in Advance.: -)
Ответы
Ответ 1
Ваша проблема в вашей первой строке.
Try
double dist = 150.0 / 6371.0;
Причина в том, что 150/6371
вычисляется как 0
, потому что он выполняет целочисленное деление (а не деление с плавающей запятой). Это верно, хотя результат сохраняется в double
. Вы можете заставить деление с плавающей запятой сделать одно из двух чисел литералом с плавающей запятой.
Ответ 2
если кому-то нужна функция, которая вычисляет координаты точки из другой точки, перемещенной на некоторое расстояние, ниже приведен рабочий код. Для меня это просто перемещает точку на некотором расстоянии.
import static java.lang.Math.*;
void movePoint(double latitude, double longitude, double distanceInMetres, double bearing) {
double brngRad = toRadians(bearing);
double latRad = toRadians(latitude);
double lonRad = toRadians(longitude);
int earthRadiusInMetres = 6371000;
double distFrac = distanceInMetres / earthRadiusInMetres;
double latitudeResult = asin(sin(latRad) * cos(distFrac) + cos(latRad) * sin(distFrac) * cos(brngRad));
double a = atan2(sin(brngRad) * sin(distFrac) * cos(latRad), cos(distFrac) - sin(latRad) * sin(latitudeResult));
double longitudeResult = (lonRad + a + 3 * PI) % (2 * PI) - PI;
System.out.println("latitude: " + toDegrees(latitudeResult) + ", longitude: " + toDegrees(longitudeResult));
}
- широта, долгота - координаты точки входа
- distanceInMetres - расстояние, на которое вы хотите переместить точку, на
- подшипник - угол, в направлении которого вы хотите переместить точку. 0 находится на севере, 90 - восток, 180 - юг, 270 - запад. И все между, т.е. 45 - это северо-восток.
- earthRadiusInMetres - радиус Земли в метрах.
Вы можете изменить радиус до 6371, если вы хотите иметь вход в километры или мили, если вы хотите вводить мили.