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

Publié par brayan dans logiciel

je vous retour modem ip pour configury net firwell

Publié par Axel dans java

L'astuce de la conversion en gris se situe dans imagedst.
Le BufferedImage imagesrc contient l'image en couleur, imagedst est une image cree en nuance de gris. Lorsque l'on copie l'image colorisee...

Publié par nicolasterraes dans tuto

bonjour,
je ne comprends pas cette tape:

Les liens vers les feuilles de style et les fichier js sont declares dans les pages HTML. Modifiez les balises meta ainsi:
Feuille de style:
d...

Publié par Loualfcha dans CMS

Je n'arrive pas &Atilde;&nbsp; installer le logiciel<br>Message d'erreur: DeleteFile a &Atilde;&copy;chou&Atilde;&copy;; code 5<br>Acc&Atilde;&um...

Publié par ING_BIO dans CMS

tres bonnes aide merci