testtestHome

Google Maps Lightbox…

01.03.2007 par Mich
Vous aurez peut-être remarqué qu’a coté des tags dans les billets il y a maintenant un petit lien ‘Où ?’. J’ai il y a quelques semaines ajouté 2 champs à la table de messages dans la base de données de ce blog made-in-1030 qui contiennent la latitude et la longitude, afin de pouvoir géotagger des billets.

A coté de ça, je me suis amusé à programmer un petit ajout pour ce blog, dans le genre du lightbox qui au lieu d’images mets une carte Google Maps afin de représenter à l’intérieur de ce site l’endroit dont parle le billet. L’idée étant la même que le lightbox :
  • Faire un lien vers un url, grace à la balise HTML ‘a’
  • Mettre une relation via l’attribut rel de la balise a.
  • Exemple : <a href="%lien_google_maps%" rel="gmap">Blabla</a>

Un JavaScript va ensuite scanner tous les liens qui ont la relation ‘gmap’ pour y ajouter un comportement onclick qui va lancer le script lightbox qui ouvrira la carte dans le site.

Google Maps Lightbox


Cette méthode a un grand avantage, c’est que la carte reste accessible tant via vos lecteurs RSS (Bloglines, Google Reader, Thunderbird,…) qu’à l’intérieur de ce site où elle offre un plus d’information sans que le visiteur doit quitter la page.

Voici le script en application, cliquez sur les liens pour le voir. (l’exemple ne fonctionneras que depuis le site pour voir le lightbox, sinon ca ira vers Google Maps) :
J’ai déjà été ici et ici, mais j’aimerais bien aller la-bas aussi.

Ce script est à votre disposition. Si vous trouvez des bugs ou quoi, n’hésitez pas à me le signaler. Je ne l’ai pas testé sur IE6 mais bien avec IE7 et FF2.

Cliquez ici pour télécharger la version 0.1 du script gmlightbox.

