In Adobe Flash è possibile utilizzare un vasto assortimento di Web API esterne fornite da servizi come Facebook, Twitter o Flickr. In questo tutorial vedremo come integrare, in modo davvero semplice, i servizi di Google Maps in un filmato/applicazione Adobe Flash CS4. Premetto che il procedimento per poter utilizzare Google Maps in Flash è molto simile a quello che accade in HTML/Javascript (vedi per dettagli Come inserire Google Map nel proprio Web).
Download ed installazione delle SDK
Per prima cosa memorizziamo nei bookmark del nostro browser l’indirizzo del sito Google Maps API per Flash. Su questo sito troviamo tutto ciò che ci server per utilizzare le API di Google. Sulla destra della pagina è possibile accedere ad una serie di risorse, tra cui il link per scaricare le SDK da usare in Flash. Salvate lo ZIP sulla vostra scrivania (o Desktop) e scompattatelo. Nella cartella sdk/lib troverete un file chiamato map_1_16.swc. Copiate questo file nella clipboard (Command-C per Mac o Ctrl-C per PC) e posizionatelo all’interno di questo percorso:
1 2 3 4 5 | // Mac [cartella utente]/Library/Application Support/Adobe/Flash CS4/language/Configuration/Components // Windows [cartella utente]\Local Settings\Application Data\Adobe\Flash CS4\language\Configuration\Components |
Se la cartella Components non esiste già, createla e in questa create una cartella Google e incollate il file map_1_16.swc. Se per caso avevate già aperto Flash (frettolosi…), chiudetelo e rapritelo, in modo che possa ricaricare il componente appena installato.
Creiamo il filmato Flash
A questo punto apriamo Flash e creiamo un nuovo filmato. Aprite la finestra Componenti e dovreste trovare Google Maps:

Selezionate il componente GoogleMapsLibrary e trascinatelo nello stage. Nel primo frame del nostro filmato inserite il seguente semplice codice:
1 2 3 4 5 6 7 8 9 10 11 12 | // Importo le classi Google Maps import com.google.maps.*; import com.google.maps.overlays.*; import com.google.maps.controls.*; var map:Map = new Map(); map.key = "API_KEY"; // vedi sotto per ottenere una tua chiave // In questo esempio imposto la dimensione della Mappa Google della // stessa grandezza del filmato. In alternativa potete inserire le // dimensioni che preferite. map.setSize( new Point(stage.stageWidth, stage.stageHeight)); addChild(map); |
Nella riga 7 dovete sostituire la stringa API_KEY con la chiave di attivazione che fornisce Google. Per ottenerla basta tornare sul sito Google Maps API for Flash e richiedere una API Key cliccando su Sign up for a Google Maps API Key. Quando vi verrà chiesto di inserire l’url del sito sul quale volete utilizzare il filmato Flash che accede alle API di Google, nel caso non lo sapete ancora o voletete semplicemente provare il filmato in locale, inserite http://localost e cliccate su Generate API Key:

A questo punto possiamo già provare il filmato, ottenendo:

Aggiungiamo qualche controllo
Per prima cosa aggiungiamo i classici controlli di Posizione, Zoom e Tipo Mappa. Per fare questo dobbiamo essere sicuri che la mappa sia pronta all’uso. Basta quindi creare un listener sull’evento MapEvent.MAP_READY. Aggiungiamo quindi le seguenti righe di codice:
1 2 3 4 5 6 7 8 | // Aggiungiamo i controlli map.addEventListener( MapEvent.MAP_READY, onMapReady ); function onMapReady(e:MapEvent):void { map.addControl( new PositionControl() ); map.addControl( new ZoomControl() ); map.addControl( new MapTypeControl() ); } |
Impostiamo un indirizzo
A questo punto possiamo impostare la mappa in modo che visualizzi un indirizzo specifico, come la sede della mia società Saidmade a Modena – o qualsiasi altro indirizzo che preferite.
Suggerimento: per trovare le coordinate del nostro indirizzo, ovvero Latitudine e Longitudine, possiamo usare questo semplice e utile hack. Aprire il sito di Google Maps. Una volta sulla mappa cercate l’indirizzo che desiderate (ad esempio Via Cortese 10, Modena). Quando l’indirizzo è visualizzato sulla mappa, inserite questa riga nella barra indirizzi del browser:
1 | javascript:void(prompt('',gApplication.getMap().getCenter())); |
Si aprirà una finestra pop-up con le coordinate utilizzabile nel codice:

