Pregunta

Si tengo dos ubicaciones GPS, digamos 51.507222, -0.1275 y 48.856667, 2.350833, ¿qué fórmula podría usar para calcular la distancia entre las dos?Escuché mucho sobre una fórmula de Haversine, pero no puedo encontrar ninguna información al respecto, o cómo aplicarla a C.

He escrito el siguiente código, sin embargo, es muy inexacto.¿Alguien sabe por qué?No puedo resolverlo.El problema proviene de la función en sí, pero no sé cuál es.

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

Solución

Esta página tiene un bloque de Javascript que soyseguro que puedes adaptarte con bastante facilidad en 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;

Otros consejos

Su código es absolutamente correcto.

Cambiaría el nombre de los parámetros A, B, C y D a lat1, lon1, lat2 y lon2.

Devuelve la distancia en kilómetros.Debe definir r como 6371, aproximadamente el radio de la tierra .

Lo que está buscando es la gran distancia circular .

Tal vez sea demasiado tarde, pero esta es la razón del cálculo inexacto: -> A y C (lat1 y lat2) también deben convertirse de grados a radianes

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

saludos, omeier

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top