L'API Maps JavaScript v2 non è più disponibile a partire dal 26 maggio 2021. Di conseguenza, le mappe v2 del tuo sito smetteranno di funzionare e restituiranno errori JavaScript. Per continuare a utilizzare le mappe sul tuo sito, esegui la migrazione all'API Maps JavaScript v3. Questa guida ti aiuterà a svolgere
la procedura.
Panoramica
Ogni applicazione avrà un processo di migrazione leggermente diverso; tuttavia, esistono alcuni passaggi comuni a tutti i progetti:
- Procurati una nuova chiave. L'API Maps JavaScript ora utilizza la console Google Cloud per gestire le chiavi. Se utilizzi ancora una chiave v2, assicurati di ottenere la nuova chiave API prima di iniziare la migrazione.
- Aggiorna il bootstrap dell'API. La maggior parte delle applicazioni caricherà l'API Maps JavaScript v3 con il seguente codice:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
- Aggiorna il codice. La quantità di modifiche necessarie dipenderà molto dalla tua applicazione. Le modifiche più comuni includono:
- Fai sempre riferimento allo spazio dei nomi google.maps. Nella versione v3, tutto il codice dell'API Maps JavaScript viene archiviato nello spazio dei nomi
google.maps.*
anziché nello spazio dei nomi globale. Nell'ambito di questo processo, anche la maggior parte degli oggetti è stata rinominata. Ad esempio, anziché GMap2
, ora caricherai google.maps.Map
.
- Rimuovi qualsiasi riferimento a metodi obsoleti. È stato rimosso un certo numero di metodi di utilità per uso generico, come
GDownloadURL
e GLog
.
Sostituisci questa funzionalità con librerie di utilità di terze parti
o rimuovi questi riferimenti dal codice.
- (Facoltativo) Aggiungi librerie al codice. Molte funzionalità sono state esternalizzate in librerie di utilità in modo che ogni app debba caricare solo le parti dell'API che verranno utilizzate.
- (Facoltativo) Configura il progetto per l'utilizzo della versione v3 esterna.
Le estensioni v3 extern possono essere utilizzate per aiutarti a convalidare il codice con il
Closure Compiler o per attivare il completamento automatico nel tuo IDE.
Scopri di più sulle
compilation ed esterne avanzate.
- Testa e ottimizza. A questo punto avrai ancora del lavoro da fare, ma la buona notizia è che sarai a buon punto nella tua nuova applicazione per le mappe v3.
Modifiche nella V3 dell'API Maps JavaScript
Prima di pianificare la migrazione, dovresti comprendere le differenze tra l'API Maps JavaScript v2 e l'API Maps JavaScript v3. La versione più recente dell'API Maps JavaScript è stata interamente scritta, con particolare attenzione alle tecniche di programmazione JavaScript moderne, al maggiore utilizzo delle librerie e a un'API semplificata.
Molte nuove funzionalità sono state aggiunte all'API e diverse funzionalità familiari sono state modificate o addirittura rimosse. Questa sezione evidenzia alcune delle principali differenze tra le due release.
Ecco alcune delle modifiche apportate all'API v3:
- Una libreria di base semplificata. Molte funzioni supplementari sono state spostate in librerie, contribuendo a ridurre i tempi di caricamento e analisi dell'API Core, che consente il caricamento rapido della mappa su qualsiasi dispositivo.
- Sono state migliorate le prestazioni di diverse funzionalità, come il rendering dei poligoni e il posizionamento degli indicatori.
- Un nuovo approccio ai limiti di utilizzo lato client per supportare meglio gli indirizzi condivisi utilizzati dai proxy mobili e dai firewall aziendali.
- Aggiunto il supporto per diversi browser
moderni e per dispositivi mobili. Internet Explorer 6 è stato rimosso.
- Sono state rimosse molte delle classi helper per uso generico (
GLog
o
GDownloadUrl
). Attualmente esistono molte librerie JavaScript eccellenti che forniscono funzionalità simili, ad esempio Closure o jQuery.
- Un'implementazione Street View HTML5 che può essere caricata su qualsiasi dispositivo mobile.
- Panoramiche Street View personalizzate con le tue foto, per condividere
panoramiche di piste da sci, case in vendita o altri luoghi interessanti.
- Personalizzazioni di Mappe con stili che ti consentono di modificare la visualizzazione degli elementi sulla mappa base per adattarla al tuo stile visivo unico.
- Supporto per diversi nuovi servizi, come
ElevationService
e Distance
Matrix.
- I servizi di indicazioni stradali migliorati forniscono percorsi alternativi,
ottimizzazione dei percorsi (soluzioni approssimative al
problema con i venditori in viaggio), indicazioni per biciclette (con
livello per le biciclette), indicazioni con il trasporto pubblico e
indicazioni trascinabili.
- Un formato Geocoding aggiornato che fornisce informazioni sul
tipo
più accurate rispetto al valore
accuracy
dell'API Geocoding v2.
- Supporto di più
finestre informative su una singola mappa
Upgrade dell'applicazione
La tua nuova chiave
La versione 3 dell'API Maps JavaScript utilizza un nuovo sistema di chiavi a partire dalla versione 2. È possibile che tu stia già utilizzando una chiave v3 con la tua applicazione, nel qual caso non sono necessarie modifiche. Per verificare, controlla l'URL da cui carichi l'API Maps JavaScript per individuare il parametro key
. Se il valore della chiave inizia con "ABQIAA", stai utilizzando una chiave v2. Se hai una chiave v2, devi eseguire l'upgrade a una chiave v3 nell'ambito della migrazione, che:
La chiave viene passata durante il caricamento dell'API Maps JavaScript v3.
Scopri di più sulla generazione di chiavi API.
Tieni presente che se sei un cliente delle API di Google Maps for Work, potresti utilizzare un ID client con il parametro client
anziché il parametro key
. Gli ID client sono ancora supportati nell'API Maps JavaScript v3 e non devono essere sottoposti al processo di upgrade delle chiavi.
Caricamento dell'API in corso
La prima modifica da apportare al codice riguarda il modo in cui carichi l'API. Nella versione 2, l'API Maps JavaScript viene caricata tramite una richiesta a http://maps.google.com/maps
. Se stai caricando
l'API Maps JavaScript v3, dovrai apportare le seguenti
modifiche:
- Carica l'API da
//maps.googleapis.com/maps/api/js
- Rimuovi il parametro
file
.
- Aggiorna il parametro
key
con la nuova chiave v3. I clienti delle API di Google Maps for Work devono utilizzare un
parametro client
.
- (Solo piano premium di Google Maps Platform) Assicurati che il parametro
client
venga fornito come spiegato nella
Guida per gli sviluppatori del piano premium di Google Maps Platform.
- Rimuovi il parametro
v
per richiedere la
versione più recente rilasciata o modificane il valore in base allo schema
controllo delle versioni v3.
- (Facoltativo) Sostituisci il parametro
hl
con
language
e conserva il valore.
- (Facoltativo) Aggiungi un parametro
libraries
per
caricare le librerie facoltative.
Nel caso più semplice, il bootstrap v3 specifica solo il parametro chiave API:
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
L'esempio seguente richiede la versione più recente dell'API Maps JavaScript v2 in tedesco:
<script src="//maps.google.com/maps?file=api&v=2.x&key=YOUR_API_KEY&hl=de"></script>
L'esempio seguente è una richiesta equivalente per la versione 3.
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&language=de"></script>
Introduzione allo spazio dei nomi google.maps
Probabilmente il cambiamento più notevole nell'API Maps JavaScript v3 è l'introduzione dello spazio dei nomi google.maps
. Per impostazione predefinita, l'API v2 inserisce tutti gli oggetti nello spazio dei nomi globale, il che può causare conflitti di denominazione. Nella versione v3, tutti gli oggetti si trovano all'interno dello spazio dei nomi google.maps
.
Quando esegui la migrazione della tua applicazione alla versione v3, devi modificare il codice per utilizzare il nuovo spazio dei nomi. Purtroppo, la ricerca di "G" e la sostituzione con "google.maps" non funzionano completamente, ma è una buona regola generale da applicare durante la revisione del codice. Di seguito sono riportati alcuni esempi delle classi equivalenti in v2 e v3.
v2 |
v3 |
GMap2 |
google.maps.Map |
GLatLng |
google.maps.LatLng |
GInfoWindow |
google.maps.InfoWindow |
GMapOptions |
google.map.MapOptions |
G_API_VERSION |
google.maps.version |
GPolyStyleOptions |
google.maps.PolygonOptions or
google.maps.PolylineOptions |
Rimozione del codice obsoleto in corso...
L'API Maps JavaScript v3 presenta paralleli per la maggior parte delle
funzionalità della versione v2; tuttavia, alcune classi non sono più supportate. Nell'ambito della migrazione, devi sostituire queste classi con librerie di utilità di terze parti o rimuovere questi riferimenti dal codice. Esistono molte librerie JavaScript eccellenti che forniscono funzionalità simili, come Closure o jQuery.
Le seguenti classi non hanno parallelo nella versione 3 dell'API Maps JavaScript:
GBounds | GLanguage |
GBrowserIsCompatible | GLayer |
GControl | GLog |
GControlAnchor | GMercatorProjection |
GControlImpl | GNavLabelControl |
GControlPosition | GObliqueMercator |
GCopyright | GOverlay |
GCopyrightCollection | GPhotoSpec |
GDownloadUrl | GPolyEditingOptions |
GDraggableObject | GScreenOverlay |
GDraggableObjectOptions | GStreetviewFeatures |
GFactualGeocodeCache | GStreetviewLocation |
GGeoAddressAccuracy | GStreetviewOverlay |
GGeocodeCache | GStreetviewUserPhotosOptions |
GGoogleBar | GTileLayerOptions |
GGoogleBarAdsOptions | GTileLayerOverlayOptions |
GGoogleBarLinkTarget | GTrafficOverlayOptions |
GGoogleBarListingTypes | GUnload |
GGoogleBarOptions | GXml |
GGoogleBarResultList | GXmlHttp |
GInfoWindowTab | GXslt |
GKeyboardHandler |
|
Confronto tra codice
Confrontiamo due applicazioni, piuttosto semplici, scritte con l'API v2 e v3.
<!DOCTYPE html>
<html>
<head>
<script src="//maps.google.com/maps?file=api&v=2&key=YOUR_API_KEY"></script>
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
<script>
function initialize() {
if (GBrowserIsCompatible()) {
var map = new GMap2(
document.getElementById('map'));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
map.setUIToDefault();
map.addOverlay(new GMarker(new GLatLng(37.4419, -122.1419)));
}
}
</script>
</head>
<body onload="initialize()" onunload="GUnload()">
<div id="map"></div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
<script>
function initialize() {
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(37.4419, -122.1419),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: new google.maps.LatLng(37.4419, -122.1419),
map: map
});
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>
Come puoi vedere, ci sono diverse differenze tra le due applicazioni. Le modifiche più importanti includono:
- L'indirizzo da cui viene caricata l'API è cambiato.
- I metodi
GBrowserIsCompatible()
e GUnload()
non sono più obbligatori nella versione 3 e sono stati rimossi
dall'API.
- L'oggetto
GMap2
viene sostituito da
google.maps.Map
come oggetto centrale nell'API.
- Le proprietà vengono ora caricate tramite le classi delle opzioni. Nell'esempio precedente, abbiamo impostato le tre proprietà necessarie per caricare una mappa:
center
, zoom
e mapTypeId
, tramite un oggetto MapOptions
incorporato.
- L'interfaccia utente predefinita è attiva per impostazione predefinita nella versione 3. Puoi disabilitarla
impostando la proprietà
disableDefaultUI
su true nell'oggetto
MapOptions
.
Riepilogo
A questo punto avrai un'idea di alcuni dei punti chiave coinvolti nella migrazione dalla v2 alla v3 dell'API Maps JavaScript.
Potresti dover conoscere ulteriori informazioni, ma dipenderanno dalla tua applicazione. Nelle sezioni seguenti abbiamo incluso le istruzioni per la migrazione dei casi specifici che potresti riscontrare. Inoltre, esistono diverse risorse che potrebbero esserti utili durante il processo di upgrade.
In caso di problemi o domande su questo articolo, utilizza il link INVIA FEEDBACK nella parte superiore di questa pagina.
Questa sezione fornisce un confronto dettagliato delle funzionalità più usate delle versioni 2 e 3 dell'API Maps JavaScript. Ogni sezione del riferimento è progettata per essere letta singolarmente. Ti consigliamo di non leggere questo riferimento interamente, ma di utilizzare questo materiale per facilitare la migrazione caso per caso.
- Eventi: registrazione e gestione degli eventi.
- Controlli: manipolazione dei controlli di navigazione visualizzati sulla mappa.
- Sovrapposizioni: aggiunta e modifica di oggetti sulla mappa.
- Tipi di mappa: i riquadri che compongono la mappa base.
- Livelli: aggiunta e modifica di contenuti come gruppo, ad esempio i livelli KML o Traffico.
- Servizi: con la geocodifica, le indicazioni stradali o i servizi di Street View di Google.
Eventi
Il modello di eventi per l'API Maps JavaScript v3 è simile a quello utilizzato nella versione 2, anche se molto è cambiato.
Nuovo evento per il supporto MVC
L'API v3 aggiunge un nuovo tipo di evento per riflettere le modifiche dello stato della MVC. Ora ci sono due tipi di eventi:
- Gli eventi utente (come gli eventi di clic) vengono propagati dal DOM all'API Maps JavaScript. Questi eventi sono separati e distinti dagli eventi DOM standard.
- Le notifiche di modifica dello stato MVC riflettono le modifiche negli oggetti dell'API di Google Maps
e vengono denominate utilizzando una convenzione
property_changed
.
Ogni oggetto dell'API di Google Maps esporta una serie di eventi denominati. Le applicazioni interessate a eventi specifici devono registrare i listener di eventi per questi eventi ed eseguire il codice alla ricezione. Questo meccanismo basato su eventi è lo stesso nell'API Maps JavaScript v2 e v3, ad eccezione del fatto che lo spazio dei nomi è cambiato da GEvent
a google.maps.event
:
GEvent.addListener(map, 'click', function() {
alert('You clicked the map.');
});
google.maps.event.addListener(map, 'click', function() {
alert('You clicked the map.');
});
Rimozione dei listener di eventi
Per motivi legati alle prestazioni, ti consigliamo di rimuovere un listener di eventi quando non è più necessario. La rimozione di un listener di eventi funziona allo stesso modo nelle v2 e 3:
- Quando crei un listener di eventi, viene restituito un oggetto opaco (GEventListener
nella v2, MapsEventListener
nella v3).
- Se vuoi rimuovere il listener di eventi, passa questo oggetto al metodo
removeListener()
(GEvent.removeListener()
nella v2 o google.maps.event.removeListener()
in v3) per rimuovere il listener di eventi.
Ascolto di eventi DOM
Se vuoi acquisire e rispondere agli eventi DOM (Document Object Model), v3 fornisce il metodo statico google.maps.event.addDomListener()
, equivalente al metodo GEvent.addDomListener()
nella versione v2.
Utilizzo di argomenti superati negli eventi
Gli eventi UI spesso passano un argomento evento a cui il listener di eventi può accedere. La maggior parte degli argomenti degli eventi nella versione 3 è stata semplificata per essere più coerente rispetto agli oggetti nell'API. Per maggiori dettagli, consulta la documentazione di riferimento v3.
Nessun argomento overlay
esiste nei listener di eventi v3. Se registri un evento click
su una mappa v3, il callback si verifica solo quando l'utente fa clic sulla mappa base. Puoi registrare callback aggiuntivi sugli overlay cliccabili se devi reagire a questi clic.
// Passes an overlay argument when clicking on a map
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
map.setUIToDefault();
GEvent.addListener(map,'click', function(overlay, latlng) {
if (latlng) {
var marker = new GMarker(latlng);
map.addOverlay(marker);
}
});
// Passes only an event argument
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
google.maps.event.addListener(map, 'click', function(event) {
var marker = new google.maps.Marker({
position: event.latLng,
map: map
});
});
Controlli
L'API Maps JavaScript mostra i controlli dell'interfaccia utente che consentono agli utenti di interagire con la tua mappa. Puoi utilizzare l'API per personalizzare l'aspetto di questi controlli.
Modifiche nei tipi di controllo
Alcune modifiche ai tipi di control
sono state introdotte
con l'API v3.
- L'API v3 supporta tipi di mappe aggiuntivi, tra cui mappe dei rilievi e la possibilità di aggiungere tipi di mappe personalizzati.
- Il controllo gerarchico v2,
GHierarchicalMapTypeControl
, non è più disponibile.
Puoi ottenere un effetto simile utilizzando il controllo google.maps.MapTypeControlStyle.HORIZONTAL_BAR
.
- Il layout orizzontale fornito da
GMapTypeControl
nella versione 2 non è disponibile nella versione 3.
Aggiunta di controlli alla mappa
Con l'API Maps JavaScript v2 puoi aggiungere controlli
alla mappa utilizzando il metodo addControl()
dell'oggetto
mappa. Nella versione 3, anziché accedere o modificare direttamente i controlli,
puoi modificare l'oggetto MapOptions
associato. L'esempio riportato di seguito mostra come personalizzare la mappa per aggiungere i seguenti controlli:
- che consentono all'utente di alternare tra i tipi di mappa disponibili
- una scala per mappe
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
// Add controls
map.addControl(new GMapTypeControl());
map.addControl(new GScaleControl());
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP,
// Add controls
mapTypeControl: true,
scaleControl: true
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
Controlli di posizionamento sulla mappa
I controlli di posizionamento sono cambiati molto nella versione 3. Nella versione v2, il metodo addControl()
richiede un secondo parametro facoltativo che consente di specificare la posizione del controllo rispetto agli angoli della mappa.
Nella versione 3, puoi impostare la posizione di un controllo tramite la proprietà position
delle opzioni di controllo. Il posizionamento di questi controlli non è assoluto; l'API esegue il layout dei controlli in modo intelligente, spostandoli intorno agli elementi della mappa esistenti all'interno di determinati vincoli (ad esempio le dimensioni della mappa).
In questo modo ti assicuri che i controlli predefiniti siano compatibili con i tuoi controlli.
Per ulteriori informazioni, consulta Controllo del posizionamento in v3.
Il seguente codice riposiziona i controlli degli esempi precedenti:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
// Add map type control
map.addControl(new GMapTypeControl(), new GControlPosition(
G_ANCHOR_TOP_LEFT, new GSize(10, 10)));
// Add scale
map.addControl(new GScaleControl(), new GControlPosition(
G_ANCHOR_BOTTOM_RIGHT, new GSize(20, 20)));
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP,
// Add map type control
mapTypeControl: true,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.TOP_LEFT
},
// Add scale
scaleControl: true,
scaleControlOptions: {
position: google.maps.ControlPosition.BOTTOM_RIGHT
}
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
Controlli personalizzati
L'API Maps JavaScript ti consente di creare controlli di navigazione personalizzati.
Per personalizzare i controlli con l'API v2, devi sottoclassere la classe GControl
e definire i gestori per i metodi initialize()
e getDefaultPosition()
.
Non esiste un equivalente alla classe GControl
nella versione 3. Al contrario, i controlli sono rappresentati come elementi DOM. Per aggiungere un controllo personalizzato
con l'API v3, crea una struttura DOM per il controllo in un
costruttore come elemento figlio di Node
(ad esempio un
elemento <div>
) e aggiungi listener di eventi per gestire eventuali
eventi DOM. Esegui il push di Node
nell'array
controls[position]
delle mappe per aggiungere un'istanza del
controllo personalizzato alla tua mappa.
Data un'implementazione della classe HomeControl
conforme ai requisiti di interfaccia indicati sopra (per i dettagli, consulta la documentazione relativa ai controlli personalizzati), i seguenti esempi di codice mostrano come aggiungere un controllo personalizzato a una mappa.
map.addControl(new HomeControl(),
GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10)));
var homeControlDiv = document.createElement('DIV');
var homeControl = new HomeControl(homeControlDiv, map);
map.controls[google.maps.ControlPosition.TOP_RIGHT].push(
homeControlDiv);
Sovrapposizioni
Gli overlay riflettono gli oggetti che "aggiungi" alla mappa per designare punti, linee, aree o insiemi di oggetti.
Aggiunta e rimozione di overlay
I tipi di oggetti rappresentati da un overlay sono gli stessi nella versione 2 e 3, ma vengono gestiti in modo diverso.
Gli overlay nell'API v2 sono stati aggiunti e rimossi dalla mappa utilizzando i metodi addOverlay()
e removeOverlay()
dell'oggetto GMap2
. Nella versione 3, puoi assegnare una mappa a un overlay tramite la proprietà map
della classe di opzioni overlay associata.
Puoi anche aggiungere o rimuovere un overlay direttamente chiamando il metodo setMap()
dell'oggetto overlay e specificando la mappa desiderata. Se imposti la proprietà della mappa su null
, l'overlay viene rimosso.
Nessun metodo clearOverlays()
esistente nella versione 3.
Se vuoi gestire un insieme di overlay, devi creare un array che contenga gli overlay. Utilizzando questo array, puoi chiamare setMap()
su ogni overlay dell'array (trasmettendo null
se devi rimuoverli).
Indicatori trascinabili
Per impostazione predefinita, gli indicatori sono cliccabili ma non trascinabili. I due esempi riportati di seguito aggiungono un indicatore trascinabile:
var myLatLng = new GLatLng(-25.363882, 131.044922);
var map = new GMap2(document.getElementById('map'));
map.setCenter(myLatLng, 4);
var marker = new GMarker(latLng, {
draggable: true
});
map.addOverlay(marker);
var myLatLng = new google.maps.LatLng(-25.363882, 131.044922);
var map = new google.maps.Map(
document.getElementById('map'), {
center: myLatLng,
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: myLatLng,
draggable: true,
map: map
});
Icone
Puoi definire un'icona personalizzata da visualizzare al posto dell'indicatore predefinito.
Per utilizzare un'immagine personalizzata nella versione 2, puoi creare un'istanza GIcon
da G_DEFAULT_ICON type
e modificarla. Se
l'immagine è più grande o più piccola dell'icona predefinita, devi
specificarla con un'istanza GSize
.
L'API v3 semplifica leggermente questo processo.
È sufficiente impostare la proprietà icon
dell'indicatore sull'URL dell'immagine personalizzata e l'API ridimensionerà automaticamente l'icona.
L'API Maps JavaScript supporta inoltre le icone complesse.
Un'icona complessa può includere più riquadri, forme complesse oppure specificare l'"ordine di sovrapposizione" delle immagini rispetto ad altri overlay. Per aggiungere una forma a un indicatore nella versione v2, devi specificare la proprietà aggiuntiva in ogni istanza GIcon
e passarla come opzione a un costruttore GMarker
. Nella versione v3, le icone specificate in questo modo devono impostare le proprietà icon
su un oggetto di tipo Icon
.
Le ombre degli indicatori non sono supportate nella versione 3.
I seguenti esempi mostrano una bandierina di spiaggia a Bondi Beach in Australia, con la parte trasparente dell'icona non cliccabile:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
map.setUIToDefault();
var flagIcon = new GIcon(G_DEFAULT_ICON);
flagIcon.image = '/images/beachflag.png';
flagIcon.imageMap = [1, 1, 1, 20, 18, 20, 18 , 1];
var bbLatLng = new GLatLng(-33.890542, 151.274856);
map.addOverlay(new GMarker(bbLatLng, {
icon: flagIcon
}));
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var shape = {
coord: [1, 1, 1, 20, 18, 20, 18 , 1],
type: 'poly'
};
var bbLatLng = new google.maps.LatLng(-33.890542, 151.274856);
var bbMarker = new google.maps.Marker({
icon: '/images/beachflag.png'
shape: shape,
position: bbLatLng,
map: map
});
Polilinee
Una polilinea è composta da un array di LatLng
e una serie di segmenti di linea che collegano queste posizioni in una sequenza ordinata.
La creazione e la visualizzazione di un oggetto Polyline
nella versione 3 è simile all'utilizzo di un oggetto GPolyline
nella versione v2. I seguenti esempi tracciano una polilinea geodetica semitrasparente e larga 3 pixel da Zurigo a Sydney, passando per Singapore:
var polyline = new GPolyline(
[
new GLatLng(47.3690239, 8.5380326),
new GLatLng(1.352083, 103.819836),
new GLatLng(-33.867139, 151.207114)
],
'#FF0000', 3, 0.5, {
geodesic: true
});
map.addOverlay(polyline);
var polyline = new google.maps.Polyline({
path: [
new google.maps.LatLng(47.3690239, 8.5380326),
new google.maps.LatLng(1.352083, 103.819836),
new google.maps.LatLng(-33.867139, 151.207114)
],
strokeColor: '#FF0000',
strokeOpacity: 0.5,
strokeWeight: 3,
geodesic: true
});
polyline.setMap(map);
Polilinee codificate
La versione 3 non supporta la creazione di oggetti Polyline
direttamente da polilinee codificate. La Libreria Geometry fornisce invece metodi per codificare e decodificare le polilinee. Consulta la sezione Librerie nell'API di Maps v3 per ulteriori informazioni su come caricare questa libreria.
Gli esempi riportati di seguito tracciano la stessa polilinea codificata; il codice v3 utilizza il
metodo decodePath()
dello
spazio dei nomi google.maps.geometry.encoding
.
var polyline = new GPolyline.fromEncoded({
points: 'kwb`Huqbs@ztzwGgvpdQbw}uEoif`H',
levels: 'PPP',
zoomFactor: 2,
numLevels: 18,
color: '#ff0000',
opacity: 0.8,
weight: 3
});
map.addOverlay(polyline);
var polyline = new google.maps.Polyline({
path: google.maps.geometry.encoding.decodePath(
'kwb`Huqbs@ztzwGgvpdQbw}uEoif`H'),
strokeColor: '#FF0000',
strokeOpacity: 0.5,
strokeWeight: 3,
});
polyline.setMap(map);
Poligoni
Un poligono definisce una regione all'interno di un ciclo chiuso. Proprio come l'oggetto Polyline
, gli oggetti Polygon
sono costituiti da una serie di punti in una sequenza ordinata. La classe Polygon
v3 è molto simile alla classe GPolygon
v2, con l'eccezione che non è più necessario ripetere il vertice iniziale alla fine del percorso per chiudere il loop. L'API v3
chiuderà automaticamente tutti i poligoni disegnando un tratto che colleghi
l'ultima coordinata alla prima coordinata. I seguenti snippet di codice creano un poligono che rappresenta il Triangolo delle Bermuda:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(24.886436, -70.268554), 5);
var bermudaTriangle = new GPolygon(
[
new GLatLng(25.774252, -80.190262),
new GLatLng(18.466465, -66.118292),
new GLatLng(32.321384, -64.75737),
new GLatLng(25.774252, -80.190262)
],
'#FF0000', 2, 0.8, '#FF0000', 0.35);
map.addOverlay(bermudaTriangle);
var map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(24.886436, -70.268554),
mapTypeId: google.maps.MapTypeId.TERRAIN,
zoom: 5
});
var bermudaTriangle = new google.maps.Polygon({
paths: [
new google.maps.LatLng(25.774252, -80.190262),
new google.maps.LatLng(18.466465, -66.118292),
new google.maps.LatLng(32.321384, -64.75737)
],
strokeColor: '#FF0000',
strokeWeight: 2,
strokeOpacity: 0.8,
fillColor: '#FF0000',
fillOpacity: 0.35
});
bermudaTriangle.setMap(map);
Forme modificabili dall'utente
Polilinee e poligoni possono essere resi modificabili dall'utente. I seguenti
snippet di codice sono equivalenti:
map.addOverlay(polyline);
polyline.enableEditing();
polyline.setMap(map);
polyline.setEditable(true);
Per funzionalità di disegno più avanzate, consulta la Libreria di disegni nella documentazione della versione 3.
Finestre informative
Un elemento InfoWindow
mostra i contenuti in una finestra mobile sopra la mappa. Esistono alcune differenze fondamentali tra le finestre informative v2 e v3:
- L'API v2 supporta solo
GInfoWindow
per mappa, mentre l'API v3 supporta più InfoWindow
in contemporanea su ogni mappa.
- La versione 3
InfoWindow
rimarrà aperta quando
fai clic sulla mappa. L'GInfoWindow
v2 si chiude automaticamente quando fai clic sulla mappa. Puoi emulare il comportamento v2 aggiungendo un listener click
all'oggetto Map
.
- L'API v3 non fornisce il supporto nativo per un elemento
InfoWindow
a schede.
Sovrapposizioni del suolo
Per posizionare un'immagine su una mappa, devi usare un oggetto GroundOverlay
. Il costruttore di un elemento GroundOverlay
è sostanzialmente lo stesso in v2 e v3: specifica l'URL di un'immagine e i limiti dell'immagine come parametri.
Il seguente esempio inserisce una mappa antica di Newark, NJ sulla mappa
sotto forma di overlay:
var bounds = new GLatLngBounds(
new GLatLng(40.716216, -74.213393),
new GLatLng(40.765641, -74.139235));
var overlay = new GGroundOverlay(
'http://lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
bounds);
map.addOverlay(overlay);
var bounds = new google.maps.LatLngBounds(
new google.maps.LatLng(40.716216, -74.213393),
new google.maps.LatLng(40.765641, -74.139235));
var overlay = new google.maps.GroundOverlay(
'http://lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
bounds);
overlay.setMap(map);
Tipi di mappa
I tipi di mappe disponibili nelle versioni 2 e 3 sono leggermente diversi, ma tutti
i tipi di mappe di base sono disponibili in entrambe le versioni dell'API. Per impostazione predefinita, la versione v2
utilizza riquadri di mappe stradali "dipinti" standard. Tuttavia, v3 richiede di specificare un tipo
di mappa specifico durante la creazione di un oggetto google.maps.Map
.
Tipi di mappa comuni
I quattro tipi di mappe di base sono disponibili sia nella versione 2 che nella versione 3:
MapTypeId.ROADMAP
(sostituisce G_NORMAL_MAP
)
mostra la visualizzazione della mappa stradale.
MapTypeId.SATELLITE
(sostituisce G_SATELLITE_MAP
)
visualizza le immagini satellitari di Google Earth.
MapTypeId.HYBRID
(sostituisce G_HYBRID_MAP
)
mostra una combinazione di vista normale e vista satellite.
MapTypeId.TERRAIN
(sostituisce G_PHYSICAL_MAP
)
mostra una mappa fisica basata sulle informazioni sui rilievi.
Di seguito è riportato un esempio di come le versioni v2 e v3 impostano la mappa sulla visualizzazione Rilievo:
map.setMapType(G_PHYSICAL_MAP);
map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
L'API Maps JavaScript v3 ha apportato alcune modifiche anche ai tipi di mappe meno comuni:
- I riquadri della mappa per corpi celesti diversi da Earth non sono disponibili come tipi di mappe nell'API v3, ma è possibile accedervi come tipi di mappa personalizzati, come mostrato in questo esempio.
- Non esiste un tipo di mappa speciale nella versione 3 che sostituisce il tipo
G_SATELLITE_3D_MAP
nella versione 2. Puoi invece integrare il plug-in Google Earth nelle mappe v3 utilizzando questa libreria.
Numero massimo di immagini con zoom
Le immagini satellitari non sono sempre disponibili a livelli di zoom elevati. Se vuoi
conoscere il livello di zoom più alto disponibile prima di impostare il livello,
utilizza la classe google.maps.MaxZoomService
. Questa classe sostituisce il metodo GMapType.getMaxZoomAtLatLng()
della versione 2.
var point = new GLatLng(
180 * Math.random() - 90, 360 * Math.random() - 180);
var map = new GMap2(document.getElementById("map"));
map.setUIToDefault();
map.setCenter(point);
map.setMapType(G_HYBRID_MAP);
map.getCurrentMapType().getMaxZoomAtLatLng(point,
function(response) {
if (response.status) {
map.setZoom(response.zoom);
} else {
alert("Error in Max Zoom Service.");
}
});
var myLatlng = new google.maps.LatLng(
180 * Math.random() - 90, 360 * Math.random() - 180);
var map = new google.maps.Map(
document.getElementById("map"),{
zoom: 0,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.HYBRID
});
var maxZoomService = new google.maps.MaxZoomService();
maxZoomService.getMaxZoomAtLatLng(
myLatlng,
function(response) {
if (response.status == google.maps.MaxZoomStatus.OK) {
map.setZoom(response.zoom);
} else {
alert("Error in Max Zoom Service.");
}
});
Immagini prospettiche aeree
Quando attivi le immagini aeree nella versione 3, i controlli sono simili al controllo GLargeZoomControl3D
della versione 2, con un controllo Ruota interstitial aggiuntivo che ti consente di ruotare tra le direzioni supportate.
Su questa mappa puoi monitorare le città per cui sono attualmente disponibili immagini a 45°. Quando sono disponibili immagini a 45°, viene aggiunta un'opzione di sottomenu al pulsante Satellite dell'API di Google Maps.
Livelli
I livelli sono oggetti sulla mappa costituiti da uno o più overlay. Possono essere manipolati come una singola unità e in genere riflettono raccolte di oggetti.
Livelli supportati
L'API v3 fornisce l'accesso a diversi livelli. Questi livelli si sovrappongono alla classe GLayer
v2 nelle seguenti aree:
-
L'oggetto
KmlLayer
esegue il rendering degli elementi KML e GeoRSS in overlay v3, fornendo l'equivalente per il livello GeoXml
v2.
- L'oggetto
TrafficLayer
esegue il rendering di un livello che mostra le condizioni del traffico, in modo simile all'overlay GTrafficOverlay
v2.
Questi livelli sono diversi dalla versione 2. Le differenze sono descritte di seguito. Per aggiungerli a una mappa, chiama setMap()
,
passando l'oggetto Map
su cui visualizzare il
livello.
Ulteriori informazioni sui livelli supportati sono disponibili nella documentazione relativa ai livelli.
Livelli KML e GeoRSS
L'API Maps JavaScript supporta i formati di dati KML e GeoRSS per la visualizzazione delle informazioni geografiche. I file KML o GeoRSS devono essere accessibili pubblicamente se vuoi includerli in una mappa. Nella versione 3, questi formati di dati vengono visualizzati utilizzando un'istanza di KmlLayer
, che sostituisce l'oggetto GGeoXml
della versione 2.
L'API v3 è più flessibile durante il rendering dei file KML, permettendoti di eliminare le InfoWindows e di modificare la risposta al clic. Per ulteriori dettagli, consulta la documentazione relativa ai livelli KML e GeoRSS v3.
Quando esegui il rendering di un elemento KmlLayer
, vengono applicate limitazioni relative a dimensioni e complessità; consulta la documentazione di Kmllayer per i dettagli.
I seguenti esempi confrontano il modo in cui caricare un file KML.
geoXml = new GGeoXml(
'https://googlearchive.github.io/js-v2-samples/ggeoxml/cta.kml');
map.addOverlay(geoXml);
var layer = new google.maps.KmlLayer(
'https://googlearchive.github.io/js-v2-samples/ggeoxml/cta.kml', {
preserveViewport: true
});
layer.setMap(map);
Il livello Traffico
La versione 3 consente di aggiungere informazioni sul traffico in tempo reale (se supportato) alle
mappe utilizzando l'oggetto TrafficLayer
. Le informazioni sul traffico vengono fornite per il momento in cui viene effettuata la richiesta. Questi esempi mostrano le informazioni sul traffico per Los Angeles:
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(34.0492459, -118.241043), 13);
map.setUIToDefault();
var trafficOptions = {incidents:false};
trafficInfo = new GTrafficOverlay(trafficOptions);
map.addOverlay(trafficInfo);
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(34.0492459, -118.241043),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 13
});
var trafficLayer = new google.maps.TrafficLayer();
trafficLayer.setMap(map);
A differenza della versione v2, non esistono opzioni per il costruttore TrafficLayer
nella versione v3. Gli incidenti non sono disponibili nella versione 3.
Servizi
Geocoding
L'API Maps JavaScript fornisce un oggetto geocoder
per
la geocodifica in modo dinamico degli indirizzi in base all'input dell'utente. Se vuoi geocodificare indirizzi noti e statici, consulta la documentazione dell'API Geocoding.
L'API Geocoding è stata
notevolmente aggiornata e migliorata, aggiungendo nuove funzionalità e modificando
il modo in cui i dati vengono rappresentati.
GClientGeocoder
nell'API v2 forniva due metodi diversi per la geocodifica in avanti e indietro, nonché metodi aggiuntivi per influenzare le modalità di esecuzione della geocodifica. Al contrario, l'oggetto Geocoder
v3
fornisce solo un
metodo geocode()
, che prende un valore letterale oggetto contenente i termini di input
(sotto forma di oggetto Geocoding
Richieste) e un metodo di callback. A seconda che la richiesta contenga un attributo address
testuale o un oggetto LatLng
, l'API Geocoding restituirà una risposta di geocodifica in avanti o inversa. Puoi influenzare il modo in cui viene eseguita la geocodifica passando campi aggiuntivi alla richiesta di geocodifica:
- L'inclusione di un
address
testuale attiva la geocodifica in avanti, equivalente alla chiamata del metodo getLatLng()
.
- L'inclusione di un oggetto
latLng
attiva la geocodifica inversa, equivalente alla chiamata del metodo getLocations()
.
- L'inclusione dell'attributo
bounds
attiva la Differenziazione
dell'area visibile, equivalente alla chiamata del metodo setViewport()
.
- L'inclusione dell'attributo
region
attiva la Differenziazione del codice della regione, equivalente alla chiamata del metodo setBaseCountryCode()
.
Le risposte di geocodifica nella versione 3 sono molto diverse da quelle nella versione 2. L'API v3
sostituisce la struttura nidificata utilizzata da v2 con una struttura più piatta e
più facile da analizzare. Inoltre, le risposte v3 sono più dettagliate: ogni risultato ha diversi componenti per l'indirizzo che contribuiscono a dare un'idea migliore della risoluzione di ogni risultato.
Il seguente codice prende un indirizzo di testo e mostra il primo risultato della geocodifica:
var geocoder = new GClientGeocoder();
var infoPanel;
var map;
var AccuracyDescription = [
'Unknown accuracy', 'country level accuracy',
'region level accuracy', 'sub-region level accuracy',
'town level accuracy', 'post code level accuracy',
'street level accuracy', 'intersection level accuracy',
'address level accuracy', 'premise level accuracy',
];
function geocode_result_handler(response) {
if (!response || response.Status.code != 200) {
alert('Geocoding failed. ' + response.Status.code);
} else {
var bounds = new GLatLngBounds(new GLatLng(
response.Placemark[0].ExtendedData.LatLonBox.south,
response.Placemark[0].ExtendedData.LatLonBox.west
), new GLatLng(
response.Placemark[0].ExtendedData.LatLonBox.north,
response.Placemark[0].ExtendedData.LatLonBox.east
));
map.setCenter(bounds.getCenter(),
map.getBoundsZoomLevel(bounds));
var latlng = new GLatLng(
response.Placemark[0].Point.coordinates[1],
response.Placemark[0].Point.coordinates[0]);
infoPanel.innerHTML += '<p>1st result is <em>' +
// No info about location type
response.Placemark[0].address +
'</em> of <em>' +
AccuracyDescription[response.Placemark[0].
AddressDetails.Accuracy] +
'</em> at <tt>' + latlng + '</tt></p>';
var marker_title = response.Placemark[0].address +
' at ' + latlng;
map.clearOverlays();
var marker = marker = new GMarker(
latlng,
{'title': marker_title}
);
map.addOverlay(marker);
}
}
function geocode_address() {
var address = document.getElementById('input-text').value;
infoPanel.innerHTML = '<p>Original address: ' + address + '</p>';
geocoder.getLocations(address, geocode_result_handler);
}
function initialize() {
map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(38, 15), 2);
map.setUIToDefault();
infoPanel = document.getElementById('info-panel');
}
var geocoder = new google.maps.Geocoder();
var infoPanel;
var map;
var marker;
function geocode_result_handler(result, status) {
if (status != google.maps.GeocoderStatus.OK) {
alert('Geocoding failed. ' + status);
} else {
map.fitBounds(result[0].geometry.viewport);
infoPanel.innerHTML += '<p>1st result for geocoding is <em>' +
result[0].geometry.location_type.toLowerCase() +
'</em> to <em>' +
result[0].formatted_address + '</em> of types <em>' +
result[0].types.join('</em>, <em>').replace(/_/, ' ') +
'</em> at <tt>' + result[0].geometry.location +
'</tt></p>';
var marker_title = result[0].formatted_address +
' at ' + latlng;
if (marker) {
marker.setPosition(result[0].geometry.location);
marker.setTitle(marker_title);
} else {
marker = new google.maps.Marker({
position: result[0].geometry.location,
title: marker_title,
map: map
});
}
}
}
function geocode_address() {
var address = document.getElementById('input-text').value;
infoPanel.innerHTML = '<p>Original address: ' + address + '</p>';
geocoder.geocode({'address': address}, geocode_result_handler);
}
function initialize() {
map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(38, 15),
zoom: 2,
mapTypeId: google.maps.MapTypeId.HYBRID
});
infoPanel = document.getElementById('info-panel');
}
Istruzioni
L'API Maps JavaScript v3 sostituisce la classe GDirections
della versione 2 con la classe DirectionsService
per
il calcolo delle indicazioni stradali.
Il metodo route()
nella v3 sostituisce entrambi i metodi load()
e loadFromWaypoints()
dell'API v2. Questo metodo richiede l'esecuzione di un singolo valore letterale di oggetto DirectionsRequest
contenente i termini di input e un metodo di callback da eseguire alla ricezione della risposta. Le opzioni possono essere fornite in questo valore letterale oggetto,
in modo simile al valore letterale oggetto GDirectionsOptions
nella versione v2.
Nell'API Maps JavaScript v3, l'attività di invio delle richieste di indicazioni stradali è stata separata dall'attività delle richieste di rendering, che ora viene gestita con la classe DirectionsRenderer
. Puoi collegare un oggetto DirectionsRenderer
a qualsiasi mappa o a qualsiasi oggetto DirectionsResult
tramite i relativi metodi setMap()
e setDirections()
. Poiché il renderer è un MVCObject
, rileva eventuali modifiche alle sue proprietà e aggiorna la mappa quando le indicazioni stradali associate vengono modificate.
Il seguente codice mostra come richiedere indicazioni a piedi per una
località specifica utilizzando i percorsi pedonali da un indirizzo. Tieni presente che solo la versione 3 è in grado di fornire indicazioni a piedi nel percorso pedonale dello zoo di Dublino.
var map;
var directions;
var directionsPanel;
function initialize() {
var origin = new google.maps.LatLng(53.348172, -6.297285);
var destination = new google.maps.LatLng(53.355502, -6.30557);
directionsPanel = document.getElementById("route");
map = new GMap2(document.getElementById('map'));
map.setCenter(origin, 10);
map.setUIToDefault();
directions = new GDirections(map, directionsPanel);
directions.loadFromWaypoints(
[origin, destination], {
travelMode: 'G_TRAVEL_MODE_WALKING',
});
}
var map;
var directionsRenderer;
var directionsService = new google.maps.DirectionsService();
function initialize() {
var origin = new google.maps.LatLng(53.348172, -6.297285);
var destination = new google.maps.LatLng(53.355502, -6.30557);
directionsRenderer = new google.maps.DirectionsRenderer();
map = new google.maps.Map(
document.getElementById('map'), {
center: origin,
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
directionsRenderer.setPanel(document.getElementById("route"));
directionsRenderer.setMap(map);
directionsService.route({
origin: origin,
destination: destination,
travelMode: google.maps.DirectionsTravelMode.WALKING
}, function(result, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsRenderer.setDirections(result);
}
});
}
Street View
Google Street View offre visualizzazioni interattive a 360° da
località specifiche all'interno dell'area di copertura. L'API v3 supporta Street View in modo nativo all'interno del browser, a differenza della versione 2 che richiedeva il plug-in Flash® per visualizzare le immagini di Street View.
Le immagini di Street View sono supportate tramite l'uso dell'oggetto
StreetViewPanorama
nella versione 3 o dell'oggetto
GStreetviewPanorama
nella versione v2. Queste classi hanno interfacce diverse ma svolgono lo stesso ruolo: collegano il container div
con le immagini di Street View e consentono di specificare la posizione e il punto di vista (POV) della panoramica in Street View.
function initialize() {
var fenwayPark = new GLatLng(42.345573, -71.098326);
panoramaOptions = {
latlng: fenwayPark,
pov: {
heading: 35,
pitch: 5,
zoom: 1
}
};
var panorama = new GStreetviewPanorama(
document.getElementById('pano'),
panoramaOptions);
GEvent.addListener(myPano, "error", handleNoFlash);
}
function handleNoFlash(errorCode) {
if (errorCode == FLASH_UNAVAILABLE) {
alert('Error: Your browser does not support Flash');
return;
}
}
function initialize() {
var fenway = new google.maps.LatLng(42.345573, -71.098326);
var panoramaOptions = {
position: fenway,
pov: {
heading: 35,
pitch: 5,
zoom: 1
}
};
var panorama = new google.maps.StreetViewPanorama(
document.getElementById('pano'),
panoramaOptions);
}
L'accesso diretto ai dati di Street View è possibile tramite l'oggetto
StreetViewService
nella versione 3 o l'oggetto
GStreetviewClient
simile nella versione v2. Entrambe forniscono interfacce simili per recuperare o verificare la disponibilità dei dati di Street View e consentono la ricerca per località o ID panoramica.
Nella versione 3, Street View è abilitato per impostazione predefinita. La mappa verrà visualizzata con un
controllo di Street View da Pegman e l'API riutilizzerà il div della mappa per visualizzare
le panoramiche in Street View. Il seguente codice illustra come emulare il comportamento della versione v2 separando le panoramiche di Street View in un div separato.
var marker;
var panoClient = new GStreetviewClient();
function initialize() {
if (GBrowserIsCompatible()) {
var myPano = new GStreetviewPanorama(
document.getElementById('pano'));
GEvent.addListener(myPano, 'error', handleNoFlash);
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(42.345573, -71.098326), 16);
map.setUIToDefault();
GEvent.addListener(map, 'click', function(overlay, latlng) {
if (marker) {
marker.setLatLng(latlng);
} else {
marker = new GMarker(latlng);
map.addOverlay(marker);
}
var nearestPano = panoClient.getNearestPanorama(
latlng, processSVData);
});
function processSVData(panoData) {
if (panoData.code != 200) {
alert("Panorama data not found for this location.");
}
var latlng = marker.getLatLng();
var dLat = latlng.latRadians()
- panoData.location.latlng.latRadians();
var dLon = latlng.lngRadians()
- panoData.location.latlng.lngRadians();
var y = Math.sin(dLon) * Math.cos(latlng.latRadians());
var x = Math.cos(panoData.location.latlng.latRadians()) *
Math.sin(latlng.latRadians()) -
Math.sin(panoData.location.latlng.latRadians()) *
Math.cos(latlng.latRadians()) * Math.cos(dLon);
var bearing = Math.atan2(y, x) * 180 / Math.PI;
myPano.setLocationAndPOV(panoData.location.latlng, {
yaw: bearing
});
}
function handleNoFlash(errorCode) {
if (errorCode == FLASH_UNAVAILABLE) {
alert('Error: Your browser does not support Flash');
return;
}
}
}
}
// Load the API with libraries=geometry
var map;
var marker;
var panorama;
var sv = new google.maps.StreetViewService();
function radians(degrees) { return Math.PI * degrees / 180.0 };
function initialize() {
panorama = new google.maps.StreetViewPanorama(
document.getElementById("pano"));
map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(42.345573, -71.098326),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 16
});
google.maps.event.addListener(map, 'click', function(event) {
if (!marker) {
marker = new google.maps.Marker({
position: event.latLng,
map: map
});
} else {
marker.setPosition(event.latLng);
}
sv.getPanoramaByLocation(event.latLng, 50, processSVData);
});
}
function processSVData(panoData, status) {
if (status == google.maps.StreetViewStatus.OK) {
alert("Panorama data not found for this location.");
}
var bearing = google.maps.geometry.spherical.computeHeading(
panoData.location.latLng, marker.getPosition());
panorama.setPano(panoData.location.pano);
panorama.setPov({
heading: bearing,
pitch: 0,
zoom: 1
});
panorama.setVisible(true);
marker.setMap(panorama);
}