Torniamo ad ActionScript e aggiungiamo le seguenti righe di codice nella funzione onMapReady():
1 2 | // centro la mappa su una specifica località map.setCenter( new LatLng( 44.639828, 10.941795), 18, MapType.SATELLITE_MAP_TYPE ); |
Eseguiamo il filmato:

Aggiungiamo un Marker
Sempre all’interno della funzione onMapReady() aggiungiamo le seguenti righe di codice:
1 2 3 | // aggiungiamo il default marker var m:Marker = new Marker( new LatLng( 44.639828, 10.941795) ); map.addOverlay(m); |

I Marker possono essere personalizzati a piacimento, sia tramite gli stili fornite dalle API stesse di Google, sia tramite Flash. Ad esempio aggiungendo questa import all’inizio del codice:
1 | import com.google.maps.styles.*; |
e sostituiendo il codice di creazione Marker visto prima con:
1 2 3 4 5 6 7 8 9 10 | // aggiungiamo il default marker var m:Marker = new Marker( new LatLng(44.639828, 10.941795), new MarkerOptions({ strokeStyle: new StrokeStyle({color: 0x987654}), fillStyle: new FillStyle({color: 0x223344, alpha: 0.8}), radius: 12, hasShadow: true })); map.addOverlay(m); |
otteniamo il seguento effetto:

In alternativa è possibile associare direttamente un MovieClip come Marker. Essendo un MovieClip, ovviamente, esso potrà contenere animazioni, video o qualsiasi altro tipo di contenuto interattivo supportato in Flash. Inoltre è possibile disegnare linee e forme così da creare delle mappe interattive e ricche di contenuti multimediali.
Per aggiungere un MovieClip e sufficiente crearlo, usando ad esempio un’immagine o un’animazione Flash, e impostare le sue proprietà in questo modo:

Fatto questo modificate il codice di creazione Marker in:
1 2 3 4 | // aggiungiamo il default marker var m:Marker = new Marker( new LatLng(44.639828, 10.941795), new MarkerOptions( {icon: new myMarkerMovieClip() } ) ); map.addOverlay(m); |

Tutte le informazioni sulle API, le classi, metodi, eventi e proprietà sono disponibili su Google Maps API ActionScript Reference.
Inoltre l’intero pacchetto è stato recentemente aggiornato con molte novità interessanti, come le Mappe 3D.