L’installation se fait en 4 pas :
  1. Dézipper les fichiers sur votre serveur.
  2. Demander une clé Google Maps et insérer dans vos pages/templates la balise que le site vous fournis.
  3. Inclure le JavaScript gmlightbox :
    <script src="http://%urlbase%/gmlightbox/gmlightbox.js" type="text/javascript"></script></li>
  4. Inclure le CSS gmlightbox :
    <link href="http://%urlbase%/gmlightbox/gmlightbox.css" rel="stylesheet"/>
    (%urlbase% corresponds à l'URL de base de votre site)

Une fois que ceci est fait, il ne vous reste plus qu’une chose à faire pour voir la carte parraître sur votre site :
  1. Trouver l’endroit dans Google Maps et recuperer le lien de l’endroit en cliquant sur « Link to this page », on va appeler ce lien %url_google_maps%
  2. Mettre la balise a :
    <a href="%url_google_maps%" rel="gmap" title="Titre">Coucou</a>

J’espère que c’est plus au moins clair, sous réserve que le sujet vous intéresse, bien entendu. De toute façon rien ne vous oblige à lire.

Le code JavaScript est loin d’être optimal. Je dois encore uniformiser les noms de variables, optimaliser le code etc., mais tout ça suivra. Des que je fais une nouvelle version, je la mettrais à disposition ici.
tags: . . . |
Ca doit être 'achement bien quand on le lit, mais je n'aime pas la façon dont le PC du bureau me dit "Your web browser is not fully supported by Google Maps."
Deuxième essai ce soir à la maison.
Wouaw. IE5.0 ?
J'adhère.
Je vais pas tester avant le weekend, mais si possible j'y ferai un plugin Serendipity
Le seul que je voudrais changer, c'est le bouton à fermer... devrait être plus visible.
Je l'ai mis en del.icio.us :
http://del.icio.us/url/923677935c62e77dcccbcbc7219b0e9e
Je suis ouvert à vos suggestions
D'accords avec Pascal sur le bouton. Un peu difficile à remarquer mais je vais me faire un plaisir de tester ton code pour mon prochain voyage ;o)...
J'ai pas pu m'empêcher de tester... et sans aucun problèmes: http://www.melissamonaco.com/wordpress/?p=83
Bon, ben maintenant, je vais devoir m'amuser à lier plein de pages. C'est malin! *lol*
Deviendrais tu une geekette?
Ah non! Le vrai geek, c'est celui qui s'amuse à pondre le code pour le plaisir.
Moi, je ne fais que piquer les bonnes idées du sus-nommé.
En tout cas content de voir que ca fonctionne chez toi. J'ai quand-même quelques updates à faire mais ca sera à mon avis plus pour ce soir (billet metro à pondre avant...)
ça a l'air sympa. je testerai ça volontiers. Mon weekend va être chargé
Le fichier zip ne contient qu'un fichier qui n'a pas d'extension!
Où puis-je recuperer les fichiers .css et .js?
Etonnant... le fichier contiens tout. A mon avis c'est votre client ZIP ou RAR qui a un leger souci. Je les envoi par mail.
A quand le plugin WordPress ?
Salut,

Vous pouvez peut-être me donner une info sur google maps, la recherche d'un point sur une carte se fait elle uniquement par les points gps ou bien y a t il une possibilité de le faire par un le biais d'une adresse 10 rue jean jaures 29200 brest.
Merci
Bonjour,

il y a également moyen de faire ça par adresse, ca marche tout aussi bien.

Par exemple: "10 rue jean jaures, brest" dans http://maps.google.fr...
Je confirme : impossible de decompresser ce ficier zip avec winzip 10 par exemple sur wintel...
Commen faire ?
Hello,

Je ferais un nouveau zip dans le courant de la soirée. Je vous ai entre temps envoyé les fichiers via mail.

@+
Bonjour,
Le fichier ZIP ne fonctionne toujours pas... impossible de le décompresser.
Comment peut-on faire pour accéder au code ??
Merci
J'ai mis un autre ZIP en ligne. Est-ce que ca fonctionne maintenant ?
Bonjour,
J'ai bien reçu vos fichiers par mail et je vous en remercie. Par contre, je viens de tester le nouveau ZIP en ligne qui n'a pas l'air de fonctionner.
Bonne journée
Chez moi ils s'ouvrent sans problème... (version de winzip incompatible?)
Franchement, ça m'étonne... Je mettrais en version rar aussi alors.

Pour info: j'ai fait le zip avec winrar quand on m'a dis que celui-ci ne marchait pas. Et la version qui est la est un dossier comprésse windows donc, 3 versions, toujours pas bon Passer à Firefox ?
Y a-t-il une nouvelle version de prévue ???
Parmi les bugs que j'ai repéré :
- gmlightbox ne gère pas le redimentionnement de l'écran. SI l'on agrandit la fenêtre le carte n'est plus centrée et le 'cache gris' n'est pas étiré.
- Au bout d'un certain temps sous firefox 2.0.0.3, la carte ne se charge pas complètement (apparition de carrés gris voire carte vide).

Y a t-il un moyen d'inclure des effets de fondu lors de l'apparition/disparition des cartes à la manière qu'une lightbox 2.0
Excellent, par contre ya un bug quand on met des adresses, je vais regarder où ca bloque et vs tiens au courant !
Heu ca morche pas avec opera non plus..il redirige vers gmaps apres qq secondes, bizarre!
bonjour,
beau boulot, merci pour le partage.
j'ajouterai juste une info, si on a les coordonnées GPS en décimale on peut juste ajouter la ligne
Le zip ne s'ouvre pas, j'ai un seul fichier sans extension. Peux-tu m'envoyer les fichiers par mail stp.
Merci
Je sens que je vais casser l'ambiance, moi je ne sais même pas comment suivre les instruction d'installation... J'ai obtenu mon adresse avec clef API de ggogle, que j'ai insérer dans mon template. POur ce qui est des dossiers décompressés, ils doivent être mis dans le dossier de base ou le dossier des outils? Et les liens qui sont donné doivent ils être ajoutés aussi dans le template ou directement dans le fichier style.css.
Merci
J'ai modif le code du js pour le resize et si la fenetre est plus petite que 800x600 :

// Copyright 2007 - Michael Uyttersprot / eMich.be
// v0.1b - 07.03.01

var gmlb_width=640;
var gmlb_height=480;
var gmOverlay;
var gmContainer;
var gmMap;
var gmLabel;
var gmMapObject = null;
var gm_zoom;
var gm_mapType;
var gm_close;
var gm_marker = null;

function gmLb_init(){
var linksArr=document.getElementsByTagName("a");
for(i = 0;i if(linksArr[i].getAttribute("rel")=="gmap"){
//linksArr[i].onclick=function(){gm_ShowMap(this);return false;};
gmLbAddClickEvent(linksArr[i],function(){gm_ShowMap(this);return false;});
}
}

gmOverlay = document.createElement("div");
gmOverlay.setAttribute("id","gmlb_overlay");
gmOverlay.style.display="none";
gmOverlay.style.position=document.all?"absolute":"fixed";
gmOverlay.style.top="0px";
gmOverlay.style.left="0px";

gmOverlay.style.width=gmlb_width+"px";
gmOverlay.style.height=gmlb_height+"px";
gmOverlay.style.width = getFrameWidth();
gmOverlay.style.height = getFrameHeight();

gmContainer = document.createElement("div");
gmContainer.setAttribute("id","gmlb_container");
gmContainer.style.width=gmlb_width+"px";
gmContainer.style.position="absolute";
gmContainer.style.display="inline";

gmLabel = document.createElement("div");
gmLabel.setAttribute("id","gmlb_label");
gmLabel.setAttribute("class","gmlb_label");
gmLabel.style.display="block";
gmLabel.innerHTML="test";

gmClose = document.createElement("div");
gmClose.setAttribute("id","gmlb_close");
gmClose.setAttribute("class","gmlb_close");
gmClose.style.display="block";
gmClose.onclick=function(){gmOverlay.style.display='none';gmLbOnClose();};

//Taille de la fenetre ...
if(getFrameHeight()<(gmlb_height+60)) gmlb_height = getFrameHeight()-60;
if(getFrameWidth()<(gmlb_width+60)) gmlb_width = getFrameWidth()-60;

gmMap = document.createElement("div");
gmMap.setAttribute("id","gmlb_map");
gmMap.style.width=gmlb_width+"px";
gmMap.style.height=gmlb_height+"px";
gmMap.style.display="block";
gmMap.style.float="left";
gmMap.onclick=function(){return false;};

gmContainer.appendChild(gmMap);
gmContainer.appendChild(gmLabel);
gmContainer.appendChild(gmClose);
gmOverlay.appendChild(gmContainer);
document.documentElement.ownerDocument.body.appendChild(gmOverlay);
}

function gm_ShowMap(obj){
if(document.all){
gmOverlay.style.top = getScrollHeight()+"px";
gmOverlay.style.left = getScrollWidth()+"px";
}
gmOverlay.style.width=getFrameWidth()+"px";
gmOverlay.style.height=getFrameHeight()+"px";

if(obj.title){
gmLabel.innerHTML=obj.title;
}
else{
gmLabel.innerHTML="Google Map";
}

gmContainer.style.visibility="hidden";
document.getElementById("gmlb_overlay").style.display="";
gmContainer.style.left=((getFrameWidth()-gmContainer.offsetWidth)/2)+"px";
gmContainer.style.top=((getFrameHeight()-gmContainer.offsetHeight)/2)+"px";
gmContainer.style.visibility="";
var params = parseGmapLink(obj.href);
gm_setMap(params);
gmLbOnShow();
}

function gm_Update() {
if(gmOverlay.style.display!='none') {
//Taille de la fenetre ...
if(getFrameHeight()<540) gmlb_height = getFrameHeight()-60;
else gmlb_height = 540;
if(getFrameWidth()<700) gmlb_width = getFrameWidth()-60;
else gmlb_width = 640;
gmMap.style.width=gmlb_width+"px";
gmMap.style.height=gmlb_height+"px";


if(document.all){
gmOverlay.style.top = getScrollHeight()+"px";
gmOverlay.style.left = getScrollWidth()+"px";
}
gmOverlay.style.width=getFrameWidth()+"px";
gmOverlay.style.height=getFrameHeight()+"px";
gmContainer.style.visibility="hidden";
document.getElementById("gmlb_overlay").style.display="";
gmContainer.style.left=((getFrameWidth()-gmContainer.offsetWidth)/2)+"px";
gmContainer.style.top=((getFrameHeight()-gmContainer.offsetHeight)/2)+"px";
gmContainer.style.visibility="";
gmLbOnShow();
}
}

function gmLbOnShow(){
;
}

function gmLbOnClose(){
;
}

function getFrameWidth(){
if (self.innerWidth)
{
return self.innerWidth;
}
else if (document.documentElement && document.documentElement.clientWidth)
{
return document.documentElement.clientWidth;
}
else if (document.body)
{
return document.body.clientWidth;
}
else return;
}

function getFrameHeight(){
if (self.innerWidth)
{
return self.innerHeight;
}
else if (document.documentElement && document.documentElement.clientWidth)
{
return document.documentElement.clientHeight;
}
else if (document.body)
{
return document.body.clientHeight;
}
else return;
}

function getScrollWidth()
{
var w = window.pageXOffset ||
document.body.scrollLeft ||
document.documentElement.scrollLeft;

return w ? w : 0;
}

function getScrollHeight()
{
var h = window.pageYOffset ||
document.body.scrollTop ||
document.documentElement.scrollTop;

return h ? h : 0;
}

function gm_setMap(params) {
if (GBrowserIsCompatible()) {
if(!gmMapObject)
{
gmMapObject = new GMap2(gmMap);
gmMapObject.addControl(new GLargeMapControl());
gmMapObject.addControl(new GMapTypeControl());
}
gm_mapType=G_NORMAL_MAP;
gm_zoom=10;
if(params["t"]=="k"){gm_mapType=G_SATELLITE_MAP;gm_zoom=parseInt(params["z"]);}
else if(params["t"]=="" || params["t"]==null){gm_mapType=G_NORMAL_MAP;gm_zoom=parseInt(params["z"]);}
else if(params["t"]=="h"){gm_mapType=G_HYBRID_MAP;gm_zoom=parseInt(params["z"]);}

if(params["lat"]==null && params["long"]==null && params["q"]!=null && params["q"].indexOf("http://")==-1){

var geocoder = new GClientGeocoder();

geocoder.getLatLng(
unescape(params["q"].replace(/\+/g, " ")),
function(point){
gmMapObject.setCenter(point, gm_zoom,gm_mapType);
gm_addMarker(point);
}
);

}
else if(params["q"]!=null && params["q"].indexOf('http://')!=-1){
//alert(params["q"]);
//var geoxml = new GGeoXml(params["q"]);
//var geoxml = new GGeoXml("http://www.emich.be/fr/kml");
//gm_addXMLMarker(geoxml);
}
else{
var point = new GLatLng(params["lat"],params["long"]);
gmMapObject.setCenter(point, gm_zoom,gm_mapType);
gm_addMarker(point);
}
}
}

function gm_addMarker(point){
if(gm_marker!=null){gmMapObject.removeOverlay(gm_marker);}
gm_marker = new GMarker(point);
gmMapObject.addOverlay(gm_marker);
}

function gm_addXMLMarker(geoxml){
if(gm_marker!=null){gmMapObject.removeOverlay(gm_marker);}
gm_marker = geoxml;
gmMapObject.addOverlay(gm_marker);
}

function parseGmapLink(url){
var parts = url.split("?");
if(parts.length<2)return new Array();
var params = parts[1].split("&");
var gMapParams=new Array();
for(i = 0 ; i < params.length ; i++){
keyValue=params[i].split("=");
if(keyValue[0]!="ll"){
gMapParams[keyValue[0]]=keyValue[1];
}
else{
var latlong=keyValue[1].split(",");
gMapParams["lat"]=latlong[0];
gMapParams["long"]=latlong[1];
}
}
return gMapParams;
}

function showAddress(address) {
var geocoder = new GClientGeocoder();

geocoder.getLatLng(
address,
function(point) {
if (!point) {
alert(address + " not found");
} else {
gmSetCenter(point);
}
}
);
}

function gmSetCenter(point){
alert(point);
document["gmCenter"]=point;
}

function gmLbAddLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
}
else {
window.onload = function() {
oldonload();
func();
}
}
}

