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);