12 nov. 2008
Gestion d'une Google Map avec PHP
12:40
Jean-Christophe Duvivier
Google
GoogleMaps
JavaScript
PHP
Nous voilà en route pour un tutoriel sur l'utilisation et la gestion d'une Google Map en ne manipulant que du code PHP. C'est pas génial ?! Vous le savez surement, et ça coule de source, l'API GoogleMaps est, à la base, géré principalement par du JavaScript. Etant donné que certains développeurs ont un peu de mal avec ce langage, et que celui utilisé par l'API GoogleMaps n'est pas du JavaScript de base, des classes PHP on vu le jour. Elles sont nombreuses sur la toile, nous allons nous intéresser à l'une d'entre elles : N/X API to Google Maps.
Pour la télécharger, ils vous suffit de vous rendre sur l'excellent site de PHP Classes, une immense bibliothèque de classes PHP qui vous simplifiera grandement la vie. L'enregistrement est nécessaire pour pouvoir accéder aux fichiers, cela ne prend que quelques secondes et cela vous fera gagner des jours ;) La classe est donc disponible ici : www.phpclasses.org
Une fois téléchargée, nous allons nous intéresser de près à cette classe. Pour ceux qui l'ont parcouru rapidement, vous aurez pu constater que ce sont des méthodes qui génèrent le code JavaScript nécessaire à l'affichage de la carte. Il nous suffit donc d'utiliser ses méthodes pour obtenir ce que l'on souhaite. Vous avez placé votre classe à la racine ou dans un répertoire de votre site ? Alors c'est parti !
La première chose à faire est de récupérer une clé (API Key) gentiment délivrée par Google à cette adresse : Google Maps API Key. Une fois que vous aurez lu l'intégralité de la page, vous devrez renseigner le champ "My web site URL". Il faut saisir l'adresse dans laquelle se trouvera votre GoogleMaps. Si elle est à la base : http://www.monsite.fr/, si elle est dans le répertoire toto : http://www.monsite.fr/toto. Il ne faut surtout pas la changer de place après l'obtention de votre clé, ou alors il vous faudra redemander une clé valide à Google.
Commencez par ouvrir votre classe php, et recherchez-y la ligne suivante (ligne 37 en principe) :
<?php define(GoogleMapsKey, '<your api key here>'); ?>
Remplacez <your api key here> par votre clé valide.
Créez ou ouvrez un fichier PHP dans lequel figurera votre carte. Nous allons commencer par une version de base pour bien assimiler les méthodes.
<?php require "nxgooglemapsapi.php"; // Inclusion de la classe $api = new NXGoogleMapsAPI(); // Création d'une instance de la classe $api->setWidth(800); // Définition de la largeur de la carte $api->setHeight(600); // Définition de la hauteur de la carte ?> <html> <head> <?php echo $api->getHeadCode(); ?> </head> <body onLoad="<?php echo $api->getOnLoadCode(); ?>"> <?php echo $api->getBodyCode(); ?> </body> </html>
Je pense que les commentaires suffisent à la bonne compréhension du script : après avoir créé une instance de la classe, on utilise une méthode chargée de fixer la largeur de la carte et une autre chargée de fixer sa hauteur. Dans le code HTML qui suit, on fait juste appel à des méthodes chargées d'écrire le code javascript nécessaire dans le HEAD, le BODY et les paramètres du BODY.
Et si nous procédions à une utilisation plus poussée de cette classe ? C'est parti !
<?php require "nxgooglemapsapi.php"; // Inclusion de la classe $api = new NXGoogleMapsAPI(); // Création d'une instance de la classe $api->setWidth(800); // Définition de la largeur de la carte $api->setHeight(600); // Définition de la hauteur de la carte $api->setZoomFactor(16); // Définition du zoom $api->addControl(GLargeMapControl); // Ajout des contrôleurs $api->addControl(GMapTypeControl); // Ajout des types de vue $api->addControl(GOverviewMapControl); // Ajout de la carte miniature ?> <html> <head> <?php echo $api->getHeadCode(); ?> </head> <body onLoad="<?php echo $api->getOnLoadCode(); ?>"> <?php echo $api->getBodyCode(); ?> </body> </html>
Quelques explications s'imposent pour ces nouvelles méthodes :
$api->setZoomFactor(16);
Permet de définir la valeur du zoom. Plus le zoom est important, plus la localisation sera précise. La valeur maximum est 17.
$api->addControl(GLargeMapControl);
Permet d'ajouter des contrôleurs pour régler le zoom, et se déplacer sur la carte. Il existe deux types de contrôleurs de tailles différentes. Ceux-ci sont les plus importants. Pour avoir les contrôleurs réduits, il suffit d'utiliser le code suivant :
$api->addControl(GSmallMapControl);
$api->addControl(GMapTypeControl);
Affiche 3 boutons qui vont permettre à l'utilisateur d'afficher la carte en format "plan", "satellite" ou bien "mixte".
$api->addControl(GOverviewMapControl);
Permet d'ajouter une miniature de la carte dans le coin inférieur droit. Cela permet de naviguer plus rapidement sur la carte.
Maintenant que tout cela est vu, nous allons passer à l'ajout d'adresses sur la carte.
<?php require "nxgooglemapsapi.php"; // Inclusion de la classe $api = new NXGoogleMapsAPI(); // Création d'une instance de la classe $api->setWidth(800); // Définition de la largeur de la carte $api->setHeight(600); // Définition de la hauteur de la carte $api->setZoomFactor(12); // Définition du zoom $api->addControl(GLargeMapControl); // Ajout des contrôles (zoom, déplacement...) $api->addControl(GMapTypeControl); // Ajout des types de vue $api->addControl(GOverviewMapControl); // Ajout de la carte miniature $api->addAddress("49 avenue des champs élysées Paris", "Haagen-dazs Paris", true); $api->addAddress("74 avenue des champs élysées Paris", "La Fnac", false); ?> <html> <head> <?php echo $api->getHeadCode(); ?> </head> <body onLoad="<?php echo $api->getOnLoadCode(); ?>"> <?php echo $api->getBodyCode(); ?> </body> </html>
Rien de compliqué. Nous faisons appel à la méthode "addAddress" et nous renseignons dans une premier temps l'adresse (avec rue, ville, CP...), dans un deuxième temps le contenu de l'infobulle et enfin le centrage automatique. Si la valeur est "TRUE", la carte se centrera automatiquement sur l'adresse. Si la valeur est "FALSE", la carte ne sera pas centrée sur l'adresse. À noter que si plusieurs adresses ont l'attribut "TRUE", la carte se centrera sur la dernière adresse ajoutée. De plus, il est possible de faire appel à une méthode de centrage par latitude/longitude :
$api->setCenter('latitude','longitude');
Pour en revenir à l'infobulle, il vous est possible d'y insérer du texte, mais aussi du code HTML avec insertion d'images etc.
Pour terminer ce tutoriel, nous allons implémenter une fonction de recherche sur notre carte avec zone de saisie et renseignement de la latitude et de la longitude.
<?php require "nxgooglemapsapi.php"; // Inclusion de la classe $api = new NXGoogleMapsAPI(); // Création d'une instance de la classe $api->setWidth(800); // Définition de la largeur de la carte $api->setHeight(600); // Définition de la hauteur de la carte $api->setZoomFactor(17); // Définition du zoom $api->addControl(GLargeMapControl); // Ajout des contrôleurs $api->addControl(GMapTypeControl); // Ajout des types de vue $api->addControl(GOverviewMapControl); // Ajout de la carte miniature $api->addAddress("49 avenue des champs élysées Paris", "Haagen-dazs Paris", true); $api->addAddress("74 avenue des champs élysées Paris", "La Fnac", false); ?> <html> <head> <?php echo $api->getHeadCode(); ?> </head> <body onLoad="<?php echo $api->getOnLoadCode(); ?>"> <?php echo $api->getBodyCode(); ?> <form> <input type="text" value="" name="address" id="address" /> <input type="button" value="Rechercher" onClick="moveToAddressDMarker(document.getElementById(’address’).value) ;" /> x : <input type="text" value="" id="coordX" /> y : <input type="text" value="" id="coordY" /> </form> </body> </html>
x représente donc la latitude, et y la longitude. On sort légèrement de la programmation en PHP je vous l'accorde, mais ça reste très abordable ;)
J'en reste là pour ce tuto, je vous laisse l'adapter à vos besoins ;)
Salon Imagina 2009