function gmLbAddResizeEvent(func) {
var oldonresize = window.onresize;
if (typeof window.onresize != 'function') {
window.onresize = func;
}
else {
window.onresize = function() {
oldonresize();
func();
}
}
}

function gmLbAddScrollEvent(func) {
var oldonscroll = window.onscroll;
if (typeof window.onscroll != 'function') {
window.onscroll = func;
}
else {
window.onscroll = function() {
oldonscroll();
func();
}
}
}

function gmLbAddClickEvent(obj,func) {
var oldonclick = obj.onclick;
if (typeof obj.onclick != 'function') {
obj.onclick = func;
}
else {
obj.onclick = function() {
oldonclick();
func();
}
}
}

gmLbAddLoadEvent(gmLb_init);
gmLbAddResizeEvent(gm_Update);
gmLbAddScrollEvent(gm_Update);
Hello,

J'ai essayé d'intégrer ce super outil dans une page d mon site, mais lorsque je clique sur le lien pour ouvrir la lightbox, ça me dirige vers google. J'obtiens donc l'effet inverse, mon visiteur quitte définitivement mon site. J'ai dût faire une erreur quelque part mais je ne vois pas où !!!
pakojoom (05/11/2007 @ 13:00)
Bonjour,
Je suis arriver ici par hazard, et j'ai testé : oui ça fonctionne mais si, je peux me permettre :
- utiliser un .png pour le fond gêne peut-être les ie6 users
- pas simple de paramétrer l'aspect de la map

