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:
- Encontrar localizaciones cercanas a un punto dado
- Red Social: encontrar amigos cercanos a ti
- Mapas sociales: encontrar puntos de interes cercanos
- Páginas Amarillas: encontrar servicios cercanos a un punto dado
Distancia entre dos puntos
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.
Distancia entre dos puntos geográficos con MySql
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;
Comentarios
hace 1 hora 8 mins
hace 1 hora 51 mins
hace 7 horas 26 mins
hace 7 horas 34 mins
hace 9 horas 38 mins
hace 9 horas 45 mins
hace 13 horas 29 mins
hace 13 horas 59 mins
hace 20 horas 11 mins
hace 1 día 1 hora