Per chi non lo sapesse, i modi per richiamare google maps dalla propria applicazione web sono molteplici (fonte: http://code.google.com/intl/it/apis/maps/):
- Maps JavaScript API
- Static Maps API
- Maps API for Flash
- Web Services
- Google Earth API
Oggi cercheremo di rendere semplice (ed espandibile a piacimento) il richiamo di google maps usando javascript. L’intento è puramente pratico: codice e modo per utilizzarlo. Il codice l’ho scritto io ed è rilasciato con licenza creative commons (ossia, copiate pure gente…)
Ecco quello che faremo:
- definizione di una classe javascript per identificare una “bandierina” (MARKER) sulla mappa di Google
- definizione di una classe javascript per identificare una città (legata alla classe precedente in modo da avere n bandierine per ogni città)
- richiamo di google maps usando le nostre classi per produrre n bandierine per ogni città
Iniziamo.
La classe che troviamo qui sotto, rappresenta una bandierina (marker) su una mappa di Google maps.
/* Questa classe rappresenta un MARKER di GOOGLE */ var BandierinaGoogle = function(x, y, indirizzo) { this.posizioneX = x; this.posizioneY = y; this.indirizzo = indirizzo; this.getX = function() { return this.posizioneX; } this.getY = function() { return this.posizioneY; } this.getIndirizzo = function() { return this.indirizzo; } };
La classe che invece troviamo qui sotto rappresenta una città, il punto in cui centrare la mappa di tale città (centroX e centroY) e tutte le bandierine da mostrare in tale città (elencoBandierine).
/* Questa classe rappresenta tutti i MARKER di una CITTA' */ var Citta = function(citta, centroX, centroY, elencoBandierine) { this.elencoBandierine = new Array(); this.elencoBandierine = elencoBandierine; this.citta = citta; this.centroMappaX = centroX; this.centroMappaY = centroY; this.getCentroMappaX = function() { return this.centroMappaX; } this.getCentroMappaY = function() { return this.centroMappaY; } this.getCitta = function() { return this.citta; } this.getElencoBandierine = function() { return this.elencoBandierine; } };
Bene.
Ora creiamo tutte le bandierine per ogni città
var tutteLeBandierineTutteLeCitta = new Array(); // MARKER DI TAVIANO var elencoBandierine = new Array(); var bandierina = new BandierinaGoogle ('39.97995', '18.084759', 'Via Regiona Mrgherita, incrocio con Corso Vittorio Emanuele II'); elencoBandierine.push(bandierina); bandierina = new BandierinaGoogle ('39.985612', '18.088893', 'Via Acaia, 1'); elencoBandierine.push(bandierina); var fermateTaviano = new Citta ('Taviano', '39.982949', '18.085384', elencoBandierine); tutteLeBandierineTutteLeCitta.push(fermateTaviano); // MARKER DI LECCE elencoBandierine = new Array(); bandierina = new BandierinaGoogle ('40.346233', '18.165786', 'Stazione centrale'); elencoBandierine.push(bandierina); bandierina = new BandierinaGoogle ('40.326033', '18.149854', 'Via Lequile, cavalcavia ospedale'); elencoBandierine.push(bandierina); bandierina = new BandierinaGoogle ('40.347129', '18.161253', 'Via Lequile, incrocio con Piazzale Rudiae'); elencoBandierine.push(bandierina); bandierina = new BandierinaGoogle ('40.345579', '18.171322', 'Viale Marche, 9 (nei pressi della Questura)'); elencoBandierine.push(bandierina); bandierina = new BandierinaGoogle ('40.348081', '18.172824', 'Viale Otranto, 57 (Marcelline)'); elencoBandierine.push(bandierina); bandierina = new BandierinaGoogle ('40.346904', '18.184154', 'Viale Rossini, 76'); elencoBandierine.push(bandierina); bandierina = new BandierinaGoogle ('40.357909', '18.183489', 'Viale Japigia, 156 (Centrum)'); elencoBandierine.push(bandierina); bandierina = new BandierinaGoogle ('40.362812', '18.175236', 'Viale Ugo Foscolo, 23'); elencoBandierine.push(bandierina); var fermateLecce = new Citta ('Lecce', '40.346233', '18.165786', elencoBandierine); tutteLeBandierineTutteLeCitta.push(fermateLecce);
Bene. Abbiamo creato l’array tutteLeBandierineTutteLeCitta che contiene tutte le bandierine da mostrare in 2 citta: Taviano e Lecce.
Fino a questo momento però neanche l’ombra delle API di Google maps 😀
Rimediamo subito 🙂
Usiamo adesso il nostro array per disegnare le nostre mappe e le nostre bandierine.
Di seguito troviamo il codice che ci consentirà di collegare queste nostre classi a una mappa di Google.
var marker; var map; var latlng; var latlngCentro; var address; var z; function codeAddress(ele_name, citta) { element = ele_name; document.getElementById('testoTitoloMappa').innerHTML = 'Dettaglio delle bandierine nella città di '+citta; document.getElementById(element).style.display='block'; document.getElementById(element).style.top = y-200 +'px'; document.getElementById(element).style.left = x-100 +'px'; for (i=0; i<tutteLeBandierineTutteLeCitta.length; i++) { var nme = tutteLeBandierineTutteLeCitta[i]; if (nme.getCitta() == citta) { //alert (nme.getCitta() + ' ' + nme.getCentroMappaX() + ' ' + nme.getCentroMappaY()); latlngCentro = new google.maps.LatLng(nme.getCentroMappaX(), nme.getCentroMappaY()); } } if (citta=='Lecce') { z=13; } else { z=15; } var myOptions = { zoom: z, center: latlngCentro, mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); for (i=0; i<tutteLeBandierineTutteLeCitta.length; i++) { var nme = tutteLeBandierineTutteLeCitta[i]; if (nme.getCitta() == citta) { var elencoBandiere = new Array(); elencoBandiere = nme.getElencoBandierine(); for (j=0; j<elencoBandiere.length; j++) { var bandiera = elencoBandiere[j]; //alert (nme.getCitta() + ' ' + bandiera.getY() + ' ' + bandiera.getX() + ' ' + bandiera.getIndirizzo()); latlng = new google.maps.LatLng(bandiera.getX(), bandiera.getY()); marker = new google.maps.Marker({ position: latlng, map: map, title:bandiera.getIndirizzo() }); //alert (nme.getCitta() + ' ' + bandiera.getY() + ' ' + bandiera.getX() + ' ' + bandiera.getIndirizzo()); } } } }
Ora non ci resta che richiamare la funzione “codeAddress” dalla nostra pagina web 🙂
Poniamo attenzione alla riga 31 del precedente codice: la funzione disegna la mappa all’interno di un div che ha id =”map_canvas”. Senza tale oggetto non verrà disegnato nulla… Importanti sono anche le righe da 9 a 12 perché si riferiscono a oggetti html (‘testoTitoloMappa’) e a coordinate (x e y) che dovremo calcolare nel caso in cui volessimo posizionare il div “map_canvas” una una parte specifica della nostra pagina. Naturalmente se il nostro div è sempre visibile e se non dobbiamo modificare nulla, possiamo eliminare quelle righe…
Fatto tutto questo dobbiamo anche inserire nella <head> della nostra pagina la seguente riga di codice, senza la quale tutto il nostro lavoro sarebbe completamente inutile
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
Sarebbe sicuramente un utile esercizio migliorare questo codice, consentendo ad esempio di inserire lo zoom con cui disegnare la mappa all’interno della classe Citta…
Ciao e gran bell’esempio!
Giusto ieri avevo pensato di vedere le classi javascript e portare alle gmaps 3 uno script fatto tempo fa con la versione 2. Grazie per la base da cui partire e dell’ispirazione
Marco