Publié le 21/10/2010
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Calculer la distance entre 2 villes

Une coordonnée GPS est une position quelque part sur le globe terrestre représentée par une latitude et une longitude. La distance entre 2 points est calculée par trigonométrie. Vous trouverez ci-dessous deux algorithmes utilisés dans une class PHP et dans une requete MySQL.

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(); 
?>
Note:
- $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.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
php5 - script
Mise a jour
21/10/2010
Visualisation
vu 6225 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 265 articles
|BIO_PSEUDO|
Commentaires récents

Publié par jmc dans CMS

Lien sur mon site, rubriques Téléchargez http://users.skynet.be/jean-marie.capellen/

Publié par titi dans tuto

test de ce truc! eh ben exigeant en plus

Publié par ghanmitaher dans php5

Bravo! Vous avez deploye des efforts formidables.

Publié par Fobec dans php5

Le code PHP sur les boucles a ete corrige dans l'article.
Merci Etiazam !

Publié par hilflo dans tuto

Tres bon article qui montre bien les subtilites des mutualises de 1and1.
Je l'ai utilise pour un de mes sites en y ajoutant de l'url rewriting pour eviter d'avoir des parametres dans l'url avec cet...