Como colofón a esta serie de posts sobre la api de google maps, y a pesar de no tener necesariamente que utilizar google maps para utilizar esta función vamos a crear una función que nos permita conocer la distancia en kilómetros entre dos puntos de un mapa.
Sin mas dilaciones a continuación os muestro la función en cuestión:
/** * \fn getKilometros(). * * \Description: Devuelve la distancia en kilomegtros entre dos puntos dados por su latitud y longitud * * \param (integer) lat1 : Latitud del punto 1 * \param (integer) long1 : Longitud del punto 1 * \param (integer) lat2 : Latitud del punto 2 * \param (integer) long2 : Longitud del punto 2 * * \return (integer) Distancia en kilometros * **/ 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]); } } }
Esto es todo por ahora, espero que os haya servido de ayuda.
No dudéis en dejar en los comentarios cualquier sugerencia.