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.
class GmapApi
{
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 :
$data = GmapApi::geocodeAddress('151 avenue du pont trinquat 34070 Montpellier');
//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 :
$data1 = GmapApi
::geocodeAddress('151 avenue du pont trinquat 34000 montpellier');
$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