Hum, j'ai quelques incompréhensions et comme les maths c'est pas trop mon truc, je ne sais pas trop d'où ça peut venir.
J'explique rapidement la situation : j'ai une base de données avec toutes les communes de France, leur code postal, code Insee, Latitude et Longitude. Le but de ma fonction est de trouver toutes les communes dans un rayon de 10km autour d'un point donné.
Je fais donc une requete avec le code postal pour obtenir les coordonnées de la commune. Je garde ces coordonnées dans un coin :
$latDepart = $contenu['Latitude'];
$longDepart = $contenu['Longitude'];
Je converti en angle mes 10km pour délimiter une zone de recherche
// Données fixes
$R = 6371; // rayon de la Terre
$kilometre = 10; // nb de kilometre qu'on veut parcourir
$angle = $kilometre/$R; //angle donné pour varier les latitudes et longitudes
Je détermine les latitudes et longitudes maximales et minimales
$latMin = $latDepart-$angle;
$latMax = $latDepart+$angle;
$longMin = $longDepart-$angle;
$longMax = $longDepart+$angle;
Je fais ensuite une autre requete qui va chercher toutes les communes dans cette zone
$requete = "select * from communes where Latitude>$latMin and Latitude<$latMax and Longitude<$longMax and Longitude>$longMin";
Ca, ça fonctionne. J'ai l'ensemble des communes dans une surface carée autour de mon point de départ. Mais un carré ce n'est pas un rond donc je calcule la distance entre mon point de départ et les coordonées pour vérifier qu'elle n'excède pas 10km. Pour ça j'utilise la fonction trouvée dans le lien donné plus haut :
function distance($lat1, $lon1, $lat2, $lon2)
{
$lat1 = deg2rad($lat1);
$lat2 = deg2rad($lat2);
$lon1 = deg2rad($lon1);
$lon2 = deg2rad($lon2);
$R = 6371;
$dLat = $lat2 - $lat1;
$dLong = $lon2 - $lon1;
$var1= $dLong/2;
$var2= $dLat/2;
$a= pow(sin($dLat/2), 2) + cos($lat1) * cos($lat2) * pow(sin($dLong/2), 2);
$c= 2 * atan2(sqrt($a),sqrt(1-$a));
$d= $R * $c;
return $d;
}
Sauf que ... ça me donne des valeurs completement farfelues.
J'ai défini par défaut que Reims était mon point de départ
echo "Distance REIMS - ", $contenu['NomLocalite'] ," : ";
echo distance($latDepart,$longDepart,$contenu['Latitude'],$contenu['Longitude']);
Edit : j'ai compris, ma base de données exprimait les coordonées en radian et la fonction toute faite convertissait degré en radian, donc forcement, convertir un radian encore une fois en radian, c'était pas une bonnée idée
Modifié par Ondskapt (20 Jun 2007 - 10:50)