Google Maps API v3
Voici une classe PHP assez complète qui vous permet de manipuler facilement des Google Maps. Cette classe gère pas mal de choses au niveau du javascript d’une gmap comme la gestion de catégories de marqueurs, les itinéraires, l’insertion de flux XML, la clusterisation (regroupement de marqueurs), l’affichage d’infobulles, la geolocalisation d’une adresse etc…On utilise donc cette classe pour générer le javascript dont on pourra se servir dans notre code HTML.
On peut facilement obtenir des rendus de ce style :

La classe est plutôt bien commentée (en anglais) mais voici 2 exemples d’utilisations de la classe qui montrent différentes possibilités. Cela permet également de se faire une idée sur le code source généré.
Attention : les requêtes de geocoding sont limitées à 15000/24h/IP, il se peut donc que les démos ne fonctionnent pas en fin de journée.
Google Maps simple avec marqueurs et itinéraires
...
require('GoogleMapAPIv3.class.php');
$gmap = new GoogleMapAPI();
$gmap->setDivId('test1');
$gmap->setDirectionDivId('route');
$gmap->setCenter('Nantes France');
$gmap->setEnableWindowZoom(true);
$gmap->setEnableAutomaticCenterZoom(true);
$gmap->setDisplayDirectionFields(true);
// $gmap->setClusterer(true);
$gmap->setSize('600px','600px');
$gmap->setZoom(11);
$gmap->setLang('fr');
$gmap->setDefaultHideMarker(false);
// $gmap->addDirection('nantes','paris');
// cat1
$coordtab = array();
$coordtab []= array('nantes france','Nantes','<strong>html content</strong>');
$coordtab []= array('carquefou france','Carquefou','<strong>html content</strong>');
$coordtab []= array('vertou france','Vertou','<strong>html content</strong>');
$coordtab []= array('rezé france','Rezé','<strong>html content</strong>');
// $gmap->setIconSize(20,34);
$gmap->addArrayMarkerByAddress($coordtab,'cat1','http://maps.gstatic.com/intl/fr_fr/mapfiles/ms/micons/red-pushpin.png');
// cat2
$coordtab = array();
$coordtab []= array('saint-herblain france','Saint-herblain','<strong>html content</strong>');
$coordtab []= array('bouguenais france','Bouguenais','<strong>html content</strong>');
$coordtab []= array('orvault france','Orvault','<strong>html content</strong>');
$gmap->addArrayMarkerByAddress($coordtab,'cat2');
// cat3
$coordtab = array();
$coordtab []= array('48.8792','2.34778','test','<strong>test paris</strong>');
$gmap->addArrayMarkerByCoords($coordtab,'cat3');
$gmap->generate();
echo $gmap->getGoogleMap();
...
Démonstration
Démonstration en full screen
Code source de l’exemple :
simple.php (5,6 KiB, 1 326 hits)
Google Maps avancée avec clusterisation (1600 marqueurs) issus d’un fichier KML
...
require('GoogleMapAPIv3.class.php');
$gmap = new GoogleMapAPI();
$gmap->setDivId('test1');
$gmap->setCenter('paris France');
$gmap->setDisplayDirectionFields(true);
$gmap->setClusterer(true);
$gmap->setSize('100%','100%');
$gmap->setZoom(5);
$gmap->addKML('../googlemap/kml/Locator3RF.kml','radars_fixes','../googlemap/Locator3RF.png');
$gmap->generate();
echo $gmap->getGoogleMap();
...
Démonstration (zoomer/dezoomer pour voir la clusterisation)
Code source de l’exemple :
advanced.php (1,0 KiB, 906 hits)
Pour utiliser la clusterisation vous devez avoir les fichiers suivants :
Image du cluster
Fichier KML
Télécharger la GoogleMapAPIv3.class.php
GoogleMapAPIv3.class.php (25,1 KiB, 1 820 hits)
Changelog
[11/02/2011]
- Ajout de la méthode setMapType()
- Correction d’un bug dans la méthode generate()
- Ajout de debug dans les commentaires au cas où le geocoding ne se fait pas
- Merci beaucoup à Herve Thouzard pour ces optimisations
[11/08/2010]
- Release initiale de la v3



