Pergunta

Se eu tiver dois locais GPS, digamos 51,507222, -0,1275 e 48,856667, 2,350833, que fórmula poderia usar para calcular a distância entre os dois?Já ouvi muito sobre uma fórmula Haversine, mas não consigo encontrar nenhuma informação sobre ela ou como aplicá-la a C.

Escrevi o código a seguir, no entanto, é muito impreciso.Alguém sabe por quê?Eu não consigo entender.O problema vem da própria função, mas não sei o que é.

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;
}
Foi útil?

Solução

Esta página tem um bloco de Javascript que estoucerteza de que você poderia se adaptar facilmente em 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;

Outras dicas

Seu código está absolutamente correto.

Eu renomeia os parâmetros A, B, C e D para lat1, lon1, lat2 e lon2.

Ele retorna a distância em quilômetros.Você precisa definir r como 6371, aproximadamente o raio da terra .

O que você está procurando é a grande distância do círculo .

Maybee é tarde demais, mas esta é a razão do cálculo incorreto: -> A e C (lat1 e lat2) também devem ser convertidos de graus para radianos

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

cumprimentos, omeier

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top