Vamos a crear una función que nos permita conocer la distancia en kilómetros entre dos puntos de un mapa. Dicha función nos puedes servir de mucho a la hora de calcular cuantos metros hay entre un punto a otro, o en caso de tener una aplicación que necesite calcular cuál es el lugar más cercano.
getKilometros = function(lat1,lon1,lat2,lon2)
{
rad = function(x) {return x*Math.PI/180;}
var R = 6378.137; //Radio de la tierra en km
var dLat = rad( lat2 - lat1 );
var dLong = rad( lon2 - lon1);
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(rad(lat1)) * Math.cos(rad(lat2)) * Math.sin(dLong/2) * Math.sin(dLong/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d.toFixed(3); //Retorna tres decimales
}
Para utilizar esta función solo tenemos llamarla pasando como parámetros la latitud del primer punto, la longitud del primer punto, la latitud del segundo punto y la longitud del segundo punto.
Esta función puede ser muy útil, por ejemplo, si tenemos varios puntos con sus coordenadas que extraemos de una base de datos propia y queremos filtrar solo los que se encuentren a cierta distancia del punto que nos interesa, por ejemplo, los que se encuentren a 5 kilómetros a la redonda de las coordenadas actuales. En este caso podríamos recorrer un Array con todos los puntos y preguntar por los que se encuentran a menos de 5 kilómetros de la siguiente manera:
Imaginemos que tenemos un Array A con varios puntos y sus coordenadas y queremos meter en el Array B los puntos que se encuentran a menos de 5 kilómetros de las coordenadas actuales, podríamos hacer algo como esto:
navigator.geolocation.getCurrentPosition(function(pos) {
var lat = pos.coords.latitude;
var lon = pos.coords.longitude;
for (var i=0; i<A.length; i++)
{
if(parseInt(getKilometros(lat,lon,A[i].laitude,A[i].lon))<= 5
{
B.push(A[i]);
}
}
}
Si te está preguntando de obtener la distancia en metros, solo vasta con cambiar la variable R (Radio de la tierra) a metros. Ej.
var R = 6378137; //Radio de la tierra en Metros
De esta manera, el resultado de la función sería una distancia en kilómetros.
Ejemplos en TypeScript
const getLocationMetros = (location1: location, location2: location): number => {
const rad = function (x: number) { return x * Math.PI / 180; }
//const R = 6378.137; //Radio de la tierra en km
const R = 6378137; //Radio de la tierra en Metros
const dLat = rad(location2.lat - location1.lat);
const dLong = rad(location1.lng - location2.lng);
const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(rad(location1.lat)) * Math.cos(rad(location2.lat)) * Math.sin(dLong / 2) * Math.sin(dLong / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const d = R * c;
return parseInt(d.toFixed(3))
}
De esta manera obtenemos la distancia entre 2 puntos, en metros o kilómetros.