en: Negocio
Es un problema poco habitual ya que no siempre se trabaja con coordenadas geográficas en las aplicaciones web, pero en estos últimos años con la irrupción de Google Maps y servicios similares es muy habitual encontrarnos con Mashup que giran en torno a mapas.
Antes de comenzar a desarrollar y solucionar el problema veamos sus posibles funciones dentro de las aplicaciones web:
En la superficie de la Tierra no nos movemos por un plano recto por lo que en todos los cálculos de distancia debemos tener en cuenta el arco que describe el recorrido entre dos puntos, es pura trigonometria.
Para entender la solución al problema es muy importante entender la formula Haversine, es una ecuación muy importante para la navegación en la que podemos obtener la distancia entre dos puntos geográficos (longitud y latitud) dados.
En este tipo de cálculos omitimos el hecho de que la Tierra no es perfectamente redonda lo que haría aún más complejo el cálculo, en principio este hecho no nos debe afectar y con la solución dada nos será más que suficiente.
Aquí tenemos la solución para calcular la distancia entre dos puntos con MySql:
Habitualmente cuando trabajamos con mapas en nuestra aplicación web utilizamos dos campos en la base de datos para almacenar la geolocalización de un punto, estos dos datos son la latitud (su línea de base es el Ecuador) y la longitud (su línea de base es el Meridiano de Greenwich).
Cogemos dos puntos aleatorios, por ejemplo Catedral de Málaga y Plaza de Colón de Madrid.
| Catedral Málaga | Plaza de Colón | |
| latitud | 36.720139 | 40.425797 |
| longitud | -4.419422 | -3.690462 |
Radio de la Tierra: 6378 km.
SELECT (acos(sin(radians(36.720139)) * sin(radians(40.425797)) +
cos(radians(36.720139)) * cos(radians(40.425797)) *
cos(radians(-4.419422) - radians(-3.690462))) * 6378) as
distanciaMalagaMadrid;
+-----------------------+ | distanciaMalagaMadrid | +-----------------------+ | 417.34812304175 | +-----------------------+
El resultado es de 417,348 Kilómetros.
Veamos la soluciónd e una manera más limpia:
| PUNTO 1 | PUNTO 2 | |
| latitud | LATITUD_1 | LATITUD_2 |
| longitud | LONGITUD_1 | LONGITUD_2 |
SELECT (acos(sin(radians(LATITUD_1)) * sin(radians(LATITUD_2)) +
cos(radians(LATITUD_1)) * cos(radians(LATITUD_2)) *
cos(radians(LONGITUD_1) - radians(LONGITUD_2))) * 6378) as
distanciaPunto1Punto2;
Esta sería la Formula de Haversine anteriormente citada:
Radio de la Tierra: 6378 km.
R = earth’s radius (mean radius = 6,378km)
Δlat = lat2− lat1
Δlong = long2− long1
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c
Y esta sería su implementación en código Javascript:
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).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;
7 Respuestas a Distancia entre dos puntos geográficos con MySql
mayra
17 de Noviembre de 2008 a las 5:35 pm
estaria bueno que pongan como se marcan los puntos geograficos asi es mas facil aprender a marcarlos y no poner tanta info por que es mucho al divino boton ademas porai solo necesita algo de la info y tiene que andar leyendo todo este fue mi comentari byeeeeeeeee
Javi
6 de Noviembre de 2008 a las 9:22 am
function getDistance($lat1, $long1, $lat2, $long2)
{
$earth = 6371; //km change accordingly
//$earth = 3960; //miles
//Point 1 cords
$lat1 = deg2rad($lat1);
$long1= deg2rad($long1);
//Point 2 cords
$lat2 = deg2rad($lat2);
$long2= deg2rad($long2);
//Haversine Formula
$dlong=$long2-$long1;
$dlat=$lat2-$lat1;
$sinlat=sin($dlat/2);
$sinlong=sin($dlong/2);
$a=($sinlat*$sinlat)+cos($lat1)*cos($lat2)*($sinlong*$sinlong);
$c=2*asin(min(1,sqrt($a)));
$d=($earth*$c);
return $d;
}
Anónimo
3 de Marzo de 2009 a las 3:00 pm
Quiero calcular la distancia entre la iglesia de O Conforto(pontenova-Lugo) y finca galea(A Seara-Alfoz_lugo)
patricia
15 de Octubre de 2009 a las 1:47 am
la neta gracias esta bien chido me evito tanta fatiga y esfuerzo
gracias
Jalzhar
9 de Noviembre de 2009 a las 5:46 am
Eres mi Dios!!!! En mySQL, te amo!! xD
susana
19 de Junio de 2010 a las 11:36 pm
Necesito hacer esta consulta en My SQL : Obtener las distancias entre los domicilios de los clientes de Minnesota ordenadas por cliente en inicio del trayecto, cliente al final del trayecto. si alguien tiene alguna idea?
jorge
27 de Junio de 2010 a las 7:37 pm
me podriais decir la distancia entre el aeropuerto de barajas y el centro de salud san fernando de heneres en la calle cordova