C, Расчет расстояния между двумя точками GPS? - PullRequest
1 голос
/ 30 апреля 2011

Если у меня есть два местоположения GPS, скажем, 51.507222, -0.1275 и 48.856667, 2.350833, какую формулу я могу использовать для расчета расстояния между ними? Я много слышал о формуле haversine, но не могу найти никакой информации о ней или о том, как применить ее к C.

Я написал следующий код, однако он очень неточен. Кто-нибудь знает почему? Я не могу понять это. Проблема связана с самой функцией, но я не знаю, что это такое.

float calcDistance(float A, float B, float C, float D) 
{
    float dLat;
    float dLon;
    dLat = (C - A);
    dLon = (D - B);
    dLat /= 57.29577951;
    dLon /= 57.29577951; 
    float v_a;
    float v_c;
    float distance;

    v_a = sin(dLat/2) * sin(dLat/2) + cos(A) * cos(C) * sin(dLon/2) * sin(dLon/2);
    v_c = 2 * atan2(sqrt(v_a),sqrt(1-v_a));
    distance = r * v_c;
    return distance;
}

Ответы [ 4 ]

4 голосов
/ 04 мая 2011

Ваш код абсолютно правильный.

Я бы переименовал параметры A, B, C и D в lat1, lon1, lat2 и lon2,

Возвращает расстояние в километрах.Вам необходимо определить r как 6371, примерно радиус Земли .

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

То, что вы ищете, это большое расстояние круга .

1 голос
/ 17 января 2017

Может быть, уже слишком поздно, но это является причиной неточного расчета: -> A и C (lat1 и lat2) также должны быть преобразованы из градусов в радианы

dLat /= 57.295779513082325;
dLon /= 57.295779513082325;
lat1 /= 57.295779513082325;
lat2 /= 57.295779513082325;

относительно, omeier

1 голос
/ 30 апреля 2011

Эта страница содержит блок Javascript, который, я уверен, вы могли бы достаточно легко адаптировать в C:

var R = 6371e3; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();

var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
        Math.cos(φ1) * Math.cos(φ2) *
        Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

var d = R * c;
...