Utiliser api google maps pour la correction d'adresse

Soyez le premier à donner votre avis sur cette source.

Vue 13 509 fois - Téléchargée 670 fois

Description

Utilise l'API Google Maps pour vérifier des adresses.
Utilise 3 classes :
La classe Google, la classe résultat qui étends d'une classe résultats utilisé avec d'autre geocoder.

Source / Exemple :


<?php
class GoogleGeocoder{
	
	private $key = "[votre clé]";
	private $url = "http://maps.google.com/maps/geo?output=xml";
	
	public $resultat;
	public $result_query = array(
		200=>"SUCCESS",
		400=>"BAD_REQUEST",
		500=>"SERVER_ERROR",
		601=>"MISSING_QUERY",
		601=>"MISSING_ADDRESS",
		602=>"UNKNOWN_ADDRESS",
		603=>"UNAVAILABLE_ADDRESS",
		604=>"UNKNOWN_DIRECTIONS",
		610=>"BAD_KEY",
		620=>"TOO_MANY_QUERIES"
	);
	public $accuracy_query = array(
		0=>"ACCURACY_UNKNOWN",
		1=>"ACCURACY_COUNTRY",
		2=>"ACCURACY_REGION",
		3=>"ACCURACY_SUBREGION",
		4=>"ACCURACY_TOWN",
		5=>"ACCURACY_POSTCODE",
		6=>"ACCURACY_STREET",
		7=>"ACCURACY_INTERSECTION",
		8=>"ACCURACY_ADDRESS"
	);
	
