Obtención de la distancia entre dos coordenadas geográficas en C#

/// <summary>
        /// Obtiene la distancia entre dos coordenadas geográficas
        /// </summary>
        /// <param name="long1InDegrees">Longitud del punto 1 en grados</param>
        /// <param name="lat1InDegrees">Latitud del punto 1 en grados</param>
        /// <param name="long2InDegrees">Longitud del punto 2 en grados</param>
        /// <param name="lat2InDegrees">Latitud del punto 2 en grados</param>
        /// <returns>Distancia entre los dos puntos en metros</returns>
        private static double GetDistance(decimal long1InDegrees, decimal lat1InDegrees, decimal long2InDegrees, decimal lat2InDegrees)
        {
            double lats = (double)(lat1InDegrees - lat2InDegrees);
            double lngs = (double)(long1InDegrees - long2InDegrees);

            //Paso a metros
            double latm = lats * 60 * 1852;
            double lngm = (lngs * Math.Cos((double)lat1InDegrees * Math.PI / 180)) * 60 * 1852;
            double distInMeters = Math.Sqrt(Math.Pow(latm, 2) + Math.Pow(lngm, 2));
            return distInMeters;
        }

11 comentarios en “Obtención de la distancia entre dos coordenadas geográficas en C#

  1. Thank you very much. Only a comment: It could be great if you specify if the parameters must be in radians or in degrees, and if the response is in kilometers or in meters. It is not very difficult to deduce it, but it is necesary to spend some time to do it…

  2. Muy buen a porte, usando tu formula he lledao a esta para una consulta en sql server
    string cadena = «select top 4 *,Sqrt(Power((latitud – » + txtLatOrigen.Text + «) * 60 * 1852, 2) + Power((((longitud – » + txtLongOrigen.Text + «) * Cos(latitud * PI() / 180)) * 60 * 1852), 2)) as distancia from vertices order by distancia»;
    Asi teniendo en una tabla las coordenadas de las esquinas de calles podemos encontrar los puntos cercanos a un determinado punto.

  3. Hola, como se puede determinar en c# que puntos estan cercanos a una coordenada. por ejemplo yo estoy volando en lat -34.5590
    y long -58.4100, estoy cerca del aeropuerto de buenos aires que esta en -34.5592 -58.4157 como puedo resolver esto??? gracias los datos los saco de un XML, muchas gracias de nuevo!

    • No entiendo muy bien que quieres. Con esa función puedes calcular la distancia de done estás volando, al aeropuerto. ¿Exactamente que quieres decir con determinar que puntos están cercanos?

      • hola oscar gracias por responder, el tema es asi, yo estoy volando y el sistema me tiene que decir que aeropuertos tengo cerca, yo tengo un xml con las coordenadas de los aeropuertos del mundo. no se como hacer para saber que aeropuertos tengo cerca en base a las coordenadas que tengo YO , ese es mi pregunta. gracias!

        • Hola,

          Pues me temo que tendrás que ir calculando la distancia de todos los aeropuertos. Pero para simplificar el sistema puedes hacer una aproximación inicial para descartar la mayoría. A grandes rasgos, cada grado son unos 110 Km.

          Supongamos que estás en unas coordenadas X,Y. Supongamos que quieres saber los aeropuertos que están a menos de 220 Km tuya. Bueno, pues nos quedaríamos con un cuadrado imaginario que tendría como vertices superior izquierdo (X-2, Y-2), y como vertice inferior derecho (X+2, Y+2).

          Con esas coordenadas podrías hacer una consulta a BBDD para obtener todos los aeropuertos que estén en esa franja de coordenadas. Después tendrías que ir caclculando la distancia exacta a cada uno, porque para empezar el truco anterior es una aproximación muy basta, y por otro lado, los aeropuertos que estén por las esquinas del cuadrado imaginario estarán más lejos de esos 220 Km.

          • Oscar, gracias por contestar, recien puedo entrar porque no podia ingresar a la pagina, me daba error 404. mi idea es hacr esto desde linQ trayendo el dato desde un XML.. gracias por la data, lo voy a probar.. muchas gracias de nuevo

  4. Hola! Muy buena tu formula… pero tengo un par de preguntas. ¿En que formula se basa el código? No termino de entender la conversión a metros de la latitud: double latm = lats * 60 * 1852;

    Por lo que parece te basas en la distancia entre dos puntos (modulo). ¿Es así?

    Un saludo.

    • Hola Sergio. Pues si te digo la verdad no tengo ni idea. Lo escribí hace 4 años y no me acuerdo. Yo creo que me basé el otro código que me encontré por ahí, en algún otro lenguaje y lo traducí a C#. Y esa operación es una aproximación para que sea rápido y evitar usar funciones trigonométricas en ese punto ya que el error debe ser mínimo.

  5. Gracias por esta entrada, llevaba mucho tiempo buscando un modo sencillo (sin demasiada trigonometría) de calcular la distancia entre dos puntos.

    De todas formas estaría bien aclarar que es una aproximación que se ajusta más al dato real cuanto más pequeñas son las distancias.

    Cuando pongo dos puntos separados por 100 Km los errores son inferiores al 0.1% pero con distancias de 8000 km el error supera el 10%.

Responder a Sergio Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.