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 4469 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par mohammed dans java

Bonjour ,Merci pour ce travail ,juste j'ai une question pour ce qui concerne les textes avec les caracteres speciaux comment faire??

Publié par Coll dans java

Excuse moi, mais pourrais tu expliquer un peu plus precisement ce que tu fais lorsque tu convertis en gris je comprends l'idee mais pas ce que chaque action fait precisement et le cacth a la fin. Parc...

Publié par IB dans tuto

Merci ca marche bien.

Publié par aalex57 dans tuto

Bonsoir,

Merci pour l'astuce, cependant votre fichier php ne fonctionne pas chez moi.
Il m'indique une erreur à la ligne 16 :/

Publié par ZINEDDINE dans CMS

SaLUT Monsieur
tu peux avec ce deux mot pass ouvrir tous les tables paradox
1-jIGGAe
2-cupcdvum
respecter le majjuscul
bonne chance .