Sans réponse à nos précédentes questions, j'ai fini par contourner ce problème en mettant du code (trouvé sur Internet puis adapté) directement dans un scénario. Cela faisait longtemps que je n'avais pas manipulé les sinus, cosinus et autres arctangentes… Ca fait du bien par où ça passe
. Ce code calcule la distance entre un iPhone et un point fixe à partir des coordonnées qu'on arrive bien à récupérer depuis geotrav. Un détail à noter cependant, il faut récupérer les coordonnées et non pas la latitude et la longitude, qui, pour une raison que j'ignore, se mettent à jour beaucoup moins rapidement que les coordonnées.
On commence par initialiser nos variables avec les coordonnées GPS :
- Capture.JPG (32.39 Kio) Consulté 3143 fois
Puis on insère directement du code :
Code : Tout sélectionner
class Misc {
/**
* Retourne la distance en metre ou kilometre (si $unit = 'k') entre deux latitude et longitude
*/
public static function distance($lat1, $lng1, $lat2, $lng2, $unit = 'k') {
$earth_radius = 6378137; // Terre = sphère de 6378km de rayon
$rlo1 = deg2rad($lng1);
$rla1 = deg2rad($lat1);
$rlo2 = deg2rad($lng2);
$rla2 = deg2rad($lat2);
$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));
//
$meter = ($earth_radius * $d);
if ($unit == 'k') {
return $meter / 1000;
}
return $meter;
}
}
$coord = $scenario->getData('Coord_Aurelien');
list($Lat_Aurelien, $Long_Aurelien) = explode(",", $coord);
$Lat_Maison= $scenario->getData('Lat_Maison');
$Long_Maison= $scenario->getData('Long_Maison');
$value=round(Misc::distance($Lat_Maison,$Long_Maison,$Lat_Aurelien,$Long_Aurelien), 3);
$scenario->setData("Distance_Aurelien", $value);
Et on récupère la distance dans la variable Distance_Aurelien qu'on peut ensuite utiliser dans le reste du scénario.
Cela marche très bien chez moi et c'est ultra précis, au mètre près, malgré l'approximation du rayon moyen de la terre à 6378,137 kms…