Google Maps API
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 :

Avant de commencer, il est impératif d’avoir une clef google maps que l’on obtient rapidement sur ce lien : google maps signup. Le constructeur de cette classe « new GoogleMapAPI() » prend en paramètre cette clef, elle est donc essentielle au bon fonctionnement du programme.
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('GoogleMapAPI.class.php');
$gmap = new GoogleMapAPI('***');
$gmap->setDivId('test1');
$gmap->setDirectionDivId('route');
$gmap->setCenter('Nantes France');
$gmap->setDisplayDirectionFields(true);
$gmap->setSize(600,600);
$gmap->setZoom(11);
$gmap->setDefaultHideMarker(false);
// cat1
$coordtab = array();
$coordtab []= array('nantes france','<strong>html content</strong>');
$coordtab []= array('carquefou france','<strong>html content</strong>');
$coordtab []= array('vertou france','<strong>html content</strong>');
$coordtab []= array('rezé france','<strong>html content</strong>');
$gmap->setIconSize(20,34);
$gmap->addArrayMarkerByAddress($coordtab,'cat1','markerpics.png');
// cat2
$coordtab = array();
$coordtab []= array('saint-herblain france','<strong>html content</strong>');
$coordtab []= array('bouguenais france','<strong>html content</strong>');
$coordtab []= array('orvault france','<strong>html content</strong>');
$gmap->addArrayMarkerByAddress($coordtab,'cat2');
$gmap->generate();
echo $gmap->getGoogleMap();
...
Code source de l’exemple :
simple.php (5,6 KiB, 2 243 hits)
Google Maps avancée avec clusterisation (1600 marqueurs) issus d’un fichier KML
...
require('GoogleMapAPI.class.php');
$gmap = new GoogleMapAPI('***');
$gmap->setDivId('test1');
$gmap->setCenter('Nantes France');
$gmap->setDisplayDirectionFields(true);
$gmap->setClusterer(true);
$gmap->setSize(600,600);
$gmap->setZoom(7);
$gmap->addKML('kml/Locator3RF.kml','radars_fixes','Locator3RF.png');
$gmap->generate();
echo $gmap->getGoogleMap();
...
Démonstration (zoomer/dezoomer pour voir la clusterisation)
Code source de l’exemple :
advanced.php (2,9 KiB, 1 486 hits)
Pour utiliser la clusterisation vous devez avoir les fichiers suivants :
Image du cluster
Fichier KML
Fichier markerclusterer_packed.js (Thanks to http://gmaps-utility-library.googlecode.com/)
Télécharger la GoogleMapAPI.class.php
GoogleMapAPI.class.php (16,8 KiB, 2 673 hits)
Changelog
[23/09/2009]
- Implémentation de la fonction de centre+zoom lorsque l’on clique sur l’un des marqueurs. Le niveau du zoom sur les marqueurs peut se régler avec la méthode PHP : setInfoWindowZoom().
- Implémentation d’une fonction pour que la google maps centre/zoom automatiquement en fonction des marqueurs au chargement de la carte : setEnableAutomaticCenterZoom(true).
[23/07/2009]
- Correction du bug de langue
[29/06/2009]
- changement de la librairie de clusterisation : http://gmaps-utility-library.googlecode.com/svn/trunk/markerclusterer/1.0/src/ (Merci à Philippe Ivaldi)
[25/06/2009]
- ajout de la méthode javascript « showAddress() » qui permet de centrer la carte sur une adresse
- ajout de la méthode javascript « showAll() » qui affiche tous les marqueurs
- ajout de la méthode javascript « hideAll() » qui cache tous les marqueurs
- renomage des méthodes « hide() » et « show() » en « hideCategory() » et « showCategory() » pour un soucis de compatibilité
[19/06/2009]
- correction du bug de rafraichissement des itinéraires
[27/05/2009]
- utilisation de curl pour récupérer le xml (merci à Desfrênes Mickaël)
- reformatage du code selon les recommandations PEAR
- ajout des tags dans les commentaires (phpdoc, doxygen, IDE, …)
- modification de la portée des variables
[26/05/2009]
- Release initiale
- Google Maps API en PHP – CERDAN Yohann
- » Mini-tutorial Google maps en PHP
- Twitted by Apen_
- Utiliser les fonctions de l’API Google Maps sur votre site (en PHP)
- Google Maps API | traffic-internet.net
- vivanno.com::aggregator » Archive » Google Maps API
- Twitted by trenault
- développement web en PHP pour insertion de gmaps dans un site « KINAXIA



25 mai 2009 - 19 h 12 min
J’attends vos remarques car il y a surement des choses à ajouter
Je suis également preneur si quelqu’un souhaite m’aider à maintenir cette classe à jour (optimisation, évolutions, etc..).
25 mai 2009 - 22 h 32 min
Salut,
J’étais sur le point d’en faire une pour les besoins d’un site…
On peut dire que ça tombe bien !
Je teste ça d’ici la fin de la semaine et te ferais part de mes remarques.
26 mai 2009 - 7 h 26 min
Félicitation, elle est pas mal ta classe, je ne sais pas si je l’utiliserai mais en le code est clean.
La seule remarque que j’ai à te faire c’est l’utilisation du file_get_contents suivant :
$url = « http://maps.google.com/maps/geo?q= ».$encode_address. »&output=csv&key= ».$this->googleMap_key;
$data = file_get_contents($url);
qui pourrait poser quelques problèmes sur certaines configurations de serveur ayant allow_url_fopen à 0 dans le php.ini.
Pour résoudre ce problème je te conseillerai d’utiliser les sockets php (fsockopen …).
Sinon well done
26 mai 2009 - 7 h 40 min
Très bonne remarque petitchevalroux, je prendrais ça en compte
27 mai 2009 - 8 h 42 min
Une petit mise à jour suite aux retours rapides que j’ai eu
27 mai 2009 - 18 h 47 min
Bonjour,
Merci pour cette classe, j’ai rencontré aucun problème en local, mais lorsque je la teste sur un serveur je rencontre l’erreur suivante :
« Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in GoogleMapAPI.class.php on line 23″
auriez vous une idée d’ou cela peut provenir ?
27 mai 2009 - 18 h 51 min
Autant pour moi, mon serveur online n’est pas sous php5
27 mai 2009 - 19 h 33 min
Pas de problèmes ^^
18 juin 2009 - 23 h 35 min
Bon j’ai enfin eu un peu de temps pour tester cette classe.
Elle est bien faite et plutôt simple à utiliser.
Cependant, j’ai quelques problèmes avec l’affichage des itinéraires. le premier itinéraire demandé est OK, mais si on veut en afficher un deuxième, il s’ajoute au premier. Il serait bien d’effacer le premier avant d’afficher le deuxième.
19 juin 2009 - 21 h 38 min
C’est corrigé. Merci de l’avoir signalé.
30 juin 2009 - 15 h 32 min
Super classe !
y’a t il une méthode pour que la carte se centre/zoom en fonction des différents marker positionnés ,
30 juin 2009 - 16 h 42 min
Non mais cela me parait une évolution intéressante. A voir.
J’essaierais de publier une mise à jour sous peu.
22 juillet 2009 - 11 h 21 min
salut!
j’ai testé la classe el elle marche très bien. je voulais juste savoir si on peut superposer une image png sur la carte. merci
22 juillet 2009 - 12 h 05 min
Je te conseil un coup d’oeil ici :
http://code.google.com/intl/fr/apis/maps/documentation/examples/groundoverlay-simple.html
C’est a dire utilisé la classe javascript « GGroundOverlay ».
4 août 2009 - 0 h 19 min
Bonjour Yannux & Yohann,
La class développé par Monte Ohrt en 2007 gère justement le center/zoom
http://www.phpinsider.com/php/code/GoogleMapAPI/
C’est que ça manque dans ta class Yohann sinon bon boulot et facile a mettre en place rapidement.
Thierry
4 août 2009 - 8 h 47 min
Pour le center, tu peux l’initialiser en PHP mais il y a également une méthode JS « showAddress() » qui te permet de faire ce que tu veux.
Cette fonction « showAddress() » dépend directement du zoom que tu as définis avec « setZoom() » en PHP.
Peut être que ces deux paramètres peuvent répondre à ta problématique ?
5 août 2009 - 0 h 10 min
Merci Yohann pour l’info. En fait j’ai fait un peu de copier/coller avec la class que j’ai mentionné dans mon premier message. Pas forcement très propre mes affaires mais ça fonctionne et je code simplement pour des applications personnel.
Bonne continuation.
Thierry
5 août 2009 - 11 h 30 min
@Thierry merci et bonne continuation
7 août 2009 - 10 h 02 min
Hello,
Juste une petite « amélioration pratique » : pourquoi ne pas créer la méthode __toString, qui wrappe getGoogleMap() ? Ca serait pertinent, surtout pour les grosses feignasses dans mon genre
.
Bonne classe sinon
22 août 2009 - 1 h 57 min
salut
encore une question : comment faire pour changer la langue de la carte et du résultat de l’itinéraire ?
j’ai essayé la méthode setLang(), mais ça ne semble pas fonctionner.
merci encore
23 août 2009 - 0 h 29 min
@romualb c’est corrigé. Testé avec setLang(‘en’).
26 août 2009 - 23 h 28 min
Merci Yohann, ça marche nickel (testé en français, anglais et allemand)
si tu veux voir un exemple d’intégration de ta classe : http://www.studio-hossegor-lac.com
dernière petite question : comment appliquer des styles sur le résultat de l’itinéraire…
27 août 2009 - 10 h 36 min
De rien
Pour appliquer des styles à l’itinéraire, tu dois appliquer des styles CSS en cascade sur la DIV qui contient l’itinéraire.
On peut pas faire mieux.
23 septembre 2009 - 13 h 30 min
Cette classe est vraiment géniale, BRAVO.
Tu as dis le 30 juin que tu ferais une mise à jour sur le sujet du centrer/zoomer comme déjà présent dans la classe de Monte Ohrt que j’ai d’abord utilisé mais qui ne me convient pas pour l’affichage de plusieurs catégories.
Je voulais savoir ou ça en était, comme j’ai essayé de faire moi aussi du copier coller entre les deux classe mais que ça ne fonctionne pas, je fais donc appel à toi pour savoir si tu envisage d’effectuer cette mise à jour ou non?
A+ et encore merci
23 septembre 2009 - 13 h 48 min
Je vais essayer de regarder cela @Mikkro je vous tiens au courant.
23 septembre 2009 - 14 h 14 min
@Mikkro : j’ai implémenté la fonction de centre+zoom lorsque l’on clique sur l’un des marqueurs. Le niveau du zoom sur les marqueurs peut se régler avec la méthode PHP : setInfoWindowZoom().
23 septembre 2009 - 17 h 10 min
Merci, mais ce n’est pas vraiment ça que je cherchais. c’est toute fois intéressant…
Ce que je voudrais c’est que la carte se centre automatiquement sur les différents markers et ne soit pas limité à un seuil de zoom, en gros si deux points sont proche il y aura un zoom fort et cadré sur les deux points en question et si il sont éloignés alors le zoom sera faible.
Merci pour la réponse précédente extrêmement rapide
23 septembre 2009 - 19 h 35 min
Ok je n’avais pas compris cela dans ce sens ^^ Je vais me pencher la dessus
23 septembre 2009 - 20 h 43 min
Comme ce n’était pas bien compliqué, j’ai mis en place cette fonctionnalité.
Pour que la google maps centre/zoom automatiquement en fonction des marqueurs, il faut utiliser la méthode : setEnableAutomaticCenterZoom(true).
24 septembre 2009 - 11 h 39 min
Vraiement Génial c’est exactement ce que je cherchais.
Encore bravo pour cette merveilleuse classe.
A bientot
29 septembre 2009 - 11 h 46 min
Bonjour et bravo pour cette classe, elle est super.
Je me permets de remonter 2 infos :
1/dans la méthode addKML, il y a le .kml en dur dans le code
$xml = new SimpleXMLElement(‘kml/Locator3RF.kml’, null, true);
au lieu de :
$xml = new SimpleXMLElement($url, null, true);
2/ est-il possible de passer les variables private en protected car cela permet d’étendre la classe sans rien toucher. Super pratique pour les mises à jour de cette classe sans rien toucher à son code
merci encore pour le travail fourni
29 septembre 2009 - 12 h 22 min
Un autre bug sur enableAutomaticCenterZoom
Quand on a des données positives et négatives, le centrage ne se fait pas correctement.
Voici un jeu de test :
createMarker(-21.136009,-175.2164, »Tonga ou Friendly« , »cat », »");
createMarker(-9.46559,147.1969, »Papouasie – Nouvelle Guinée« , »cat », »");
createMarker(-8.51359,179.1923, »Tuvalu« , »cat », »");
createMarker(-9.426761,159.948735, »Salomon« , »cat », »");
createMarker(1.328152,172.978413, »Kiribati« , »cat », »");
createMarker(-17.740391,168.320999, »Vanuatu« , »cat », »");
createMarker(-13.83142,-171.751801, »Samoa Occidentales« , »cat », »");
createMarker(7.1482383,171.0395821, »Iles Marshall« , »cat », »");
createMarker(6.917709,158.185444, »Micronésie« , »cat », »");
createMarker(-0.5466857,166.9210913, »Nauru« , »cat », »");
createMarker(-18.08769,178.3841, »Fidji« , »cat », »");
createMarker(-35.28204,149.12858, »Australie« , »cat », »");
createMarker(-41.28648,174.776217, »Nouvelle Zélande« , »cat », »");
29 septembre 2009 - 21 h 37 min
@lexo pour tes 2 premières remarques (surtout la première), j’ai corrigé.
Pour le problème d’autocentre, je jette un coup d’oeil bientôt.
30 septembre 2009 - 12 h 02 min
merci pour le protected
Pour le point 2, je crois avoir trouvé.
Comme la moyenne pour le SetCenter est dans l’eau et que le réseau n’est pas assez mailé, quand tu passes la valeur $this->center à $this->geocoding(), Google te renvoie une valeur proche de 0/0 (ou une valeur très proche car j’ai aussi testé sur la Guadeloupe dans mon code) car il ne trouve pas un point dans l’eau.
Ton code marche avec un réseau très maillé comme la France et ton exemple de Nantes/France fonctionne très bien mais sur l’océanie, c’est plus chaud pour Google
En espérant avoir été clair
Merci encore
1 octobre 2009 - 9 h 08 min
J’ai compris, j’essaierais de regarder cela. Merci pour tes informations très pertinentes
5 octobre 2009 - 8 h 26 min
As-tu eu le temps de jeter un oeil ?
5 octobre 2009 - 8 h 59 min
Non, le weekend je ne suis généralement pas dispo. J’essaierais d’y jeter un coup d’oeil cette semaine.
6 octobre 2009 - 22 h 08 min
@lexo, j’ai fait quelques tests ce soir (http://dev.ycerdan.fr/googlemap/simplev2.php) et j’arrive à afficher par moments les différents points.
J’ai fait quelques toutes petites optimisations sur le calcul (tu peux regarder) mais cela n’améliore pas beaucoup la chose. On peut noter le même bug sur cette classe (http://www.phpinsider.com/php/code/GoogleMapAPI/). Visiblement google s’embrouille car on est tout proche de la limite des lat&lng (les pointillés sur gmap)… Si tu trouves quelque chose je suis preneur…
22 octobre 2009 - 11 h 45 min
Salut
En faisant un tour sur le net j’ai trouvé une application via l’API GMap qui pourrait etre interressante. la création d’isochrones. au même titre que les itineraires ne pourrait il pas etre interressant de mettre en place cette fonctionnalité dans cette merveilleuse classe qui est une référence pour moi, ainsi que la possibilité d’afficher un genre de AddPolygoneByAdress.
A+
22 octobre 2009 - 12 h 27 min
Petit oubli de ma part,
L’adresse de l’appli isochrones est la suivante:
http://cartoo.dyndns.org