La semaine dernière nous avons vu une fonction permettant de calculer la distance entre deux coordonnées GPS, mais comment récupérer ces coordonnées (et d’autres informations) à partir d’une adresse ? Nous allons voir comment faire avec l’API google Map, il vous faudra tout d’abord récupérer une clé pour les appel à l’API (par ici).
Ensuite vous pouvez utiliser la classe et la fonction ci-dessous afin de récupérer les informations (adresse complète, latitude, longitude, vile, code postal, département, région, pays) correspondant à l’adresse passé au format texte.
private static $apikey = 'VOTRE_API_KEY';
public static function geocodeAddress($address) {
//valeurs vide par défaut
$data = array('address' => '', 'lat' => '', 'lng' => '', 'city' => '', 'department' => '', 'region' => '', 'country' => '', 'postal_code' => '');
//on formate l'adresse
$address = str_replace(" ", "+", $address);
//on fait l'appel à l'API google map pour géocoder cette adresse
$json = file_get_contents("https://maps.google.com/maps/api/geocode/json?key=" . self::$apikey . "&address=$address&sensor=false®ion=fr");
$json = json_decode($json);
//on enregistre les résultats recherchés
if ($json->status == 'OK' && count($json->results) > 0) {
$res = $json->results[0];
//adresse complète et latitude/longitude
$data['address'] = $res->formatted_address;
$data['lat'] = $res->geometry->location->lat;
$data['lng'] = $res->geometry->location->lng;
foreach ($res->address_components as $component) {
//ville
if ($component->types[0] == 'locality') {
$data['city'] = $component->long_name;
}
//départment
if ($component->types[0] == 'administrative_area_level_2') {
$data['department'] = $component->long_name;
}
//région
if ($component->types[0] == 'administrative_area_level_1') {
$data['region'] = $component->long_name;
}
//pays
if ($component->types[0] == 'country') {
$data['country'] = $component->long_name;
}
//code postal
if ($component->types[0] == 'postal_code') {
$data['postal_code'] = $component->long_name;
}
}
}
return $data;
}
}
Par exemple en appelant la fonction de cette manière :
//on affiche les différente infos
echo '<ul>';
foreach ($data as $key=>$value){
echo '<li>'.$key.' : '.$value.'</li>';
}
echo '</ul>';
/* va afficher
address : 151 Avenue du Pont-Trinquat, 34000 Montpellier, France
lat : 43.6008177
lng : 3.8873392
city : Montpellier
department : Hérault
region : Occitanie
country : France
postal_code : 34000
*/
On peux maintenant utiliser cette fonction pour trouver la distance entre 2 adresses, grâce à notre fonction de l’article précédent. Par exemple :
$data2 = GmapApi::geocodeAddress('Avenue des cévennes 30360 vézénobre');
echo round(Misc::distance($data1['lat'], $data1['lng'], $data2['lat'], $data2['lng'])).' Km';
//Affiche : 54 Km
Ping : PHP : Calcul de la distance entre 2 coordonnées GPS (latitude, longitude) - Pense bête d'un développeur web
Ping : Symfony : Automatiser des actions avec les "Event listeners" de doctrine - Pense bête d'un développeur web
Super, ça marche très bien et ça m’a été très utile. merci !
Bonjour, ca fonctionne bien avec une adresse mais comment récupérer la position GPS de mon mobile ?
Je souhaite calculer la distance entre la position de mon mobile et une adresse.
Qui a une solution
Merci
Bonjour,
Comment récupérer la ville à partir de la latitude et la longitude.
Merci.
Il n’y aurait pas un prob avec le field address? Ne devrait il pas etre concaténé avec l’URL au lieu d’etre dans la valeur string??
C’est le cas.
Bonjour,
Je cherche un script pour déduire l’adresse postale d’un lieu d’après ses coordonnées GPS.
Je n’ai pas vu d’API Google pour cela, quelqu’un connait-il ?
Cordialement.
Eric
J’ai trouvé dans les doc Google developers
https://developers.google.com/maps/documentation/javascript/geocoding#ReverseGeocoding
Cordialement.
Muriel