novembre 2011
Commentaires
Le 20 nov. 2008 à 22:51
Bonjour, bravo pour ce tuto, j'aurai bien voulu avoir les coordonnées longitude - latitude en réel comme sur cette exemple est-ce possible?
http://www.alsasys.com/web-agency/o...
comment? merci
Le 21 nov. 2008 à 21:12
Salut !
Cette classe étant limitée, elle ne possède pas de méthode permettant de faire ceci. Il est possible d'intégrer manuellement cette fonction dans la classe. Cependant, je te conseille d'aller voir vers d'autres classes de ce type qui proposent cette fonctionnalité. Je pense que cette classe le fait d'origine :
http://www.phpinsider.com/php/code/...
(avec la fonction getGeocode me semble-t-il)
Tu pourras trouver un tuto pour t'en servir ici :
http://fardeen.biz/index.php/tutori...
L'utilisation de la classe est similaire à celle que je présente. Tu ne seras pas dépaysé ;)
Le 01 déc. 2008 à 16:19
Bravo pour le tuto, ca marche bien, par contre, il m'explose safari systématiquement... Des suggestions?
Le 01 déc. 2008 à 23:10
Salut !
"Il t'explose Safari"
C'est à dire ? ^^
Le 02 déc. 2008 à 08:18
c'est a dire que le tout marche tres bien sur firefox par exemple mais des que je le teste sur safari, il crash et me fait quitter l'application completement.
le test est visible sur http://www.studio-meta.com/geoloc3....
Le code marche tres bien jusqu'a ce que l'on mette du php dans le head du document. Y a t il un moyen de le mettre aileurs?
voila le debut du error report
Date/Time: 2008-12-02 08:04:29 +0100
OS Version: 10.3.9 (Build 7W98)
Report Version: 2
Command: Safari
Path: Safari
Version: 1.3.2 (312.6)
PID: 691
Thread: 0
si cela peut aider, le reste du report etant dispo mais un tout petit peu énorme. alors, pb de version de safari ou bien?
Le 03 déc. 2008 à 23:35
Je t'avoue n'avoir testé cette classe que sur 3 navigateurs (ff, ie et opera). Je te remercie de me faire part de ce problème, il m'était inconnu jusqu'à aujourd'hui. Je n'ai malheureusement pas de solution pour le moment étant donné que le code php inséré dans le head ne peut pas être inséré tel quel ailleurs. Je vais DL Safari et mettre le nez là dedans, je te tiens au jus si je résouds le problème =)
@+
Le 04 déc. 2008 à 15:48
Je viens de le tester sur une version postérieure de la mienne et cela marche, je suppose que c'est la version 132 qui ne le fait pas bien.
Le 05 déc. 2008 à 10:53
Ca me rassure que ce soit un problème de version. J'espère que les utilisateurs mettent à jour régulièrement leur version de Safari...
Le 08 déc. 2008 à 21:53
Je suis un étudiant en Sérécom et je cherche a mettre en place un Googlemap sur un site! Il serait possible d'utiliser cette méthode pour le rendre administrable(via une base donné ou l'on stock les coordonnées des points)?
Le 08 déc. 2008 à 22:00
Tout à fait ;)
Avec un contenu statique, cette classe n'a pas de réelle utilité. C'est avec une base de données qu'elle prend tout son sens :p
Le 12 déc. 2008 à 12:20
Bonjour,
J'ai tester le script qui marche très bien sur mon site. Merci pour ce bon tuto!
J'aurai tout de même une question esthétique. Serait-il possible de modifier les couleurs par exemple... Ou supprimer les ligne du bas qui sont beaucoup trop longue, etc...
Bref, peut-on plus le personnaliser?
Le 12 déc. 2008 à 12:57
Salut !
Aurais-tu l'url de ta googlemaps que je puisse la visualiser ?
Je comprends pas trop ce que sont les lignes du bas en fait :p
Le 12 déc. 2008 à 13:05
Oui, tu vas sur mon site et tu cliques sur une île. Ce sont les lignes de copyright, ce qui fait que je doute qu'on puisse les enlever mais bon...
Le 12 déc. 2008 à 14:57
Ok ok.
Comme tu l'a suggéré, ces lignes ne sont pas modifiables étant donné que ce sont les copyright... Peut-être passeraient-elles mieux avec une map plus grande ?
Concernant les couleurs, je pense que tu parlais des couleurs de la carte en elle même. Elles ne sont pas modifiables non plus...
Qu'importe la classe utilisée, Google ne permet pas de toucher à ça pour le moment.. Peut-être que ça viendra. Si c'est un critère important pour toi, faut t'orienter vers une autre API... Mais GoogleMaps est de loin la plus performante...
Le 12 déc. 2008 à 19:17
Je vais garder GoogleMap parce que je pense que tu as raison... Les couleurs, c'est un détail, je me posais juste la question.
Par contre, pour les droits, j'avoue que c'est un peu plus pénible et je ne vois pas d'autre solution que de redimensionner aussi. C'est dommage mais je vais y penser.
En tout cas, merci pour ton tuto et pour ta réponse!
Le 28 fév. 2012 à 10:06
Bonjour;
je tiens a vous dire merci pour votre tuto cela ma beaucoup aide pour avancer, jaimerais si possible solliciter votre aide voila je viens de reprendre ce tuto mais au lieu de saisir les adresses jaimerais les recuperer de ma base de donnees sql server le probleme c'est que lors de l'affichage sur la carte ce n'est pas l'adresse que je veux afficher qui est sur ma carte voici mon code ainsi que ma requete
///////////////////code///////////////
<?php
require 'conn.php';
$sigle="";
if(isset($_GET['sg1']))
$sigle=$_GET['sg1'];
$adre=array();
$i=0;
require "nxgooglemapsapi.php"; // Inclusion de la classe
$api = new NXGoogleMapsAPI(); // Création d'une instance de la classe
$api->setWidth(800); // Définition de la largeur de la carte
$api->setHeight(600); // Définition de la hauteur de la carte
$api->setZoomFactor(17); // Définition du zoom
$api->addControl(GLargeMapControl); // Ajout des contrôleurs
$api->addControl(GMapTypeControl); // Ajout des types de vue
$api->addControl(GOverviewMapControl); // Ajout de la carte miniature
// requete sql pour extraire ladresse de la bd au lieu de saisir
$query = odbc_exec($sqlconnect,"select Adresse.rue from Adresse,Organisation,Commune,Wilaya where Organisation.id_adr=Adresse.id_adr and Adresse.id_com=Commune.id_com and Commune.id_Wilaya=Wilaya.id_wilaya and Wilaya.id_Wilaya between 1 and 48 and Organisation.sigle='".$sigle."'");
while(odbc_fetch_into($query,$row))
{
$adre[$i]=$row[0];
////////////////////////////////////////////
$api->addAddress($adre[$i], $sigle, true);
//$api->addAddress( $adre[$i], "$sigle", true);
//$api->addAddress( $adre[$i], "$sigle", true);
$i++; }
?>
merci beaucoup
sisi
Le 05 mar. 2012 à 08:50
bonjour; help please
Le 08 mar. 2012 à 09:22
re bonjour;
voila on ma conseille de faire sortir le addAdress de la boucle while car cela pouvait creer des pb donc jai obtenu:
$query = odbc_exec($sqlconnect,"select Patrimoine.nom_site from Adresse,Wilaya,Commune,Patrimoine where Patrimoine.id_sorg='".$id_sorg."' and Patrimoine.id_adr= Adresse.id_adr and Adresse.id_com=Commune.id_com and Commune.id_wilaya=Wilaya.id_wilaya");
while(odbc_fetch_into($query,$row))
{
$adre[$i]=$row[0];
$i++;
}
$i=0;
$api->addAddress('$adre[$i]', 'entreprise1', true);
$i=$i+1;
$api->addAddress('$adre[$i]', 'entreprise2', true);
// mais cela ne marche pas non plus ca beug et mon entreprise et positionnee nimporte ou sachant que je dois avoir au mois 2 entreprises à positionner
par contre si j'ecris le premier parametre de addAdress sans '' comme suit
$i=0;
//line 43
$api->addAddress($adre[$i], 'entreprise1', true); $i=$i+1;
$api->addAddress($adre[$i], 'entreprise2', true);
le message obtenu est location not found avec des
Notice: Undefined offset: 0 in C:\wamp\www\ECOFIEok\carto.php on line 43
Notice: Undefined offset: 1 in C:\wamp\www\ECOFIEok\carto.php on line 45
voila si vous avez une idee elle serait la bienvenue
Le 19 mar. 2012 à 08:50
bonjour,
voila jai pu resoudre le probleme detait ma requete qui poser un probleme merci a vous
Le 30 nov. 2012 à 23:33
Salut ! J'ai noté que votre blog est bien référencé mais pourrait etre un peu plus optimisé. Avez vous démarché une agence référencement google ? Sinon, voici mon site . A+
Le 23 fév. 2013 à 21:41
It is perfect time to make a few plans for the longer term and it is time to be happy. I have learn this publish and if I could I want to suggest you some interesting things or advice. Maybe you could write next articles relating to this article. I desire to read even more issues approximately it!
Le 17 mar. 2013 à 01:18
I do not even know the way I stopped up right here, however I believed this submit was once great. I do not recognize who you are however certainly you are going to a well-known blogger if you happen to are not already. Cheers!
Le 08 avr. 2013 à 12:25
Superb. Thank a lot for posting this. I will come to your site to read more and inform my neighbors about your writing.
Le 09 avr. 2013 à 22:59
Un très bon site riche en informations. Vous avez une très belle plume, bravo ! A bientôt.
Le 16 avr. 2013 à 06:08
Amazing stuff. My thanks for writing that. I will come again to see what's new and recommend my neighbors about you.
Le 18 avr. 2013 à 23:18
You nailed it. Thanks for taking the time. I will return again to read more and tell my neighbors about this site.
Le 19 avr. 2013 à 07:08
Terrific. Thanks for posting this. I will check again to see what's new and tell my acquaintenances about your site.
Le 19 avr. 2013 à 23:49
Like it. Thank you for doing such a good job. I'll definitely come to your site to read more and tell my coworkers about your website.
Le 21 avr. 2013 à 11:10
Good website. My thanks for posting that. I'll come to this site to find out more and tell my people about this site.
Le 23 avr. 2013 à 21:16
Hello There. I found your blog the usage of msn. This is a really neatly written article. I will be sure to bookmark it and come back to read more of your helpful information. Thanks for the post. I'll certainly comeback.
Le 27 avr. 2013 à 09:29
Like it. Thank you for writing that. I will come to your site to find out more and inform my neighbors about this.
Le 04 mai 2013 à 21:55
You rock. My thanks for posting that. I'll definitely check again to find out more and tell my friends about this site.
Le 06 mai 2013 à 03:32
Tremendous. Thank you for doing such a good job. I will check again to read more and inform my coworkers about your writing.
Le 08 mai 2013 à 04:03
Well worded. My thanks for posting that. I'll check here to see what's new and tell my acquaintenances about this site.
Le 09 mai 2013 à 01:33
Quality overall performance on this unique internet page. My spouse learned from browsing on this, and therefore probably will keep coming back time and again, seeking anything most recent.
Le 09 mai 2013 à 11:13
Wonderful points altogether, you just gained a new reader. What could you suggest about your submit that you just made a few days in the past? Any certain?
Le 09 mai 2013 à 15:55
Great performance on this website. I enjoyed browsing it, and will come back often, looking for anything new.
Le 09 mai 2013 à 20:59
Fantastic results regarding this unique ınternet site. My husband and i was pleased with surfing around it, not to mention will most likely keep coming back quite often, seeking for something innovative.
Le 12 mai 2013 à 01:02
Brilliant effectiveness with regards to this important website online. My family and i treasured examining this, not to mention will probably keep coming back very often, seeking for just about anything interesting.
Le 12 mai 2013 à 01:15
Fine accuracy available on this important net site. I've liked looking around the idea, and consequently will reappear continually, interested in nearly anything fresh, new.
Le 13 mai 2013 à 23:19
Awesome presentation via this web portal. I actually took pleasure looking at this, and consequently will most likely revisit often, on the lookout for nearly anything different.