Alors, du coup, et ayant une grosse préférence pour les smoothbox, j'ai fait mon propre affichage de map avec la nouvelle fonction API de Google :
-----

-----

Ce fichier étant lui-même wrappé dans une smoothbox après.

un ex : http://devs.alp-assurances.com/plan-d-acces.html

L'avantage de ce fonctionnement est que si l'on se donne la peine d'aller lire la partie références de google map api, on peut faire ce qu'on veut de sa map.

Hello,

J'adore !!!
Je l'utilise sans problème, sauf dans un cas particulier.
En fait quand je travaille sur une page qui utilise la librairie JS LightBoxV2, j'ai un bug sur la GMLightBox. Au premier click, j'ai un fond blanc sans rien dedans. je click en dehors, ça se ferme normalement, je reclique sur le lien d'appel de la gmaplightbox, la carte s'affiche bien, mais pas de contour ni de bouton "fermer"...

Si je désacctive la LightboxV2, tout fonctionne à merveille... Une solution à cette incompatibilité ?
Salut et beau boulot!
par contre sais tu quel paramètres ajouter dans le .js pour afficher l'infobulle avec l'adresse?
Bonjour Mich,
Félicitations pour le gmlightbox, très bien réussit et fonctionne parfaitement !!

Cependant je souhaiterais, si possible, le paramétrer pour qu'il correspond tout à fait à mes besoins.. J'aimerais pouvoir supprimer les choses suivantes :
- le géorepère (le point de localisation rouge)
- les boutons "plan", "satellite" et "relief"

En fait, juste garder l'échelle, les flèches directionelles et le zoom.
Merci bien !
Bonjour Mich,
Félicitations pour le gmlightbox, très réussis et fonctionne parfaitement !!
Cepepdant, j'aimerais pouvoir le paramétrer pour qu'il s'adapte tout à fait à mes besoins. En fait, je souhaiterais enlever ceci :
- le point rouge (géorepère)
- et supprimer les boutons de selection "plan", "satellite" et "relief"

En fait, garder juste le zoom et les flèches de direction..
Merci d'avance !!
Yep, ça marche impec '
Merci pour le zip et les explications.
Beau boulot, m'sieur !
Laisser un commentaire
  • Nom *

  • Email *

  • Homepage

  • Commentaire *

  • * = champs requis


  • Je suis amnésique