Вычисление 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, если вы хотите иметь вход в километры или мили, если вы хотите вводить мили.