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.
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.
Vraiment intéressant ce système de maillage. Bien pensé !
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 !
Merci ! c’est plutôt une bonne astuce !
Cela me donne des idées concernant des pistes d’optimisation pour Google Venice 🙂