Calculer la distance entre 2 points GPS
A partir d'un endroit dans le monde, la class GPSDistance calcule la distance en km entre ces 2 points. Les mesures sont effectuées à vol d'oiseau, c'est à dire en traçant une ligne directe. Cette méthode utilise le langage PHP pour faire les calculs trigonométrique.<?php
/**
* Calcluler la distance entre 2 points GPS
* fobec 2010 http://www.fobec.com/php5/1026/calculer-distance-entre-villes.html
*/
class GPSDistance {
public static function calc($lat_a, $lon_a, $lat_b, $lon_b) {
$a = pi() / 180;
$lat1 = $lat_a * $a;
$lat2 = $lat_b * $a;
$lon1 = $lon_a * $a;
$lon2 = $lon_b * $a;
$t1 = sin($lat1) * sin($lat2);
$t2 = cos($lat1) * cos($lat2);
$t3 = cos($lon1 - $lon2);
$t4 = $t2 * $t3;
$t5 = $t1 + $t4;
$rad_dist = atan(-$t5/sqrt(-$t5 * $t5 +1)) + 2 * atan(1);
$dist=($rad_dist * 3437.74677 * 1.1508) * 1.6093470878864446;
return $dist;
}
}
/**
* Exemple
*/
/* coord. GPS de Paris */
$latitude1 = 48.8667;
$longitude1 = 2.3333;
/* coord. GPS de Nice */
$latitude2 = 43.7;
$longitude2 = 7.25;
$dist=GPSDistance::calc($latitude1, $longitude1, $latitude2, $longitude2);
echo 'La distance a vol d'oiseau entre Paris et Nice est de :'
.number_format($dist,0).' kms';
?>
Résultat: la distance à vol d'oiseau entre Paris et Nice est de 687 kms
Requete MySQL avec des points GPS
Il existe plusieurs implémentations possibles en fonction de l’algorithme choisi. Sur notre serveur Mysql, nous avons implémenté la requete suivante:<?php
//Requete SQL
$SQL = "SELECT (((acos(sin((:FROM_LAT*pi()/180)) * sin((DB_LATITUDE*pi()/180))+cos((:FROM_LAT*pi()/180))
* cos((DB_LATITUDE*pi()/180)) * cos(((:FROM_LONG- DB_LONGITUDE)*pi()/180))))*180/pi())*60*1.1515*1.609344) as DISTANCE,
myDBTable.* FROM myDBTable";
//Paramètre
$P = array('FROM_LAT' => $lat,
'FROM_LONG' => $long);
//Lancer la requete avec PDO
$pdo = new PDO('mysql:host=' . $server . ';dbname=' . $dbname, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare($SQL);
$stmt->execute($P);
$rs = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt->closeCursor();
?>
- $lat: lattitude au format numérique,
- $long: longitude au format numérique,
- DB_LATITUDE: champs float de la DB contenant la latitude,
- DB_LONGITUDE: champs float de la DB contenant la longitude,
L'avantage de calculer une distance directement dans la requête MySQL est de pourvoir filtrer les résultats. Par exemple, en ajouter une condition WHERE à la requete, seules les coordonnées de la base de données proches sont sélectionnées.