GPS рассчитать расстояние с помощью библиотеки GeoUtils хорошо работает в Индии, но не работает в США для Android

У меня есть код, который хорошо работает в Индии. Этот код рассчитывает приблизительное расстояние между двумя точками. Я использовал код, указанный ниже. Но если я запускаю этот же код в США. Затем для каждого местоположения обновлений рассчитывается разное расстояние. Я передал широту и долготу источника и назначения этой функции. Приложение хорошо работает в Индии. Но не работает в США. Там же показаны разные расчеты. Заранее спасибо. Любая помощь будет признательна.

public static double distanceKm(double lat1, double lon1, double lat2, double lon2) {
        double lat1Rad = Math.toRadians(lat1);
        double lat2Rad = Math.toRadians(lat2);
        double deltaLonRad = Math.toRadians(lon2 - lon1);
        return Math.acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) * Math.cos(lat2Rad)
                * Math.cos(deltaLonRad))
                * 6371;
    }  

2 ответа

Решение

Формула - формула большего круга.
Общеизвестно, что он плохо работает на небольших расстояниях.
Причина в этой части:

Math.cos(deltaRad).  

Это косинус для очень маленькой величины, которая численно "плохо обусловлена": они плохо работают на компьютерах. (В настоящее время с двойной точностью эффект менее заметен) Поэтому для небольших расстояний формула haversine лучше подходит.

Если у вас все еще будут проблемы с формулой расстояния haversine, то, очевидно, ваши входные данные являются проблемой. (например, если читать с GPS без надлежащей предварительной фильтрации)

Высока вероятность того, что ваша реализация, хотя и использует вариант с большим кругом, даст правильный результат. Высоки шансы, что заявленное вами "правильное расстояние" неверно.

Я использую очень похожую формулу, и никогда не было никаких жалоб. Основным отличием в моей формуле является deltaLonRad, который я вычисляю следующим образом:

double deltaLonRad = Math.toRadians(lon2) - Math.toRadians(lon1);
Другие вопросы по тегам