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

Publié par foufou0406 dans CMS

merci !!!

Publié par mido dans java

si je veut extraire les liens a partir de google searche c'est a dire utiliser la raquette suivante "http://www.google.tn/search?q=" avec java bien sur ..merci d'avance :)

Publié par brayan dans logiciel

je vous retour modem ip pour configury net firwell

Publié par Connan dans php5

j'utilise mysql phpmyadmin et j'ai cree une table IP mais j'ai mis varchart(15) mais quese qui faut que je fasse pour stocker l'ip des joueurs qui s'inscrivent

Publié par ammar dans CMS

merci pour ce code , mais ce que je veux savoir c\'est es-ce que possible de récupérer la totalité de code source html de la page original.<br>merci...