Saltar al contenido

Usando la fórmula de Haversine en Javascript

Posterior a de esta larga búsqueda de información hemos podido solucionar esta preocupación que pueden tener muchos lectores. Te regalamos la solución y nuestro objetivo es servirte de gran apoyo.

Solución:

Este código está funcionando:

Number.prototype.toRad = function() 
   return this * Math.PI / 180;


var lat2 = 42.741; 
var lon2 = -71.3161; 
var lat1 = 42.806911; 
var lon1 = -71.290611; 

var R = 6371; // km 
//has a problem with the .toRad() method below.
var x1 = lat2-lat1;
var dLat = x1.toRad();  
var x2 = lon2-lon1;
var dLon = x2.toRad();  
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
                Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
                Math.sin(dLon/2) * Math.sin(dLon/2);  
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c; 

alert(d);

Observe cómo definí x1 y x2. Juega con él en: https://tinker.io/3f794

¡Aquí hay una función refactorizada basada en 3 de las otras respuestas!

Tenga en cuenta que los argumentos coords son [longitude, latitude].

function haversineDistance(coords1, coords2, isMiles) 
  function toRad(x) 
    return x * Math.PI / 180;
  

  var lon1 = coords1[0];
  var lat1 = coords1[1];

  var lon2 = coords2[0];
  var lat2 = coords2[1];

  var R = 6371; // km

  var x1 = lat2 - lat1;
  var dLat = toRad(x1);
  var x2 = lon2 - lon1;
  var dLon = toRad(x2)
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(toRad(lat1)) * Math.cos(toRad(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;

  if(isMiles) d /= 1.60934;

  return d;

Versión refactorizada de ES6 JavaScript/NodeJS:

   /**
     * Calculates the haversine distance between point A, and B.
     * @param number[] latlngA [lat, lng] point A
     * @param number[] latlngB [lat, lng] point B
     * @param boolean isMiles If we are using miles, else km.
     */
    const haversineDistance = ([lat1, lon1], [lat2, lon2], isMiles = false) => 
      const toRadian = angle => (Math.PI / 180) * angle;
      const distance = (a, b) => (Math.PI / 180) * (a - b);
      const RADIUS_OF_EARTH_IN_KM = 6371;

      const dLat = distance(lat2, lat1);
      const dLon = distance(lon2, lon1);

      lat1 = toRadian(lat1);
      lat2 = toRadian(lat2);

      // Haversine Formula
      const a =
        Math.pow(Math.sin(dLat / 2), 2) +
        Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2);
      const c = 2 * Math.asin(Math.sqrt(a));

      let finalDistance = RADIUS_OF_EARTH_IN_KM * c;

      if (isMiles) 
        finalDistance /= 1.60934;
      

      return finalDistance;
    ;

Consulte codepen para ver las pruebas contra la respuesta aceptada: https://codepen.io/harrymt/pen/dyYvLpJ?editors=1011

Si conservas alguna vacilación y forma de progresar nuestro ensayo te invitamos escribir una aclaración y con deseo lo ojearemos.

¡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 *