sql >> Base de Datos >  >> RDS >> Mysql

PHP MySql y geolocalización

Calcular la distancia usando esa función es bastante costoso desde el punto de vista computacional, porque involucra un montón de funciones trascendentales. Esto será problemático cuando tenga una gran cantidad de filas para filtrar.

Aquí hay una alternativa, una aproximación que es mucho menos costosa computacionalmente:

Distancia aproximada en millas:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1) 
and y = 53.0 * (lon2 - lon1) 

Puede mejorar la precisión de este cálculo de distancia aproximada agregando la función matemática coseno:

Distancia aproximada mejorada en millas:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1) 
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

Fuente:http://www.meridianworlddata.com/Distance-Calculation.asp

Realicé un montón de pruebas con conjuntos de datos generados aleatoriamente.

  • La diferencia en la precisión de los 3 algoritmos es mínima , especialmente en distancias cortas
  • El algoritmo más lento es, por supuesto, el que tiene las funciones trigonométricas (el de su pregunta). Es 4 veces más lento que los otros dos.

Definitivamente no vale la pena. Solo ve con una aproximación.
El código está aquí:http://pastebin.org/424186

Para usar esto en MySQL, cree un procedimiento almacenado que toma argumentos de coordenadas y devuelve la distancia, entonces puedes hacer algo como:

SELECT columns 
  FROM table 
 WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25