	/**

  • Recherche l'adresse passée en paramètre
  • @param string $query
  • /
function query($query){ try{ // Recherche des BP $query = str_replace(" ","+",trim($query)); $buffer = file_get_contents($this->url."&key=".$this->key."&q=$query"); $xml = new SimpleXMLElement(utf8_encode($buffer)); return $xml; //$this->resultat = new GoogleResult($xml); }catch(Exception $e){ echo $buffer; } } /**
  • Affiche le résultat de la recherche dans un tableau
*
  • /
function readableStatus($id){ return $this->result_query[$id]; } function readableAccuracy($id){ return $this->accuracy_query[$id]." ($id/8)"; } function toString(){ try{ echo "<h3> Nombre de résultats : ".$this->result->nbResults." (max 10)<br> Status de la requête : ".$this->readableStatus($this->result->status)."</h3>"; foreach($this->resultat->responses as $result){ echo "<table style=\"border:1px solid gray;float:left; margin:5px;\">"; foreach($result as $var=>$val){ if($var==status)$val = $this->readableStatus($val); if($var==accuracy)$val = $this->readableAccuracy($val); echo "<tr><th>$var</th><td>$val</td></tr>"; } echo "</table>"; } }catch(Exception $e){ echo "Erreur"; } } function getAccuracy(){ return $this->result->accuracy; } } class Google_result extends GeoCodedAddresses { function __construct($res){ $xml = $res->asXML(); preg_match_all("/<Placemark.*?>(.*?)<\/Placemark>/msi",$xml,$preg_response); $preg_response = $preg_response[1]; $i=0; $nb = count($preg_response); foreach($preg_response as $asxml){ preg_match("/Accuracy=\"([0-9]?)\"/msi",$asxml,$preg_accuracy); preg_match("/<CountryNameCode>(.*?)<\/CountryNameCode>/msi",$asxml,$preg_country); preg_match("/<AdministrativeAreaName>(.*?)<\/AdministrativeAreaName>/msi",$asxml,$preg_administrative_area); preg_match("/<SubAdministrativeAreaName>(.*?)<\/SubAdministrativeAreaName>/msi",$asxml,$preg_departement); preg_match("/<LocalityName>(.*?)<\/LocalityName>/msi",$asxml,$preg_locality); preg_match("/<DependentLocalityName>(.*?)<\/DependentLocalityName>/msi",$asxml,$preg_dependant_locality); preg_match("/<ThoroughfareName>(.*?)<\/ThoroughfareName>/msi",$asxml,$preg_dependant_rue); preg_match("/<PostalCodeNumber>(.*?)<\/PostalCodeNumber>/msi",$asxml,$preg_cp); $accuracy = $preg_accuracy[1]; $Country = $preg_country[1]; $region = $preg_administrative_area[1]; $departement = $preg_departement[1]; $City = $preg_locality[1]; $Street = $preg_dependant_rue[1]; $Zip = $preg_cp[1]; if($accuracy == 8 && $Country == "FR"){ $expl_adresse = explode(",",$Street); $HouseNo = $expl_adresse[0]; $Street = $expl_adresse[1]; }elseif($accuracy == 8 && $Country == "BE"){ preg_match("/([0-9]+$)/msi",$Street,$preg_adresse); $HouseNo = $preg_adresse[1]; $Street = preg_replace("/([0-9]+$)/msi","",$adresse); } $this->addResult($HouseNo,$Street,$City,$Zip,$Country); } } } ?> <?php /**
  • Mise en forme des résultats
*
  • /
class GeoCodedAddresses { public $arrayOfAddress; // Array of Address_result public $no_results; /**
  • Constructeur
  • Met le compteur à zéro
*
  • /
function __construct(){ $this->no_results = 0; } /**
  • Ajoute un adresse dans les résultats
*
  • @param String $house numéro de la maison
  • @param String $street nom de la rue
  • @param String $city no de la ville
  • @param String $zipcode code postal
  • @param String $country Pays
  • /
function addResult($house,$street,$city,$zipcode,$country){ $adresse = new Address_result($house,$street,$city,$zipcode,$country); $this->arrayOfAddress[] = $adresse; $this->no_results++; } } /**
  • Classe Address_result
  • Représente l'adresse
*
  • /
class Address_result { public $HouseNo; public $Street; public $City; public $ZipCode; public $Country; public $Quality; /**
  • Création d'une nouvelle adresse
*
  • @param String $house numéro de la maison
  • @param String $street nom de la rue
  • @param String $city no de la ville
  • @param String $zipcode code postal
  • @param String $country Pays
  • /
function __construct($house,$street,$city,$zipcode,$country,$quality=""){ $this->HouseNo = $house; $this->Street = $street; $this->City = $city; $this->ZipCode = $zipcode; $this->Country = $country; $this->Quality = $quality; } } ?> include "Google.class.php"; include "Resultat.class.php"; $query = "$street $house $zip $city"; $req = new GoogleGeocoder(); $google_result = new Google_result($req->query($query));

Conclusion :


Une alternative a une autre source que j'ai posté (Map24), la pas besoin de télécharger d'autres classes.
Nécessite juste une clé développeur pour l'API Google

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Palleas_44
Messages postés
131
Date d'inscription
lundi 12 décembre 2005
Statut
Membre
Dernière intervention
19 avril 2009
-
Bon perso j'ai pas eu trop le temps de tester mais ya des choses que je ne comprends pas :

- un coup des var PHP4, un coup des (plus joli :p) __construct
- des preg_match pour parser du XML ? oO
- des echos et die() dans un bloc Catch ?

=)
webdeb
Messages postés
509
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
2 -
+1 avec Palleas
RyoSensei
Messages postés
8
Date d'inscription
lundi 3 décembre 2007
Statut
Membre
Dernière intervention
29 décembre 2008
-
Oui c'est vrai pour les variables, j'avais pas fait gaffe. Pour le try catch, c'était juste pour le debuggage, j'avais pas revérifié.
Par contre pour le preg_match du xml, je me suis moi même demandé pourquoi j'avais fait ça?
Mais en fait, c'est pour retrouver les infos qui ne sont pas toujours la
Explication :
Les informations ne se trouvent pas au même niveau. On a du plus précis (numéro de maison) au plus général (pays). Mais on a pas toujours ces infos. Il se peux qu'on passe du zip au pays, alors que pour certains on va passer du zip au département, puis à lé région puis au pays.
Pour éviter de tester a chaque fois les infos qu'on à au niveau inferieur, je fait un preg_match pour voir si j'ai l'info, j'ai trouvé ça plus rapide.
Si vous avez une autre solution, proposez moi par mail, ça m'interesse!

Excusez moi pour le php5, je ne fait pas toujours attention...
lTommyl
Messages postés
28
Date d'inscription
jeudi 15 septembre 2005
Statut
Membre
Dernière intervention
26 novembre 2008
-
on l'utilise comment au juste ?!?
cs_chris734
Messages postés
1
Date d'inscription
jeudi 20 avril 2006
Statut
Membre
Dernière intervention
18 décembre 2008
-
trop peux d'explication, je ne suis aps arrivé a le faire marcher en 10 minutes, dommage alors qu'a la base rien de complexe NORMALEMENT...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.