Saltar al contenido

¿Calcular la distancia entre dos puntos de latitud-longitud? (fórmula de Haversine)

Ya no tienes que investigar más en otras páginas ya que has llegado al lugar correcto, poseemos la solución que quieres pero sin problemas.

Solución:

Este enlace puede resultarle útil, ya que detalla el uso de la fórmula de Haversine para calcular la distancia.

Extracto:

este guion [in Javascript] calcula las distancias de círculo máximo entre los dos puntos, es decir, la distancia más corta sobre la superficie terrestre, utilizando la fórmula ‘Haversine’.

function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) 
  var R = 6371; // Radius of the earth in km
  var dLat = deg2rad(lat2-lat1);  // deg2rad below
  var dLon = deg2rad(lon2-lon1); 
  var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
  var d = R * c; // Distance in km
  return d;


function deg2rad(deg) 
  return deg * (Math.PI/180)

Necesitaba calcular muchas distancias entre los puntos para mi proyecto, así que seguí adelante e intenté optimizar el código que encontré aquí. En promedio en diferentes navegadores mi nueva implementación corre 2 veces más rápido que la respuesta más votada.

function distance(lat1, lon1, lat2, lon2) 
  var p = 0.017453292519943295;    // Math.PI / 180
  var c = Math.cos;
  var a = 0.5 - c((lat2 - lat1) * p)/2 + 
          c(lat1 * p) * c(lat2 * p) * 
          (1 - c((lon2 - lon1) * p))/2;

  return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km

Puedes jugar con mi jsPerf y ver los resultados aquí.

Recientemente necesitaba hacer lo mismo en python, así que aquí hay un implementación de Python:

from math import cos, asin, sqrt, pi

def distance(lat1, lon1, lat2, lon2):
    p = pi/180
    a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p) * cos(lat2*p) * (1-cos((lon2-lon1)*p))/2
    return 12742 * asin(sqrt(a)) #2*R*asin...

Y en aras de la exhaustividad: Haversine en wiki.

Aquí hay una implementación de C#:

static class DistanceAlgorithm

    const double PIx = 3.141592653589793;
    const double RADIUS = 6378.16;

    /// 
    /// Convert degrees to Radians
    /// 
    /// Degrees
    /// The equivalent in radians
    public static double Radians(double x)
    
        return x * PIx / 180;
    

    /// 
    /// Calculate the distance between two places.
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    public static double DistanceBetweenPlaces(
        double lon1,
        double lat1,
        double lon2,
        double lat2)
    
        double dlon = Radians(lon2 - lon1);
        double dlat = Radians(lat2 - lat1);

        double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(Radians(lat1)) * Math.Cos(Radians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));
        double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
        return angle * RADIUS;
    


Si entiendes que te ha resultado de utilidad este post, agradeceríamos que lo compartas con otros seniors de este modo contrubuyes a extender nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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