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

Publié par jadu dans tuto

Et comment met-on en route Xinha lorsque l'extension a été chargée dans Firefox ?????

je n'ai rien trouvé !!!

Publié par Amal dans tuto

pour moi j'ai créé une liste déroulante en liaisant avec la base de donnée déja existant mais la valeur sélectionné ne peut pas etre afficher jamais et...

Publié par bob le poisson dans java

Bonjour, votre script est tres bien mais attention l'utilisation du mot cle static sur la methode scale(BufferedImage bImage, double factor) est inutile et empeche de liberer la ressource.

Publié par fobec dans CMS

faire le menage !!!!

Publié par Kader dans java

Tres interessant. Merci Bien! Est ce possible de mettre la couleur sur toute la ligne au lieu de la cellule?