Il est possible d'obtenir une localisation plus précise grâce à Google Maps.
Bien sûr, ce n'est pas précis à 100 % mais c'est toujours mieux que le nom d'une ville.
Pour commencer, l'URL magique :
http://maps.google.com/maps/geo?output=csv&q=latitude,
longitude
Par exemple, rendez-vous ici :
http://maps.google.com/maps/geo?output=csv&q=48.8566667,
2.3509871
Que voit-on ?
Citation : Google Map200,8,"1-5 Place de l'Hôtel de Ville, 75004 Paris, France"
200 veut dire que tout va bien, 8 c'est la précision, et, voilà enfin ce qui nous intéresse... l'adresse !
Voici donc le script pour récupérer l'adresse :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 | <?php
include("geoipcity.inc");
include("geoipregionvars.php");
$gi = geoip_open(realpath("GeoLiteCity.dat"),GEOIP_STANDARD);
$record = geoip_record_by_addr($gi,$_SERVER['REMOTE_ADDR']);
$la = $record->latitude;
$lo = $record->longitude;
$url = "http://maps.google.com/maps/geo?output=csv&q=".$la.",".$lo;
if($csv = file_get_contents($url))
{
if(substr($csv,0,3)!=200)
{
die("Erreur");
}
else
{
$adresse = substr($csv, 7, -1);
echo $adresse;
}
}
else
{
echo "Erreur";
}
geoip_close($gi);
?>
|
C'est très simple, on récupère la latitude et longitude comme on a vu précédemment, puis on récupère les infos via l'url magique, et on supprime l'inutile en tronquant la chaîne avec la fonction
substr.
Et nous avons donc affiché, par exemple :
1-5 Place de l'Hôtel de Ville, 75004 Paris, France.
Obtenir des informations plus poussées
Il existe un moyen d'obtenir encore plus d'informations. Hélas, cela ne fonctionne que sur une version de php ultérieure à 5.2.0 à cause de la fonction
json_decode qui n'existe que depuis cette version. Si vous avez une version antérieure à cette dernière, vous devriez trouver des bibliothèques qui permettent de simuler cette fonction.
Ce coup-ci, nous allons utiliser l'url suivante :
http://maps.google.com/maps/geo?output=json&q=latitude,
longitude
Si vous avez testé cette url (en lui fournissant une latitude et longitude), vous avez dû voir plein d'informations sous une structure particulière (c'est du JSON pour ceux que ça intéresse). Seul problème, php ne connait pas cette structure qui devrait vous faire penser aux
tableaux php.
D’ailleurs, nous allons justement transformer ce code JSON en tableau php, et si vous avez suivi le cours, vous avez dû deviner comment nous allons faire.
Comment ? Eh bien avec la fameuse fonction
json_decode !
Nous allons d'ailleurs afficher ce tableau afin que vous voyez quelles informations vous sont accessibles (si vous connaissez le JSON, faites attention, le code fourni par google est très mal indenté et vous risquez de vous tromper en récupérant les valeurs).
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | <?php
include("geoipcity.inc");
include("geoipregionvars.php");
$gi = geoip_open(realpath("GeoLiteCity.dat"),GEOIP_STANDARD);
$record = geoip_record_by_addr($gi,$_SERVER['REMOTE_ADDR']);
$la = $record->latitude;
$lo = $record->longitude;
$url = "http://maps.google.com/maps/geo?output=json&q=".$la.",".$lo;
if($json = file_get_contents($url))
{
$informations = json_decode($json, true);
if($informations['Status']['code']!=200)
{
die("Erreur");
}
else
{
print_r($informations);
}
}
else
{
echo "Erreur";
}
geoip_close($gi);
?>
|
Rendez-vous sur la page et regardez le panel d'informations auquel vous avez accès ! Et bonne nouvelle, elles sont sous la forme d'un simple tableau php. Ainsi, si vous souhaitez récupérer le code postal il faut faire comme cela :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | <?php
include("geoipcity.inc");
include("geoipregionvars.php");
$gi = geoip_open(realpath("GeoLiteCity.dat"),GEOIP_STANDARD);
$record = geoip_record_by_addr($gi,$_SERVER['REMOTE_ADDR']);
$la = $record->latitude;
$lo = $record->longitude;
$url = "http://maps.google.com/maps/geo?output=json&q=".$la.",".$lo;
if($json = file_get_contents($url))
{
$informations = json_decode($json, true);
if($informations['Status']['code']!=200)
{
die("Erreur");
}
else
{
echo $informations["Placemark"][0]["AddressDetails"]["Country"]["AdministrativeArea"]["SubAdministrativeArea"]["Locality"]["PostalCode"]["PostalCodeNumber"];
}
}
else
{
echo "Erreur";
}
geoip_close($gi);
?>
|
Pourquoi utiliser $info["Placemark"][0] et pas $info["Placemark"][1] par exemple ?
Très bonne question ! Vous avez du remarquer que vous receviez plusieurs informations de géolocalisation. Eh bien c'est pour la simple et bonne raison que google détecte plusieurs lieux disponibles en fonction des coordonnées que vous lui avez passées. On prend tout simplement la première localisation car c'est la plus précise ;-)