L'INSEE met à dispo une base qui recense toutes les villes de France, avec leur CP, code INSEE, lat, long, et autres données je crois. Je n'ai gardé que le nom des villes, le CP, et les coordonnées lat-long. En suite, j'ai créé le champ filtre (utile pour vérifier un formulaire par exemple). Et enfin, j'ai créé les tables region et departement, en prenant soin de bien lier les indices (id region, id departement, id ville).
Donc non, je n'en suis pas l'auteur, je me suis inspiré de ce que proposait l'INSEE et l'ai "arrangé" selon mon utilité.
Voici un script permettant de calculer la distance à vol d'oiseau entre 2 villes (non-optimisé, mais fonctionnel) :
class Misc
{
public static function getDistance($_idVille1, $_idVille2)
{
$result = mysql_query("SELECT lat, lon FROM ville WHERE id = $_idVille1 OR id = $_idVille2");
$i = 0;
while($data = mysql_fetch_array($result))
{
if($i == 0)
{
$rlo1 = deg2rad($data['lon']);
$rla1 = deg2rad($data['lat']);
}
elseif($i == 1)
{
$rlo2 = deg2rad($data['lon']);
$rla2 = deg2rad($data['lat']);
}
$i++;
}
$earthRadius = 6367000;
$dlo = ($rlo2 - $rlo1) / 2;
$dla = ($rla2 - $rla1) / 2;
$a = (sin($dla) * sin($dla)) + cos($rla1) * cos($rla2) * (sin($dlo) * sin($dlo));
$d = 2 * atan2(sqrt($a), sqrt(1 - $a));
$distance = $earthRadius * $d;
return ceil($distance / 1000);
}
}
L'appel se fait ainsi :
Imaginons que nous voulions la distance entre Lyon (id dans la table : 27534) et Dunkerque (id dans la table : 22379) :
$distance = Misc::getDistance(27534, 22379);