Hoy te mostraré cómo calcular la distancia entre dos puntos del globo terráqueo a partir de las coordenadas de los mismos, usando el lenguaje de programación C. Por ejemplo, sabremos la distancia que hay entre dos ciudades o lugares usando solo sus coordenadas.
Al final tendremos un programa en C que nos dirá la distancia que hay entre dos puntos en línea recta, con el resultado en kilómetros que al final podremos convertir a otra unidad como metros o millas.
Por cierto, vamos a usar la fórmula del semiverseno, también conocida como Haversine.
Nota: esto es distinto a calcular la distancia entre dos puntos de un plano cartesiano, aquí vamos a calcular la distancia entre dos puntos geográficos, es decir, dos lugares del planeta Tierra.
Explicación del algoritmo
Para calcular la distancia simplemente nos vamos a basar en la fórmula y la aplicación de la misma, así como la conversión de grados a radianes, ya que necesitamos operar con radianes.
Después, vamos a encerrar la fórmula en una función para separar el código y reutilizarlo cuando sea necesario.
Haversine en C – Distancia entre dos puntos
El método va a recibir los 2 puntos con su latitud y longitud. Así que va a recibir la latitud 1, longitud 1, latitud 2 y longitud 2. Devolverá la distancia en kilómetros:
/*
Recibe dos pares de coordenadas en grados (así como las da Google maps)
Regresa la distancia que hay entre esos dos puntos en Kilómetros
*/
double calcularDistanciaEntreDosCoordenadas(double lat1, double lon1, double lat2, double lon2)
{
// Convertir todas las coordenadas a radianes
lat1 = gradosARadianes(lat1);
lon1 = gradosARadianes(lon1);
lat2 = gradosARadianes(lat2);
lon2 = gradosARadianes(lon2);
// Aplicar fórmula
double RADIO_TIERRA_EN_KILOMETROS = 6371;
double diferenciaEntreLongitudes = (lon2 - lon1);
double diferenciaEntreLatitudes = (lat2 - lat1);
double a = pow(sin(diferenciaEntreLatitudes / 2.0), 2) + cos(lat1) * cos(lat2) * pow(sin(diferenciaEntreLongitudes / 2.0), 2);
double c = 2 * atan2(sqrt(a), sqrt(1 - a));
double d = RADIO_TIERRA_EN_KILOMETROS * c;
return d;
}
Como puedes ver en la línea 8 a 11, estamos convirtiendo todas las coordenadas a radianes para poder operar con ellas sin problemas. Después simplemente hacemos los cálculos usando la fórmula a través de las funciones trigonométricas y regresamos el resultado.
Por cierto, fíjate en que dentro de la función usamos a Pi.
Ejemplo: cálculo de distancia en C
Te mostraré el código completo en donde importamos las librerías necesarias y mostramos un ejemplo de uso. En este caso calcularé la distancia que hay entre la CDMX y un lugar de Yucatán.
El código queda así:
// https://parzibyte.me
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
double gradosARadianes(double grados)
{
return grados * PI / 180;
}
/*
Recibe dos pares de coordenadas en grados (así como las da Google maps)
Regresa la distancia que hay entre esos dos puntos en Kilómetros
*/
double calcularDistanciaEntreDosCoordenadas(double lat1, double lon1, double lat2, double lon2)
{
// Convertir todas las coordenadas a radianes
lat1 = gradosARadianes(lat1);
lon1 = gradosARadianes(lon1);
lat2 = gradosARadianes(lat2);
lon2 = gradosARadianes(lon2);
// Aplicar fórmula
double RADIO_TIERRA_EN_KILOMETROS = 6371;
double diferenciaEntreLongitudes = (lon2 - lon1);
double diferenciaEntreLatitudes = (lat2 - lat1);
double a = pow(sin(diferenciaEntreLatitudes / 2.0), 2) + cos(lat1) * cos(lat2) * pow(sin(diferenciaEntreLongitudes / 2.0), 2);
double c = 2 * atan2(sqrt(a), sqrt(1 - a));
double d = RADIO_TIERRA_EN_KILOMETROS * c;
return d;
}
int main(int argc, char const *argv[])
{
//19.418596787147735, -99.13722247901451
double latitud1 = 19.418596787147735;
double longitud1 = -99.13722247901451;
//20.96173231042663, -89.59867366422759
double latitud2 = 20.96173231042663;
double longitud2 = -89.59867366422759;
printf("Calculando distancia entre %lf,%lf y %lf,%lf\n", latitud1,longitud1,latitud2,longitud2);
// Calcular
double distancia = calcularDistanciaEntreDosCoordenadas(latitud1, longitud1, latitud2, longitud2);
printf("La distancia es: %lf Km\n", distancia);
return 0;
}
Al ejecutarlo, los resultados son correctos. De hecho hice el mismo cálculo con Google maps y los resultados son iguales como puedes observar en la siguiente imagen. Ahí en el código dejé las coordenadas por si quieres comprobarlo a tu manera.
Ya a partir de esta función tú puedes solicitar datos al usuario para las coordenadas, mostrar lugares cercanos a determinado lugar, etcétera.
Para terminar te dejo más posts sobre C.