Balades En Normandie

Affichage des randos voisines

Comment afficher, dans BaladesEnNormandie.fr, les randonnées voisines de celle dont je regarde les détails ? L’idée me trottait dans la tête depuis un moment, mais mes réponses étaient trop lourdes pour un fichier jquery déjà bien chargé.

BaladesEnNormandie.fr possède une table avec la latitude et la longitude de chaque point de départ de randonnée. Il me fallait donc une requête SQL qui sorte les circuits les plus proches de celui que je consultais. Mais comment calculer une distance à partir de coordonnées géographiques dans une requête SQL ?

Comment calculer une distance à partir de coordonnées géographiques ?

J’ai trouvé sur le web la formule magique ! Une formule qui va utiliser le point de départ du circuit que je consulte ($latitude, $longitude), et les colonnes ` lat ` et ` lon ` de ma table SQL :

 $formule="(6366*acos(cos(radians($latitude))*cos(radians(`lat`))*cos(radians(`lon`) -radians($longitude))+sin(radians($latitude))*sin(radians(`lat`))))"; 

Il me reste à utiliser cette formule dans une requête SQL :

 $sql="SELECT id,depart,$formule AS dist FROM rando WHERE $formule<=20 ORDER by dist ASC LIMIT 4";

J’ai installé ce code dans une page PHP, et les résultats étaient flagrants dès mon premier test : ça marche ! A partir du point de départ d’une rando, j’obtenais les 3 circuits voisins les plus proches en ordre ascendant de distance ! Oui, 3. Dans ma requête SQL il y a un LIMIT 4, mais la première rando de cette liste est ma rando de référence. J’ai limité les randos voisines à un cercle de 20 km autour du circuit de référence : $formule<=20

Cette page PHP est appelée par un $.ajax de mon fichier jquery principal, mais cet $.ajax n’est sollicité que lorsque tout le reste est chargé. Non seulement il est léger, mais il arrive en dernier. Aucun ralentissement donc.

2 réflexions au sujet de “Affichage des randos voisines”

    • Bonjour. J’ai un champ « twit » pour le court descriptif que je n’ai pas mentionné pour simplifier. La vignette porte le nom de l’ID du circuit.

      Répondre

Laisser un commentaire