Linking interne en fonction de coordonnées GPS

En 2009-2010, je travaillais sur un projet qui nécessitait la publication de pages web de villes. Ces pages présentaient un contenu unique mais leur grand nombre exigeait un linking interne efficace :

  • Ne pas simplement proposer une navigation par région / département / ville / classement alphabétique
  • Donner plus de poids aux villes les plus importantes car demande plus forte et concurrence plus importante.

La solution implémentée a consisté à réaliser un maillage interne en fonction de l’emplacement des villes les unes par rapport aux autres et à leur population :

  • Chaque village propose des liens vers les autres villages proches (par exemple à un rayon de 15km) mais seulement vers les villages et villes ayant plus d’habitants,
  • Chaque ville propose des liens vers les autres villes proches (par exemple dans un rayon de 30km) mais seulement vers les villes ayant une population plus importante,
  • Chaque grosse ville propose des liens vers les autres grosses villes proches (par exemple dans un rayon de 100km).

De cette manière, on obtient une structure pyramidale de liens en direction des plus grosses villes tout en gardant des liens/recommandations locales vers les villes moyennes.

Pour mettre en place ce linking interne, nous avons besoin de :

  • Base de données des villes avec coordonnées GPS et population (BDD MySql à télécharger ici),
  • Un script qui est capable de retourner les villes géographiquement proches de coordonnées GPS (voir ci-dessous).
/********************************************/
/* Function : Distance en km entre 2 ville
/* Input : distance($lat1 : nombre à virgule, $lng1 : nombre à virgule, $lat2 : nombre à virgule, $lng2 : nombre à virgule, false)
/* Output : Distance en km
/********************************************/

function distance($lat1, $lng1, $lat2, $lng2, $miles = true)
       {
       $pi80 = M_PI / 180;
       $lat1 *= $pi80;
       $lng1 *= $pi80;
       $lat2 *= $pi80;
       $lng2 *= $pi80;
       $r = 6372.797; // rayon de la terre en km
       $dlat = $lat2 - $lat1;
       $dlng = $lng2 - $lng1;
       $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
       $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
       $km = $r * $c;
       return ($miles ? ($km * 0.621371192) : $km);
       }

Ou sinon, une simple requête SQL qui recherche les villes dans une certaine distance :

//Après avoir récupéré latitude et longitude de la ville courante, on applique le périmètre désiré afin d'obtenir les latitudes et longitudes mini et maxi

$latarrondiinf = $villelat - $perimetre;
$latarrondisup = $villelat + $perimetre;
$longarrondiinf = $villelong - $perimetre;
$longarrondisup = $villelong + $perimetre;

//Récupération des 5 villes les plus peuplées a proximité de la ville traitée

$RequeteRechercheVillesProches="SELECT C.com_nom, C.com_lat, C.com_long,C.com_pop
       FROM communes
       WHERE C.com_lat > $latarrondiinf and com_lat < $latarrondisup
       AND C.com_long > $longarrondiinf
       AND C.com_long <$longarrondisup
       AND C.com_pop > $villepop
       AND C.com_insee<>'$IdVilleCourante'
       ORDER BY C.com_pop desc limit 5 ";

Aujourd’hui, ce projet n’existe plus mais le résultat en terme de référencement fût tout à fait satisfaisant. À tester donc… et à adapter aux nouvelles contraintes des moteurs de recherche.

6 réflexions au sujet de « Linking interne en fonction de coordonnées GPS »

  1. C’est effectivement bien vu. Tu peux faire çà aussi de manière simple des avec des ensembles comme des départements ou des régions. Mais dans ton cas c’est encore mieux.

  2. Merci pour le code très astucieux et très utile, j’ai un projet qui a justement besoin de ce type de code et je ne voyais pas trop comment le formuler et avec la base de données des villes avec coordonnées GPS en bonus, pas si simple à trouver non plus !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *