Calcular distancias y lugares similares con PHP y MySQL en un radio determinado

Distancia entre dos puntos con PHP y MySQL dada una latitud y longitud.

Como explique en la primera parte del calculo de distancias hay un cierto problema en calcular distancias cuando tienes un numero elevado de registros en la base de datos. Es decir, necesitamos limitar nuestros cálculos para no realizar un numero elevado de operaciones aritméticas. Ademas estas distancias tenemos que ordenar después en un vector, si queremos presentarlas decentemente.

El sentido común nos indica que es mejor calcular 50 localizaciones que 5000. Aunque desempolvando mis estudios de complejidad, si no me equivoco seria constante o kN. De hecho el simple hecho de ordenarlo después tiene mas complejidad, en el peor de los casos N*N… en fin, que alguien me corrija si eso. Lógicamente si quieres presentar un resultado ordenado, no es lo mismo ordenar 50 que 500 resultados. Recuerda que PHP tiene funciones para eso.

Un grado de Latitud o Longitud en decimal equivale a 111 kilómetros

Basandose en esta afirmación, basada en la definición de latitud, podemos acotar nuestra búsqueda MySQL en un determinado radio utilizando una simple constante con BETWEEN (desgraciadamente MySQL no tiene de eso y hay que utilizar comparaciones). Por ejemplo una constante de 0.1 grados seria equivalente a un radio de 11 kilómetros, 0.2 serian 22 kms… etc.

Después lo único que hay que hacer es acotar la consulta por valores inferiores de latitud y longitud…

El ejemplo completo con mis pruebas lo tengo subido a github. Ahí encontraras el código completo del ejemplo con una base de datos de municipios, provincias y comunidades autónomas. Clase para conectarse a MySQL, formula de Haversine en PHP y algunos test y comprobaciones. Cabe destacar que algunos municipios de Madrid tienen mal las coordenadas, de hecho me he dado cuenta al calcular las distancias.

Otras posibilidades de acotar, quizás menos eficientes.

Seguramente habrás pensado seleccionar solo municipios de una sola provincia, código postal o región. Sin embargo trabajar con radio es mucho mas preciso. Imaginate un restaurante en un municipio justo en la frontera de la provincia. Si lo comparamos con todos los restaurantes de esa provincia nos olvidamos de los que se encuentran en la adyacente y ademas puedes resultar mucho mas cercanos. Lo mismo pasa con el código postal…