Me parece interesante comentar una de las posibles soluciones, aplicando trigonometría, la parte favorita de mucha gente en el mundo...
¿Sabes de qué fórmula estoy hablando? Veamos un pequeño spoiler:
Ahora si que es evidente ¿verdad? 😵
Ya en serio, lo más probable es que hayas cerrado esta página sin terminar de leer este mensaje (lo entiendo), en caso contrario déjame comentar qué utilidad le podemos dar en nuestro sector y algunos ejemplos para aplicar en programación.
Estamos hablando de Haversine, aunque esa es la definición oficial y en inglés, si quieres ir a lo rápido, echa un vistazo a la traducción, conocida como la fórmula del semiverseno, que no multiverso 😜.
En nuestro caso, podemos aplicarla para calcular qué elementos están más cercanos geográficamente en función de la latitud y la longitud. Por ejemplo, tenemos una base de datos donde almacenamos marcadores con posiciones en un mapa y queremos ver cuáles son los más próximos a uno de ellos.
Consulta SQL (tabla MySQL)
SELECT
id,
(
3959 *
acos(cos(radians(37)) *
cos(radians(lat)) *
cos(radians(lng) -
radians(-122)) +
sin(radians(37)) *
sin(radians(lat)))
) AS distance
FROM markers
HAVING distance < 28
ORDER BY distance LIMIT 0, 20;
Here's the SQL statement that will find the closest 20 locations that are within a radius of 25 miles to the 37, -122 coordinate. It calculates the distance based on the latitude/longitude of that row and the target latitude/longitude, and then asks for only rows where the distance value is less than 25, orders the whole query by distance, and limits it to 20 results.
Este código está copiado de un usuario que lo compartió en nuestra biblia, StackOverflow. En su caso la distancia está calculada en millas, pero podemos adaptarlo a kilómetros fácilmente, solo hay que sustituir 3959 por 6371. ¿Quieres saber la razón? No pienso reinventar la rueda así que revisa este enlace.
No es el santo grial, pero nos puede sacar de un apuro cuando estemos trabajando y necesitemos resolver un problema como este. En la próxima actualización de la comunidad veréis un caso de uso donde se aplica 🚀
Un saludo.