J'ai une base structurée comme suit avec des coordonnées GPS sur moins de 1000 lignes :
description | name | coordinates
01033002 | BELLEGARDE | 5.814167,46.0865
01089001 | AMBERIEU | 5.329333,45.9765
01185004 | HAUTEVILLE | 5.598167,45.979667
Je part d'une coordonnée GPS de type $gps_plant = "43.558379,4.068991";
Avec un explode on parviens à séparer latitude et longitude pour chacun et la fonction suivante permet de calculer la distance entre deux point GPS :
function distance($lat1, $lon1, $lat2, $lon2, $alt1, $alt2)
{
//rayon de la terre
$r = 6366;
$lat1 = deg2rad($lat1);
$lat2 = deg2rad($lat2);
$lon1 = deg2rad($lon1);
$lon2 = deg2rad($lon2);
//recuperation altitude en km
$alt1 = $alt1/1000;
$alt2 = $alt2/1000;
//calcul précis
$dp= 2 * asin(sqrt(pow (sin(($lat1-$lat2)/2) , 2) + cos($lat1)*cos($lat2)* pow( sin(($lon1-$lon2)/2) , 2)));
//sortie en km
$d = $dp * $r;
//Pythagore a dit que :
$h = round(sqrt(pow($d,2)+pow($alt2-$alt1,2)),4);
return $h;
}
Est il possible de calculer à la volée (en mémoire tampon donc) la distance entre $gps_plant et l'intégralité de la liste MySQL et en resortir les 3 lignes les moins distantes?C'est à dire une probable mise en mémoire des 1000 distances calculées avant extraction des plus petites, car me concernant, je ne sais pas trop comment m'y prendre sans lourdeurs de type création d'une table SQL à chaque fois avec des centaines de lignes en description | distance + select en order by.
Merci!