12 février 2011 - 19 h 15 min
Bonjour,
Je n’ai pratiquement plus de limitation du nombre de point à afficher.
Il semble que google ait revu son code pour notre plus grand plaisir. D’ailleurs vous aurez remarqué des petite modification vos cartes au niveau de la sélection satellite ou plan.
Merci encore à Yohann sans qui je n’aurai rien pu faire.
iDavid
12 février 2011 - 19 h 40 min
Regarde les commentaires précédents tu dois etre en php4.
15 février 2011 - 22 h 04 min
Merci bien pour cette classe, je peux facilement placer des marqueurs pour avoir une vision globale de mes visiteurs.
Juste un petit problème : je ne sais pas comment obtenir la latitude et la longitude d’un visiteur pour ensuite pouvoir l’entrer dans ma base de données et la garder en mémoire :/
Comment devrais-je donc faire pour récupérer ces informations dans une variable php ?
Merci d’avance
7804j
17 février 2011 - 12 h 15 min
Serait-il possible d’ajouter une fonction qui masque le fichier kml de la même façon que l’on affiche/masque les catégories?
17 février 2011 - 13 h 36 min
Aussi, a-t-on la possibilité de placer un lien google maps affichant une serie de marqueurs plutôt que d’entrer toute une categorie à la main?
22 février 2011 - 12 h 41 min
@7804j
Voilà ce que j’avais marqué dans un commentaire que tu pourras retrouver en page 3 de cet article
$geocod=$gmap->geocoding($adresse);
$statut=$geocod[0];
$lat=$geocod[2];
$long=$geocod[3];
7 mars 2011 - 17 h 35 min
Y aurait-il un gros bug actuellement avec google map ?
Tout à coup, mon code ne fonctionne plus, depuis hier, et même en prenant l’exemple, ça m’affiche des fois un marqueur, des fois deux, voir trois…
13 avril 2011 - 19 h 13 min
Bonjour, un grand merci a Yohann pour cette contribution, du magnifique boulot… !
J’ai utilisé ca class pour me developper un mod phpbb3 dans mes forums, une class php etant plus facilement gerable que du java.
Ca marche a merveille, sauf un point lorsque je lance du geocoding j’ai environ qu’une dizaine de retour positif, le reste etant null.
j’attends 2 min je relance une requete sur celle qui n’ont pas été faite et ca remarche pour une dizaine.. et ainsi de suite.
J’ai regardé chez google. pas de limite de ce genre pourtant… Qui a rencontré ce probleme ?
En tous cas grand bravo pour cette participation.
Stephane
15 avril 2011 - 14 h 22 min
Pour les problèmes d’affichages de marqueurs par 10 ou moins en utilisant le geocodage, je vous conseille d’enregistrer les coordonnées Lat/Long et de les enregistrer dans votre base de données. Une fois fait vous n’aurez plus qu’a afficher les marqueurs en utilisant la fonction AddMarkerByCoord
A+
15 avril 2011 - 14 h 42 min
J’utilise des bases de données, mais lors d’une install sur un forum deja existant j’ai créé une fonction de calcul des coordonnées pour les membres deja existant, et cette fonction qui n’arrive pas a faire un traitement en lot.
Pour contourner le probleme, je positionne une valeur error a la place des coordonnées et lorsque le membre ce connecte si la valeur est error je recalcule son geoding pour mettre la base a jour. Au fur et a mesure elle va se mettre a jour.
Google ne parle pas de limite d’execution entre deux requetes, c’est ca qui est bizarre alors que bizarrement elle existe, si je mets une pause dans ma boucle ca passe mieux, mais mon php fini par planté car trop long ! J’ai un forum avec 900 membres, avec une demi secondes entre chaque calculé….
En tous cas, ca remet pas en question la qualitée du travail fait dans cet API, et je ne regrette pas d’etre tombé dessus, merci encore…. Maintenant ma solution de contournement est tres bien.
Stephane
5 mai 2011 - 11 h 11 min
Salut,
Toujours en cours de developpement de mon module phpbb3, je viens de decouvrir un petit bug. Que ce soit mon dev ou l’exemple simple, aucun des deux fonctionnes.
Au niveau de la direction dans les bulles des marqueurs, ca ne fonctionne pas.
Voici la correction au niveau des lignes 582 et 583 :
$this->content .= « \t\t » . ‘content += \’\';’ . « \n »;
$this->content .= « \t\t » . ‘content += \’\';’ . « \n »;
une si petite contribution face au boulot realisé
merci encore Yohann pour ce boulot de fou !
Stephane
5 mai 2011 - 11 h 13 min
oups copier coller trop rapide :
Donc voici les bonnes corrections a apporter ligne 582 et 583 :
$this->content .= « \t\t » . ‘content += \’\';’ . « \n »;
$this->content .= « \t\t » . ‘content += \’\';’ . « \n »;
5 mai 2011 - 11 h 13 min
ah ben non c’est tronqué …. dommage !
22 mai 2011 - 10 h 39 min
La classe PHP à l’air de présenter un bug que je n’arrive pas à corriger …
Voici l’erreur : » Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in /homepages/37/d338705114/htdocs/Mouvaux/Projet/c_gmap.php on line 20 «
22 mai 2011 - 12 h 19 min
As-tu PHP5 (le message semble explicite)? Regarde les autres commentaires je pense que cela pourra surement t’aider.
23 mai 2011 - 7 h 39 min
Bonjour Yohann et merci de ta réponse rapide !
En effet, je n’avais pas vu les précédents commentaires
… . J’ai donc modifié le code comme dis dans les comm’ et plus d’erreur ! plus qu’a savoir utiliser le code
Et félicitation pour ton travail !
23 mai 2011 - 9 h 59 min
Voila plusieurs heures … que je me prend la tête avec ce bout de code ! celui-ci m’a l’air correcte mais impossible de le faire fonctionner !
$sql = mysql_query(« SELECT m.num_rue, m.rue, m.cp, m.ville,a.categorie,m.pseudo, a.type, a.id_annonce FROM annonce a INNER JOIN membres m ON a.id_membre = m.id_membre »);
$coordtab = array();
while ($req = mysql_fetch_array($sql))
{
$coordtab []= array(« $req[0] $req[1] $req[2] $req[3]« , »test », »test« );
$gmap->addArrayMarkerByAddress($coordtab, »cat2″);
}
23 juin 2011 - 21 h 16 min
Bonjour, comment faire avec cette classe pour afficher un layer kml ?
Merci pour vos réponses !
5 juillet 2011 - 17 h 49 min
Bonjour,
J’ai créé un formulaire pour ajouter un lieu dans ma BDD. Cependant lors de l’utilisation de la fonction Geocoding (comme indiquer en page 3 et 5), le tableau contient : 620,0,0,0
En revanche, quand je mets l’url générée par la fonction dans mon navigateur, j’obtiens bien les coordonnées correspondantes. Il y a-t-il une autre solution?
19 septembre 2011 - 6 h 22 min
Bonjour,
@Julien : En effet, ceci peut être dû à deux choses :
1- j’ai remarqué depuis quelques temps que Google n’aime pas que l’on fasse du « file_get_contents » sur ses pages. En même temps, si Google met en place des APIs, ce n’est pas pour rien… On remplacera donc la fonction geocoding dans la class par quelque chose du style (non testé, Php 5 only car simplexml…) :
public function geocoding($address)
{
$encodeAddress = urlencode($this->withoutSpecialChars($address));
$data = simplexml_load_file(« http://maps.googleapis.com/maps/api/geocode/xml?address= ».$encodeAddress. »,+CA&sensor=false »);
$status = $data->status;
if ($status == « OK ») {
$precision = »;
$lat = strval($data->result->geometry->location->lat);
$lng = strval($data->result->geometry->location->lng);
$return = array($status, $precision, $lat, $lng);
} else {
echo « \n »;
$return = null; // failure to geocode
}
return $return;
}
2- si je n’ai pas pu tester la fonction ci-dessus, c’est parce que je suis hébergé sur un serveur mutualisé comme la plupart des gens, et que je me tape un méchant OVER_QUERY_LIMIT : l’adresse IP retenue par Google est celle du serveur, et je n’ose imaginer combien de sites sont hébergés sur le serveur et font en même temps du Geocoding…
Il faut donc se tourner vers une solution asynchrone (javascript) qui fera les requêtes à partir du poste client, et non plus à partir du serveur mutualisé. Si comme moi vous aimez JQuery, allez donc trouver votre bonheur ici : http://gmap3.net/.
++
19 septembre 2011 - 6 h 31 min
Du code a été tronqué ci-dessus à l’envoi :
- $precision doit être déclaré vide
- pour la fin du code, reprendre l’original
++
24 septembre 2011 - 23 h 59 min
Bonjour,
appareement le fichier de la class v3 GoogleMapAPIv3.class.php
ne doit plus être à jour car les marqueurs ne s’affichent plus ni les info bulles.
Sur mes sites mais également sur votre exemple en ligne….
2 octobre 2011 - 21 h 30 min
@aicko : voir mes 2 messages juste au-dessus.
14 octobre 2011 - 14 h 58 min
Bonjour.
en fonction de l’utilisation, les 15.000 requêtes/jour peuvent être atteintes sur des sites professionnels.
Savez-vous si google permet un débridage de cette limite, moyennant finance évidemment?
Y’a tjs la méthode de passer par différences IPs, mais franchement, si c’est pas hors de prix, pour des clients institutionnels qui ont besoin d’un plus grand nombre de requêtes, ce genre de service doit pouvoir être pris en charge…
Merci!
21 octobre 2011 - 9 h 48 min
Après le mieux, c’est de mettre en cache ton calcul de coordonnées ou carrément de stocker en base des coordonnées GPS et pas des adresses.
29 octobre 2011 - 7 h 40 min
Bonjour,
La map fonctionne très bien à une exception près, lorsque je met un marqueur sur paris par exemple puis que je dézoome beaucoup, le marqueur est décalé sur la gauche, il sort de la france, comment puis-je corriger ce problème?
Merci par avance.
19 novembre 2011 - 13 h 03 min
bonjour,
merci pour ce tutoriel.
de mon coté je cherche non pas a cacher les script sur mon site mais simplement faire en sorte que les coordonnees gps ne soit pas lisible dans le code source ou telechargeable en .js.
la raison est qu’il sagit d’une base de donnees gps qui est vendu via un telechargement. je souhaites utiliser markerclusterer .
quelqu’un aurait il une ‘idee’ ou une piste
merci