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)