Расчет расстояния с использованием координат широты и долготы в километрах с помощью Java - PullRequest
3 голосов
/ 05 апреля 2011

У меня есть следующий метод, который вычисляет расстояние и возвращает его в милях:

public static int calcDistance(float latA, float longA, float latB, float longB) {

    double theDistance = (Math.sin(Math.toRadians(latA)) *
            Math.sin(Math.toRadians(latB)) +
            Math.cos(Math.toRadians(latA)) *
            Math.cos(Math.toRadians(latB)) *
            Math.cos(Math.toRadians(longA - longB)));

    return new Double((Math.toDegrees(Math.acos(theDistance))) * 69.09).intValue();
}

Что необходимо изменить, чтобы этот метод возвращал километры?

А какие еще способы вычисления расстояния между A и B существуют?

(желательно в коде Java)

Ответы [ 5 ]

4 голосов
/ 06 апреля 2011

Вам нужно только изменить последнюю строку на:

return new Double((Math.toDegrees(Math.acos(theDistance))) * 
    69.09*1.6093).intValue();

1 миля = 1.6093 километра

2 голосов
/ 06 апреля 2011

Поскольку эта формула возвращает результат в милях, просто конвертируйте из миль в километры

kilometers = miles * 1.609344
0 голосов
/ 27 ноября 2011

Расстояние, которое вы вычисляете, основано на Земле как сфере, что может быть полезно для сравнения приблизительных - коротких - расстояний. Для получения лучших результатов на больших расстояниях (например, воздушное путешествие) я бы порекомендовал библиотеке Geospatial Utility (например, GeoTools с открытым исходным кодом) принять во внимание такие вещи, как эллипсоидная природа формы Земли.

Многие решения Geo профессионального уровня используют WGS-84 в качестве модели, которую поддерживает GeoTools.

Помните - получение 100 десятичных знаков «точности» не считается, если ваши предположения неверны! ;)

0 голосов
/ 06 апреля 2011

Вы могли бы изменить свой код, чтобы сказать

return new Double((Math.toDegrees(Math.acos(theDistance))) * 111.12).intValue();

эквивалентно уже выраженным преобразованиям.

Существуют альтернативные и лучшие формулы для расчета расстояний по широте и долготе. Формула Ламберта выглядит превосходно, дает точность 10 метров на расстояниях в тысячи километров и использует часть кода, который вы уже предоставили.

0 голосов
/ 06 апреля 2011

Я полагаю, вы ищете формулу haversine: http://www.movable -type.co.uk / scripts / latlong.html

Формула умножается на радиус Земли,который определяет результирующие единицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...