Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP MySql et géolocalisation

Le calcul de la distance à l'aide de cette fonction est assez coûteux en calcul, car il implique tout un tas de fonctions transcendantales. Cela va être problématique lorsque vous avez un grand nombre de lignes à filtrer.

Voici une alternative, une approximation beaucoup moins coûteuse en calcul :

Distance approximative en miles :

sqrt(x * x + y * y)

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

Vous pouvez améliorer la précision de ce calcul de distance approximative en ajoutant la fonction mathématique cosinus :

Amélioration de la distance approximative en miles :

sqrt(x * x + y * y)

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

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

J'ai effectué plusieurs tests avec des ensembles de données générés aléatoirement.

  • La différence de précision pour les 3 algorithmes est minime , surtout sur de courtes distances
  • L'algorithme le plus lent est, bien sûr, celui avec les fonctions trigonométriques (celui sur votre question). Il est 4 fois plus lent que les deux autres.

Certainement pas la peine. Allez juste avec une approximation.
Le code est ici :http://pastebin.org/424186

Pour l'utiliser sur MySQL, créez une procédure stockée qui prend des arguments de coordonnées et renvoie la distance, alors vous pouvez faire quelque chose comme :

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