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 700 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, 1 134 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, 2 299 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 août 2010 - 17 h 45 min
J’ai trouvé cette classe hier !
Le principal fonctionne.
J’ai un soucis avec le centrage et le zoom auto, ais-je oublié quelque chose ?
$gmap = new GoogleMapAPI(SITE_GOOGLE_API);
$gmap->setDivId(‘ResultsMap’);
$gmap->setIconsPath(_MC_TEMPLATE_RELPATH.’/commons/images/markers’);
$gmap->setIconSize(32, 37);
$gmap->addArrayMarkerByCoords($markers, ‘pro’, ‘home.png’);
$gmap->setLang(‘fr’);
$gmap->setSize(0, 0);
$gmap->setEnableWindowZoom(true);
$gmap->setEnableAutomaticCenterZoom(true);
$gmap->setCenter(NULL);
$gmap->generate();
Le pavé directionnel ne s’affiche pas avec la dernière release que vous avez publié…
J’ai ajouté une méthode setIconsPath() pour définir l’url de base des icones, pour éviter de transmettre à chaque fois le lien complet. (dans mon cas, tous les pictos sont regroupés).
… Mais peut être laisser le choix.
Autre point, chez moi le conteneur de la carte est géré en CSS, je trouve contraignant de définir une taille précise. Ok, si taille pas définie, la carte s’affiche pas
12 août 2010 - 18 h 21 min
Je m’auto réponds.
Si la carte est trop petite, le pad de navigation n’est pas affiché.
http://code.google.com/intl/fr/apis/maps/documentation/javascript/controls.html#DefaultControls
Pour le centragea auto, ça a l’air bon.
Mon site à une config locale (setlocale(LC_ALL, ‘fr_FR.’._CMS_CHARSET);), du coup, lors des calculs, les coordonnées GPS deviennent des nombres à virgule…
Je dois donc leur appliquer la function number_format().
12 août 2010 - 19 h 13 min
J’ai d’ailleurs fait la modif pour le style
17 août 2010 - 16 h 01 min
Bonjour Yohan,
j’ai un petit souci de compréhension sur un test que je fais en local.
Je souhaiterais utiliser un ficher kml que j’ai obtenu sur http://www.gitesdegaule.fr (un fond blanc transparent avec une légère bordure noire qui permet de mettre une frontière virtuelle sur les limites de mon département …
J’ai testé le fichier KML qui fonctionne parfaitement sur votre page de démo …
j’ai une jolie carte google bien centrée (zoom correct) chez moi mais le fichier KML ne joue pas son rôle et je n’ai bien sur aucun message d’erreur
Sauriez vous m’aiguiller ?
Manu
18 août 2010 - 9 h 21 min
Bonjour,
Très très bien cette « petite » classe.
Juste un bug, pourquoi est-ce toujours le contenu du marqueur de Paris qui s’affiche (quelque soit le marqueur sur lequel on clique) ?
Hervé
18 août 2010 - 9 h 52 min
Ooops le petit bug d’initialisation
C’est corrigé.
22 août 2010 - 11 h 09 min
Merci !
25 août 2010 - 15 h 02 min
Salut
Un grand merci pour cette mise à jour…
Je n’arrive par contre pas à ajouter des marker par adresse?
tout le reste fonctionne mais pas la fonction addMarkerByAddress.
Pourrais tu m’éclairer sur ce point ?
25 août 2010 - 16 h 08 min
Je viens de faire un test à l’instant sur le fichier index.php présent en téléchargement et cela fonctionne. Essais de déterminer ce qui pourrait poser problème (erreur JS?).
26 août 2010 - 13 h 33 min
J’ai vérifié chez moi et ca marche, désolé mais j’avais testé au boulot et leur proxy à foutu un bordel monstre. Donc je te rassure tout fonctionne.
A+
27 août 2010 - 9 h 20 min
Toujours moi !!!
Je cherche à changer l’icone de clusterisation mais je ne trouve pas où il se trouve dans le code ? j’ai parcouru la classe, le JS et rien à faire il ne montre pas le bout de son nez. Si tes lumières pouvaient m’éclairer.
Merci
A+
27 août 2010 - 9 h 29 min
Je crois tout simplement que je n’ai pas ré-implémenté cette fonction. Cela va venir, je vais essayer d’optimiser tout cela
31 août 2010 - 21 h 43 min
Bonjour,
Merci pour cette classe de la v3, sympa le boulot
Par contre juste une petite chose, il traîne un notice en ligne 352 :
Undefined property: GoogleMapAPI::$googleMapKey
Je pense que cela doit être un reste d’une version pour la v2. Il suffit de modifier la dîte ligne en supprimant le paramètre de la clé et tout roule.
Pour l’instant je ne me sers que du geocode, mais je repasserai si je trouve d’autres points.
Au cas où, voici la nouvelle ligne modifiée :
$url = « http://maps.google.com/maps/geo?q= ».$encodeAddress. »&output=csv »;
Merci pour tout ce travail en tout cas
31 août 2010 - 21 h 44 min
31 août 2010 - 22 h 03 min
@Olivier merci beaucoup pour ton retour, je n’avais pas relevé le « notice ».
2 septembre 2010 - 18 h 43 min
Salut !! et bravo pour le boulot !
Dis moi comment tu fais ta clusterisation ?
C’est à dire à partir de quels moments décide tu de regrouper les icones ?
Merci par avance
3 septembre 2010 - 12 h 12 min
Salut Yohann,
Je voulais juste savoir si tu ré-implémenterai les fonctionnalités de clusterisation ?
Merci pour cette classe
3 septembre 2010 - 14 h 07 min
Oui oui je compte le faire, je n’ai juste pas beaucoup de temps libre en ce moment ^^
@Casa je te conseil de regarder le site hébergeant le script que j’utilise (http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclusterer/1.0/examples/advanced_example.html?)
4 septembre 2010 - 18 h 25 min
Peux-tu supprimer du commentaire précédent les noms, stpl.
6 septembre 2010 - 9 h 45 min
@Daniel je te conseil de regarder le contenu de la classe pour la clusterisation…
6 septembre 2010 - 19 h 35 min
Bonjour Yohann,
j’aurai bien un fichier à te soumettre, pas compliqué pour quelqu’un qui s’y connaît, qui marche déjà très bien pour moi.
Mais je n’arrive pas à faire deux choses :
- clusteriser mes 200 marqueurs
- ajouter un input de recherche de localité pour positionner la carte avec un zoom correspondant adapté à tant de km2.
Si cela t’intéresse, merci de m’écrire afin que je t’envoie le script à adapter.
Cela pourrait te donner des idées pour tes maps.
26 octobre 2010 - 10 h 44 min
Bonjour,
existe-t-il une documentation de la classe ? Ainsi que d’autres tutos ?
Merci
26 octobre 2010 - 20 h 29 min
Bonsoir Yohann,
Je pense avoir trouvé un petit bug, lorsqu’on active le zoom automatique (méthode setEnableAutomaticCenterZoom), il n’est pas tenu compte du niveau de zoom indiqué par le biais de la méthode setZoom.
Encore merci pour ce code !
Bonne soirée,
Hervé
26 octobre 2010 - 20 h 44 min
Oui Hervé. C’est un comportement normal pour que tous les marqueurs apparaissent sur la carte.
27 octobre 2010 - 6 h 20 min
ok, merci de l’info
Du coup j’ai désactivé le zoom automatique et fais le centrage sur ma dernière adresse.
Encore merci
26 novembre 2010 - 10 h 57 min
Salut
J’ai une petite question.
J’aimerais récupérer dans des variables php les lat et long via la fonction geocode($adresse);.
Merci
A+
26 novembre 2010 - 12 h 10 min
j’ai finalement trouvé mon bonheur
$geocod=$gmap->geocoding($adresse);
$statut=$geocod[0];
$lat=$geocod[2];
$long=$geocod[3];
merci
27 novembre 2010 - 12 h 15 min
Bonjour,
Merci pour le tuto!
J’ai 1 petite question, si tu as le temps de répondre cela me rendrai bien service…
Comment faire lorsque l’on clique sur un marqueur pour être redirigé sur une page du site? J’ai essayé de mettre un lien dans le code HTML que l’on peut mettre dans l’info bulle, mais ma carte n’apparait plus.
Ce que je souhaiterai faire c’est centraliser les adresse sur la carte, et lorsque l’internaute clique sur un marqueur, cela l’envoi sur la page du site correspondant
merci!
27 novembre 2010 - 12 h 20 min
Ooops, désolé, 2eme questions
Pour faire la carte avec clusterisation est-on obligé de partir d’un fichier .kml ou peut-on faire une requette SQL? Si oui, comment?
Merci!
9 janvier 2011 - 13 h 32 min
Tout d’abord, bravo et merci pour cette classe.
J’ai une question qui peut te sembler basic mais je sèche sur une erreur que me renvoie le serveur lorsque j’essaie de mettre en place ton code.
Voici le code d’erreur :
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in /home/www/*******/GoogleMapAPIv3.class.php on line 25
As tu une idée ?
Merci
10 janvier 2011 - 10 h 58 min
@iDavid , ton site doit être en Php4
11 janvier 2011 - 0 h 12 min
Merci Hervé,
C’est bien cela.
J’ai passé les protected en var et supprimé les public et cela fonctionne bien.
J’ai juste un nouveau problème, le script ne m’affiche pas plus de 30 points (environs) et passe les suivant en erreur (il ne résout pas les adresses)
c’est dommage car ça me limite.
Le fait d’être en php4 peut il avoir un rapport ?
En tout cas, super la class. Très pratique et très clair. Merci
A bientôt.
21 janvier 2011 - 23 h 32 min
une idée ?
27 janvier 2011 - 17 h 56 min
J’ai également une limitation du nombre de marqueurs affichés. Je demande l’ajout de 58 marqueurs et seulement 30 lignes d’ajout de marqueurs sont générés en javascript … ?
Quelqu’un a-t-il une idée ?
A part ce problème, bravo, très beau travail.
Merci,
Alain
30 janvier 2011 - 23 h 29 min
A mon avis cette limite est vient de Google plus qu’à ma classe. Comme pour les autres, je vous conseille de stocker vos coordonnées GPS en base de données afin de limiter les appels à Google pour retranscrire les adresses (qui ne renvoie plus les coordonnées à un certain moment). De mon côté, il n’y a bien sur aucune limite.
31 janvier 2011 - 20 h 09 min
Moi aussi, mon site doit être en php4 mais je n’ai pas réussi à transformer le fichier de class en php 4.
iDavid ou quelqu’un d’autre d’ailleurs, pourriez-vous m’envoyer le fichier compatible php4 ?
D’avance, merci…
1 février 2011 - 17 h 48 min
En fait en remplaçant tous les protected en var et en supprimant les public, le script bloque sur la function addKML et plus précisément je pense sur SimpleXMLElement qui ne doit pas marcher en php4.
et la je bloque vraiment!!!!
Si quel’qu’un a une idée…
1 février 2011 - 18 h 20 min
Bon j’ai réussi à me débrouiller pour utiliser le php5 finalement… et du coup ca a résolu les problèmes précédents!
mais la suite des aventures continue…
je cherche à utiliser le fichier kml généré par google map sur une carte que j’ai construite..
mais la ca bloque dès que je mets l’adresse externe du fichier kml
ca me sort plusieures erreurs du style:
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: URL file-access is disabled in the server configuration…………
ou
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: I/O warning : failed to load external entity « http://maps.google.fr/maps/ms?hl=fr&ie=UTF8&oe=UTF8&msa=0&msid=etc…….
10 février 2011 - 16 h 39 min
Bonjour a tous.
J’ai uploadé mon site sur un serveur web en y incluant l’api google map
En tout cas, BRAVO à yohann pour son excellent travail.
J’ai juste une petite question : j’ai integrer le code dans mon site php, mais il y a un module qui ne marche pas.
Je cherche en cliquant sur un bouton à placer un marqueur sur ma carte. J’utilise pour cela la fonction addMarkerByCoords($lat,$lng,$title,$html= »,$category= »,$icon= »)
Résultat : rien, aucun marqueur !
Voici comment je m’y prends :
Dans mon fichier html, je fais ainsi appel à ma fonction:
<input type="button" onClick="addMarkerByCoords('16.24209','-61.5629885','Trouver un magasin','ZI. Jarry‘,’cat2′, »); » value= »Rechercher »/>
Comment expliquer que je n’ai rien a l’écran ? est-ce une erreur de programmation, de version php ( actuellement en php4 je pense puisque utilise easyphp ), ou autre ?
Merci d’avance pour vos réponses.
12 février 2011 - 14 h 53 min
Bonjour,
Voici ce que je reçois en essayant le script simple.php, tel quel :
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in /homez.403/nepascli/www/petitsjobsch/membres/GoogleMapAPIv3.class.php on line 20
Il semblerait qu’il y ait donc une erreur dans la classe (que je n’ai pas modifiée non plus).
La ligne 20 est la suivante :
protected $googleMapId = ‘googlemapapi’;
Je ne vois donc absolument pas d’où peut venir l’erreur :/