7
[...] Aggiornamento: vedi Come usare Google Maps in Adobe Flash CS4 [...]
Ottimo tutorial, anche se preferisco usarle in Flex
@Napolux: immaginavo
– visto che carino il trick (javascript) per ottenere “al volo” Lat e Lang da Google Maps ?!
wonderful!!
…mah…per personalizzare la mappa ad esempio 600*600 a x 200 e y 250 in as3 come li devo gestire!?
Sono alle prime righe con as3.
Tnks for all!!
è possibile memorizzare la key e le coordinate scrivendole su file xml esterno e quindi leggerle e poi inviarle nel punto
map.key = "API_KEY";potreste dirmi come fare ??
Grazie.
@Devis: se il file XML è presente su un server puoi sicuramente leggerlo, ma non scriverlo direttamente. Per sapere come vedi Flash CS3: comunicazione con un Web Server
Funziona solo con Flash CS4?
Ho provato con il CS3 ma mi esce la scritta:
2
swf location, version and network availability."
@Massimo:
No, può essere utilizzato anche con Adobe Flash CS3. Vedi qui per dettagli
ciao, ti ringrazio per il tutorial è molto utile.
Una cosa che non capisco, quando utilizzi un marker, com’è possibile fare in modo che appaia la nuvoletta bianca di google con le varie informazioni sull’inidirizzo sopra di esso, come accade normalmente cliccando sul marker in google maps?
@nuovobuio: per farlo devi utilizzare il metodo:
map.openInfoWindow(), ad esempio:Dove è
optionsusa, ad esempio:2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var titleFormat:TextFormat = new TextFormat();
titleFormat.bold = true;
var titleStyleSheet:StyleSheet = new StyleSheet();
var h1:Object = {
color: "#FFFF80",
fontWeight: "bold" };
titleStyleSheet.setStyle("h1", h1);
var contentStyleSheet:StyleSheet = new StyleSheet();
var body:Object = {
color: "#FF0080",
fontStyle: "italic" };
contentStyleSheet.setStyle("body", body);
var contentFormat:TextFormat = new TextFormat("Arial", 10);
var options:InfoWindowOptions = new InfoWindowOptions({
strokeStyle: {
color: 0x987654
},
fillStyle: {
color: 0xffffff,
alpha: 0.8
},
titleFormat: titleFormat,
titleStyleSheet: titleStyleSheet,
contentFormat: contentFormat,
title: "Mio titolo",
content: "Ciao come va?",
contentStyleSheet: contentStyleSheet,
width: 200,
cornerRadius: 12,
padding: 10,
hasCloseButton: true,
hasTail: true,
tailWidth: 20,
tailHeight: 30,
tailOffset: -12,
tailAlign: InfoWindowOptions.ALIGN_LEFT,
pointOffset: new Point(3, 8),
hasShadow: true
});
Ciao, gentilissimo. Ti chiedo ancora una cosa che non mi è chiara sto provando ad adattare l’aliasing del testo a mio piacimento, con il classico:
ma non capisco dove metterlo.
Il testo appare sempre sgranato, non trovo il
texFielda cui applicare l’aliasing, dov’è??? Non lo vedo??@nuovobuio: il fatto che tu non trovi il
textFieldprobabilmente significa che l’hai inserito direttamente nello stage. Per impostare il tipo di AntiAlias ricordati, comunque, che devi incorporare i caratteri, altrimenti non ti funzionerà. Se il TextField è presente nello stage puoi impostare il tipo di AntiAlias selezionando il TextField (forse intendevi Label o TextInput) e modificando i parametri nella finestra/pannello proprietà.Se invece vuoi operare da codice, il TextField deve avere un’identificativo, cioè un nome univoco che permetta al codice di referenziarlo. Per impostare il nome dell’istanza (tipo “miotextfield”) puoi operare sempre dallo stage: seleziona il componente e nella finestra/pannello proprietà in “nome istanza” inserisci “miotextfield”. Se hai difficoltà inviami il codice.
scusami, non sono stato chiaro io, intendevo l’aliasing del testo della nuvoletta di google map, il title e il content del codice che mi hai precedentemente postato, non riesco ad impostargli l’aliasing, il testo mi appare sempre “rovinato”.
Dove trovi le varie opzioni da impostare per google map? Sono tutte qui o ce ne sono altre tipo lo spessore della linea di perimetro della nuvola ecc ?
Scusami, è la prima volta che provo le mappe in flash..
ho fatto una domanda troppo scema?
@nuovobuio:
no, tranquillo… comunque devi guardare nella documentazione Google. Solo se le API di Google lo permettono puoi impostare l’aliasing. Quelli non sono oggetti Flash direttamente indirizzabili. Ergo, se Google non lo supporta non lo puoi impostare
spiacente
niente.. non va
ho seguito alla lettera il tutorial, inserita la mappa in libreria, e messa su schermo tramite
addChild()da libreria:2
mcSezione3.addChild(mioOggetto);
funziona solo in locale, se lo provo in linea, mi dice:
2
swf location, version and network availability.
Ho anche inserito l’url del sito per ricevere la chiave, ma nulla, in rete non vuole funzionare, in locale invece funziona benissimo.. è in as3 con cs4.. mi aiuti a risolvere?
Ciao, seguito il tutorial e tutto perfetto.
Una cosa volevo chidere, per le grandezze fisse della mappa, esattamente cosa devo scrivere nel codice al posto di:
2
addChild(map);
Grazie e ciao!
@Marco: nell’esempio la mappa viene impostata in modo tale da avere le medesime dimensioni dell’intero filmato:
stage.stageWidth, stage.stageHeight. Quindi, in base alle dimensioni del tuo filmato puoi inserire i valori che ritieni più opportuni, ad esempio:2
addChild(map);
@Giovambattista Fazioli:
Perfetto, grazie mille, funziona.
Ho notato una cosa, non sò se sia normale però.
La mappa è all’interno di un sito in flash, diviso in sezioni, tutte nello stesso swf.
praticamente quando vado in un’altra pagina-sezione e poi ritorno alla pagina-mappa, questa mi compare con il mondo intero e senza più i controlli. Non sò il perchè, alla prima botta va e poi se ci ritorni non và più.
grazie. Marco.
Ciao, ho lo stesso identico problema di Marco..funziona la prima volta, poi quando ci ritorno spariscono controlli e località stabilita.Qualcuno sa a cosa è dovuto?
grazie
@Marco2: sembrerebbe un problema legato alla cache del browser che si riflette sul filmato. probabilmente dipende da come è scritto il codice in quanto funzionando la prima volta il difetto è dovuto al “reload” della pagina. Quindi il filmato non viene ricaricato correttamente al “back” del browser. Proverei a forzare in qualche modo un refresh…
Ciao, ho risolto scrivendo il seguente codice, una fusione da quello di goole ufficiale e quello di giovanbattista:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import com.google.maps.styles.*;
import com.google.maps.LatLng;
import com.google.maps.Map;
import com.google.maps.MapEvent;
import com.google.maps.MapType;
import com.google.maps.controls.*;
import com.google.maps.overlays.*;
var map:Map = new Map();
map.key = "...";
map.setSize(new Point(700, 500));
map.addEventListener(MapEvent.MAP_READY, onMapReady);
this.addChild(map);
map.addEventListener( MapEvent.MAP_READY, onMapReady );
function onMapReady(e:MapEvent):void {
map.addControl( new PositionControl() );
map.addControl( new ZoomControl() );
map.addControl( new MapTypeControl() );
map.setCenter(new LatLng(xxx, xxx), 10, MapType.NORMAL_MAP_TYPE);
var m:Marker = new Marker(
new LatLng(xxx, xxx),
new MarkerOptions({
strokeStyle: new StrokeStyle({color: 0xFF6532}),
fillStyle: new FillStyle({color: 0xFF9865, alpha: 1.0}),
radius: 12,
hasShadow: true})
);
map.addOverlay(m);
}
Ragazzi ma se io devo inserirlo in un aito web cme devo farE? Io faccio pubblica in html ma mi esce un riquadro grigio e basta mentre in swf va benissimo come mai ?
@giuseppe:
Devi mettere anche il codice nel tag HTML, L’api Key.
Cioè faccio map.key = e poi ci metto tutta quella stringa http://…….?
non riesco a farlo…. ma dove metto tutto quel codice html con la key?
Ciao a tutti,
se volessi utilizzare parte dello stage per la mappa e la parte restante per dei menù
sarebbe possibile caricare la mappa in un movieclip di area definita anzicchè su tutto lo stage? Come potrei indicare a flash di caricare la mappa nell’area definita dal simbolo creato?
grazie
Ciao,
complimenti per il tutorial, mi è stato veramente utile. Ho una domanda da farti( non sono tanto esperto di AS3): come faccio a spostare l’oggetto map sullo stage?
Grazie
@Lorenzo: puoi spostarlo semplicemente agendo sullo stage, muovendolo e ridimensionandolo con il mouse. Se invece vuoi farlo da codice puoi utilizzare le proprietà
xeydell’oggetto, tipo:2
map.y = 50;
Ciao Mi chiamo Patrizio,
Il tuo tutorial mi è stato utilissimo solo che adesso mi trovo davanti ad un piccolo problemino…
Se esporto il filmato e lo testo in locale su Localhost mi carica correttamente la mappa invece lo lo hosto su un dominio di aruba mi da quest’errore:
2
swf location, version and network availability.
il codice html della pagina che guardando sulle guide di Google è questo:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="dovesiamo.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<param name="flashVars" value="key=ABQIAAAAA8CizyunDAeEXoQIb62lchT1OkJTPzIYI04p2bE9wlnkO_DE3RQZuRn-y9-4ljmnryrjNPH9EU48Eg">
<embed src="dovesiamo.swf"
quality="high"
bgcolor="#ffffff"
width="1002"
height="517"
name="dovesiamo"
align="middle"
allowScriptAccess="sameDomain"
allowFullScreen="false"
type="application/x-shockwave-flash"
flashVars="key=ABQIAAAAA8CizyunDAeEXoQIb62lchT1OkJTPzIYI04p2bE9wlnkO_DE3RQZuRn-y9-4ljmnryrjNPH9EU48Eg"
pluginspage="http://www.macromedia.com/go/getflashplayer"
/>
</object>
mentre il mio codice AS3 è il seguente:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import com.google.maps.*;
import com.google.maps.styles.*;
import com.google.maps.LatLng;
import com.google.maps.Map;
import com.google.maps.MapEvent;
import com.google.maps.MapType;
import com.google.maps.controls.*;
import com.google.maps.overlays.*;
var map:Map = new Map();
map.key="ABQIAAAAA8CizyunDAeEXoQIb62lchT1OkJTPzIYI04p2bE9wlnkO_DE3RQZuRn-y9-4ljmnryrjNPH9EU48Eg";
// In questo esempio imposto la dimensione della Mappa Google della
// stessa grandezza del filmato. In alternativa potete inserire le
// dimensioni che preferite.
map.setSize( new Point(600,400));
addChild(map);
map.x=20;
map.y=20;
// Aggiungiamo i controlli
map.addEventListener( MapEvent.MAP_READY, onMapReady );
function onMapReady(e:MapEvent):void {
// centro la mappa su una specifica località
map.setCenter( new LatLng(41.887185,12.562806),18, MapType.SATELLITE_MAP_TYPE );
// aggiungiamo il default marker
//var m:Marker=new Marker(new LatLng(41.887185,12.562806));
var m:Marker = new Marker( new LatLng(41.887185,12.562806),
new MarkerOptions( {icon: new myMarkerMovieClip() } ) );
map.addOverlay(m);
map.addControl( new PositionControl() );
map.addControl( new ZoomControl() );
map.addControl( new MapTypeControl() );
}
@Patrizio: Se ti funziona localmente ma non sul sito di esercizio, il problema potrebbe essere, come da te indicato, relativo alla API key. La API key è legata al dominio di esercizio della mappa, quindi per ogni dominio (come
localhost) ne devi generare una nuova. In pratica devi generare una nuova API key per il tuo dominio di esercizio e sostituila a quella utilizzata inlocalhost.Grazie Giova…ora funziona non avevo capito che per ogni dominio dovevo generare un API…cmq meglio tardi che mai…Però ora ne ho un’altro di problema…fatto questo credo di aver finito…
Hai presente la barra in altro dove puoi cambiare la modalità di visualizzazione della mappa, ossia ad esempio dove puoi passare da mappa satellitare a ibrida a etc etc????
La barra la visualizzo e se ci clicco sopra funziona tutto correttamente ma i nomi sui bottoni non ci sono quindi non posso dare un rifermento del bottone agli utenti…
se mi risolvi questa cosa mi fai un ENOOOOOORME piacere… XD
Grazie comunque del tempo che mi dedichi…
Patrizio
@Patrizio: cosa intendi dire esattamente con:
Non ti appare la label? Cioè il bottone è solo un rettangolo grigio vuoto? Perchè se è così è un qualche baco di Adobe Flash… o ho capito male?
@Giovambattista Fazioli: No Giova hai capito bene…la label è una barra grigia senza nessuna scritta ma a funzionare funziona…boh…please help me!?!?!?
@Patrizio: allora c’è un problema che prescinde il codice. Come vedi dalle immagini presentate in questo articolo le “label” dei pulsanti aggiunti con
map.addControl( new MapTypeControl() );si vedono e, tra l’altro, è difficile commettere errore di codice su una riga così semplice. Ergo, qualcosa non va a livello più basso, vedi versioni di Player Flash installate sul browser, ad esempio.Per caso hai un’indirizzo Web visibile a tutti dove è possibile visualizzare la mappa in questione? Caso mai è un problema “tuo” locale, ed io la vedo bene?! Il che sarebbe già un passo avanti…
@Giovambattista Fazioli: si l’indirizzo è questo http://www.daynightclub.it/prove2/dovesiamo.html
aspetta il link non funziona…adesso lo carico da un’altra parte e ti dico…
@Giovambattista Fazioli: Ecco il dominio che funziona… http://www.regalaunfiore.it/prova/dovesiamo.html
@Patrizio: forse ho capito. Tu hai usato per caso una “maschera” – per fare i bordi arrotondati alla mappa! Se è così prova a toglierla!
Anche a me era capitatala la stessa cosa, eppure maschere non ne avevo usate.
Ho tolto i label e basta.
@Giovambattista Fazioli: Si giova ho usato la maschera ma a me serve coprire un pò gli angoli perchè non mi piace la mappa così squadrata come posso risolvere????
@Patrizio: se eliminando la maschera il difetto continua (come indicato da Marco più sopra), prova ad inviarmi il sorgente, chissà… potrei avere un’illuminazione
Ciao Giovan, ti invio un mio fla per il problema del label,il link da cui puoi scaricarlo è questo:
http://www.valledelrieslingoltrepo.it/dovesiamo.fla
E’ stato fatto con Fl cs5, spero tu riesca ad aprirlo.
Non riesco a capire dove sia il problema.
Lascia stare il resto, le immagini e tutto viene caricato da un xml esterno che devo fare.
grazie.
Come ho indicato a Marco, provate a rifare tutto con il CS4, il problema potrebbe essere in qualche incompatibilità tra il nuovo CS5 e il componente fornito da Google. Dopotutto questo post è stato realizzato con la suite CS4. Fatemi sapere, al limite apriamo una issue a Google/Adobe
Forse il problema è la cs5, io adesso non ho più la cs4, questo problema c’era anche nella cs4, io la cs5 l’ho installata 1 mese fà c.a. e il problema era gia da qualche mese prima, quando ho fatto il sito.
Qui ad esempio ho usato la cs5 è il problema non c’è.
Entra nel sito e clicca su “dove siamo” tutto funziona.
http://www.marchesidimontalto.it/marchesi_di_montalto.html
Non sò, magari è proprio un bug.
Ciao.
@Marco: curioso! Se Flash è lo stesso, e anche il codice all’interno, forse il problema potrebbe risiedere nel Markup della pagina, tipo: l’encoding o il DOCTYPE, oppure nella dichiarazione
<object>/<embed>ad esempio…Faccio i complimenti a Giovambattista per tutorial, fatto davvero bene…
Grazie!
Ciao a tutti,
purtroppo Google non permette più l’utilizzo delle API per flash, ma ne permette l’utilizzo solo con componenti java…possibile?
Non esistono altri modi per integrare le mappe?
Ottimo Tutorial !
Avrei un paio di cose da chiederti.
1)come è possibile inserire diversi marker in una stessa mappa ?
2)è possibile fare in modo che passando con il mouse su un marker appaiano le info relative a quel punto sulla mappa ?
grazie