Controlli

Seleziona la piattaforma: Android iOS JavaScript

Panoramica dei controlli

Le mappe visualizzate tramite l'API Maps JavaScript contengono elementi UI che consentono all'utente di interagire con la mappa. Questi elementi sono noti come controlli e puoi includere varianti di questi controlli nella tua applicazione. In alternativa, puoi non fare nulla e lasciare che l'API Maps JavaScript gestisca tutti i comportamenti di controllo.

La seguente mappa mostra l'insieme predefinito di controlli visualizzati dall'API Maps JavaScript:

Di seguito è riportato un elenco completo dei controlli che puoi utilizzare nelle mappe:

  • Il controllo dello zoom mostra i pulsanti "+" e "-" per cambiare il livello di zoom della mappa. Questo controllo viene visualizzato per impostazione predefinita nell'angolo in basso a destra della mappa.
  • Il controllo Tipo di mappa è disponibile in un menu a discesa o in una barra dei pulsanti orizzontale e consente all'utente di scegliere un tipo di mappa (ROADMAP, SATELLITE, HYBRID o TERRAIN). Per impostazione predefinita, questo controllo viene visualizzato nell'angolo in alto a sinistra della mappa.
  • Il controllo di Street View contiene un'icona di Pegman che può essere trascinata sulla mappa per attivare Street View. Questo controllo viene visualizzato per impostazione predefinita in basso a destra nella mappa.
  • Il controllo Ruota fornisce una combinazione di opzioni di inclinazione e rotazione per le mappe contenenti immagini oblique. Questo controllo viene visualizzato per impostazione predefinita in basso a destra nella mappa. Per ulteriori informazioni, vedi le immagini a 45°.
  • Il controllo scala mostra un elemento scala della mappa. Questo controllo è disattivato per impostazione predefinita.
  • Il controllo a schermo intero offre la possibilità di aprire la mappa in modalità a schermo intero. Questo controllo è abilitato per impostazione predefinita su computer e dispositivi mobili. Nota: iOS non supporta la funzionalità a schermo intero. Pertanto, il controllo a schermo intero non è visibile sui dispositivi iOS.
  • Il controllo delle scorciatoie da tastiera mostra un elenco di scorciatoie da tastiera per interagire con la mappa.

Non puoi accedere o modificare direttamente questi controlli della mappa. Al contrario, puoi modificare i campi MapOptions della mappa che influiscono sulla visibilità e sulla presentazione dei controlli. Puoi regolare la presentazione di controllo creando un'istanza della mappa (con il valore MapOptions appropriato) o modificare una mappa in modo dinamico chiamando setOptions() per modificare le opzioni della mappa.

Non tutti questi controlli sono attivi per impostazione predefinita. Per informazioni sul comportamento predefinito dell'interfaccia utente e su come modificarlo, consulta la sezione UI predefinita di seguito.

L'interfaccia utente predefinita

Per impostazione predefinita, tutti i controlli scompaiono se la mappa è troppo piccola (200 x 200 px). Puoi ignorare questo comportamento impostando esplicitamente il controllo in modo che sia visibile. Consulta la sezione Aggiungere controlli alla mappa.

Il comportamento e l'aspetto dei controlli è lo stesso su dispositivi mobili e computer, ad eccezione del controllo a schermo intero (vedi il comportamento descritto nell'elenco dei controlli).

Inoltre, la gestione della tastiera è attiva per impostazione predefinita su tutti i dispositivi.

Disattivazione dell'interfaccia utente predefinita

Se lo desideri, puoi disattivare completamente i pulsanti predefiniti dell'interfaccia utente dell'API. Per farlo, imposta la proprietà disableDefaultUI della mappa (all'interno dell'oggetto MapOptions) su true. Questa proprietà disattiva tutti i pulsanti di controllo dell'interfaccia utente dell'API Maps JavaScript. Tuttavia, non influisce sui gesti del mouse o sulle scorciatoie da tastiera sulla mappa base, che sono controllate rispettivamente dalle proprietà gestureHandling e keyboardShortcuts.

Il codice seguente disabilita i pulsanti UI:

TypeScript

function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 4,
      center: { lat: -33, lng: 151 },
      disableDefaultUI: true,
    }
  );
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 4,
    center: { lat: -33, lng: 151 },
    disableDefaultUI: true,
  });
}

window.initMap = initMap;
Visualizza esempio

Prova Samples

Aggiunta di controlli alla mappa

Puoi personalizzare l'interfaccia rimuovendo, aggiungendo o modificando il comportamento o i controlli dell'interfaccia utente e assicurarti che gli aggiornamenti futuri non modifichino questo comportamento. Se vuoi aggiungere o modificare solo il comportamento esistente, devi assicurarti che il controllo venga aggiunto esplicitamente all'applicazione.

Alcuni controlli vengono visualizzati sulla mappa per impostazione predefinita, mentre altri non vengono visualizzati a meno che tu non li richieda specificatamente. L'aggiunta o la rimozione di controlli dalla mappa è specificata nei seguenti campi dell'oggetto MapOptions, che puoi impostare su true per renderli visibili o impostare su false per nasconderli:

{
  zoomControl: boolean,
  mapTypeControl: boolean,
  scaleControl: boolean,
  streetViewControl: boolean,
  rotateControl: boolean,
  fullscreenControl: boolean
}

Per impostazione predefinita, tutti i controlli scompaiono se le dimensioni della mappa sono inferiori a 200 x 200 px. Puoi ignorare questo comportamento impostando esplicitamente il controllo in modo che sia visibile. Ad esempio, la tabella seguente mostra se il controllo di zoom è visibile o meno, in base alle dimensioni della mappa e all'impostazione del campo zoomControl:

Dimensioni mappa zoomControl Visibile?
Qualsiasi false No
Qualsiasi true
>= 200x200px undefined
< 200x200px undefined No

L'esempio seguente imposta la mappa in modo da nascondere il controllo di zoom e visualizzare il controllo Scala. Tieni presente che non disabilitiamo esplicitamente l'interfaccia utente predefinita, pertanto queste modifiche si aggiungono al comportamento predefinito dell'interfaccia utente.

TypeScript

function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 4,
      center: { lat: -33, lng: 151 },
      zoomControl: false,
      scaleControl: true,
    }
  );
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 4,
    center: { lat: -33, lng: 151 },
    zoomControl: false,
    scaleControl: true,
  });
}

window.initMap = initMap;
Visualizza esempio

Prova Samples

Opzioni di controllo

Diversi controlli sono configurabili e puoi quindi modificarne il comportamento o cambiarne l'aspetto. Il controllo Tipo di mappa, ad esempio, può essere visualizzato come una barra orizzontale o un menu a discesa.

Questi controlli vengono modificati alterando i campi options di controllo appropriati all'interno dell'oggetto MapOptions al momento della creazione della mappa.

Ad esempio, le opzioni per modificare il controllo Tipo di mappa sono indicate nel campo mapTypeControlOptions. Il controllo Tipo di mappa può essere visualizzato in una delle seguenti opzioni style:

  • google.maps.MapTypeControlStyle.HORIZONTAL_BAR mostra l'array di controlli sotto forma di pulsanti in una barra orizzontale, come mostrato su Google Maps.
  • google.maps.MapTypeControlStyle.DROPDOWN_MENU mostra un controllo con pulsante singolo che ti consente di selezionare il tipo di mappa tramite un menu a discesa.
  • google.maps.MapTypeControlStyle.DEFAULT mostra il comportamento predefinito, che dipende dalle dimensioni dello schermo e potrebbe cambiare nelle versioni future dell'API.

Tieni presente che se modifichi le opzioni di controllo, devi anche abilitare esplicitamente il controllo impostando il valore MapOptions appropriato su true. Ad esempio, per impostare un controllo Tipo di mappa in modo che mostri lo stile DROPDOWN_MENU, utilizza il seguente codice nell'oggetto MapOptions:

  ...
  mapTypeControl: true,
  mapTypeControlOptions: {
    style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
  }
  ...

L'esempio seguente mostra come modificare la posizione predefinita e lo stile dei controlli.

TypeScript

// You can set control options to change the default position or style of many
// of the map controls.

function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 4,
      center: { lat: -33, lng: 151 },
      mapTypeControl: true,
      mapTypeControlOptions: {
        style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
        mapTypeIds: ["roadmap", "terrain"],
      },
    }
  );
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

// You can set control options to change the default position or style of many
// of the map controls.
function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 4,
    center: { lat: -33, lng: 151 },
    mapTypeControl: true,
    mapTypeControlOptions: {
      style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
      mapTypeIds: ["roadmap", "terrain"],
    },
  });
}

window.initMap = initMap;
Visualizza esempio

Prova Samples

In genere i controlli vengono configurati al momento della creazione della mappa. Tuttavia, puoi modificare la presentazione dei controlli in modo dinamico chiamando il metodo setOptions() di Map e passandogli nuove opzioni di controllo.

Modifica dei controlli

Puoi specificare la presentazione di un controllo quando crei la mappa utilizzando i campi all'interno dell'oggetto MapOptions della mappa. Questi campi sono indicati di seguito:

  • zoomControl attiva/disattiva il controllo Zoom. Per impostazione predefinita, questo controllo è visibile e viene visualizzato nella parte in basso a destra della mappa. Il campo zoomControlOptions specifica inoltre ZoomControlOptions da utilizzare per questo controllo.
  • mapTypeControl attiva/disattiva il controllo Tipo di mappa che consente all'utente di passare da un tipo di mappa all'altro (come Mappa e Satellite). Per impostazione predefinita, questo controllo è visibile e viene visualizzato nell'angolo in alto a sinistra della mappa. Il campo mapTypeControlOptions specifica inoltre MapTypeControlOptions da utilizzare per questo controllo.
  • streetViewControl attiva/disattiva il controllo di Pegman, che consente all'utente di attivare una panoramica di Street View. Per impostazione predefinita, questo controllo è visibile e viene visualizzato nella parte in basso a destra della mappa. Il campo streetViewControlOptions specifica inoltre StreetViewControlOptions da utilizzare per questo controllo.
  • rotateControl attiva/disattiva l'aspetto di un controllo di rotazione per controllare l'orientamento delle immagini a 45°. Per impostazione predefinita, la presenza del controllo è determinata dalla presenza o assenza di immagini a 45° per il tipo di mappa specificato con lo zoom e la posizione correnti. Puoi modificare il comportamento del controllo impostando rotateControlOptions della mappa per specificare il valore RotateControlOptions da utilizzare. Non puoi visualizzare il controllo se non sono attualmente disponibili immagini a 45°.
  • scaleControl attiva/disattiva il controllo Scala che fornisce una scala della mappa semplice. Per impostazione predefinita, questo controllo non è visibile. Quando abilitata, verrà sempre visualizzata nell'angolo in basso a destra della mappa. scaleControlOptions specifica inoltre ScaleControlOptions da utilizzare per questo controllo.
  • fullscreenControl attiva/disattiva il controllo che apre la mappa in modalità a schermo intero. Per impostazione predefinita, questo controllo è abilitato su computer e dispositivi Android. Quando è abilitato, il controllo viene visualizzato in alto a destra nella mappa. fullscreenControlOptions specifica inoltre FullscreenControlOptions da utilizzare per questo controllo.

Tieni presente che puoi specificare le opzioni per i controlli che hai disattivato inizialmente.

Posizionamento del controllo

La maggior parte delle opzioni di controllo contiene una proprietà position (di tipo ControlPosition) che indica la posizione sulla mappa in cui posizionare il controllo. Il posizionamento di questi controlli non è assoluto. Al contrario, l'API dispone i controlli in modo intelligente facendoli scorrere intorno agli elementi della mappa esistenti o ad altri controlli entro determinati vincoli (ad esempio le dimensioni della mappa).

Nota: non è possibile garantire che i controlli non si sovrappongano a causa di layout complicati, anche se l'API tenterà di organizzarli in modo intelligente.

Sono supportate le seguenti posizioni di controllo:

  • TOP_CENTER indica che il controllo deve essere posizionato in alto al centro della mappa.
  • TOP_LEFT indica che il controllo deve essere posizionato in alto a sinistra nella mappa, con tutti i relativi elementi secondari che "scorrono" verso l'alto al centro.
  • TOP_RIGHT indica che il controllo deve essere posizionato in alto a destra nella mappa, con eventuali elementi secondari del controllo che "scorrono" verso l'alto al centro.
  • LEFT_TOP indica che il controllo deve essere posizionato in alto a sinistra nella mappa, ma sotto qualsiasi elemento TOP_LEFT.
  • RIGHT_TOP indica che il controllo deve essere posizionato in alto a destra nella mappa, ma sotto qualsiasi elemento TOP_RIGHT.
  • LEFT_CENTER indica che il controllo deve essere posizionato lungo il lato sinistro della mappa, centrato tra le posizioni TOP_LEFT e BOTTOM_LEFT.
  • RIGHT_CENTER indica che il controllo deve essere posizionato lungo il lato destro della mappa, centrato tra le posizioni TOP_RIGHT e BOTTOM_RIGHT.
  • LEFT_BOTTOM indica che il controllo deve essere posizionato in basso a sinistra nella mappa, ma sopra qualsiasi elemento BOTTOM_LEFT.
  • RIGHT_BOTTOM indica che il controllo deve essere posizionato in basso a destra nella mappa, ma sopra qualsiasi elemento BOTTOM_RIGHT.
  • BOTTOM_CENTER indica che il controllo deve essere posizionato in basso al centro della mappa.
  • BOTTOM_LEFT indica che il controllo deve essere posizionato in basso a sinistra nella mappa, con eventuali elementi secondari del controllo che "scorrono" verso il centro in basso.
  • BOTTOM_RIGHT indica che il controllo deve essere posizionato in basso a destra nella mappa, con eventuali elementi secondari del controllo che "scorrono" verso il centro in basso.

Tieni presente che queste posizioni possono coincidere con quelle degli elementi dell'interfaccia utente di cui non puoi modificare i posizionamenti (ad esempio i copyright e il logo di Google). In questi casi, i controlli scorreranno secondo la logica annotata per ogni posizione e verranno visualizzati il più vicino possibile alla posizione indicata.

L'esempio seguente mostra una mappa semplice con tutti i controlli attivati, in posizioni diverse.

TypeScript

function initMap(): void {
  const map = new google.maps.Map(
    document.getElementById("map") as HTMLElement,
    {
      zoom: 12,
      center: { lat: -28.643387, lng: 153.612224 },
      mapTypeControl: true,
      mapTypeControlOptions: {
        style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
        position: google.maps.ControlPosition.TOP_CENTER,
      },
      zoomControl: true,
      zoomControlOptions: {
        position: google.maps.ControlPosition.LEFT_CENTER,
      },
      scaleControl: true,
      streetViewControl: true,
      streetViewControlOptions: {
        position: google.maps.ControlPosition.LEFT_TOP,
      },
      fullscreenControl: true,
    }
  );
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    zoom: 12,
    center: { lat: -28.643387, lng: 153.612224 },
    mapTypeControl: true,
    mapTypeControlOptions: {
      style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
      position: google.maps.ControlPosition.TOP_CENTER,
    },
    zoomControl: true,
    zoomControlOptions: {
      position: google.maps.ControlPosition.LEFT_CENTER,
    },
    scaleControl: true,
    streetViewControl: true,
    streetViewControlOptions: {
      position: google.maps.ControlPosition.LEFT_TOP,
    },
    fullscreenControl: true,
  });
}

window.initMap = initMap;
Visualizza esempio

Prova Samples

Controlli personalizzati

Oltre a modificare lo stile e la posizione dei controlli API esistenti, puoi creare controlli personalizzati per gestire l'interazione con l'utente. I controlli sono widget fissi che fluttuano in cima a una mappa in posizioni assolute, al contrario degli overlay, che si muovono insieme alla mappa sottostante. Fondamentalmente, un controllo è un elemento <div> che ha una posizione assoluta sulla mappa, mostra all'utente alcune UI e gestisce l'interazione con l'utente o con la mappa, generalmente tramite un gestore di eventi.

Per creare un controllo personalizzato, sono necessarie alcune regole. Tuttavia, le seguenti linee guida possono fungere da best practice:

  • Definisci il codice CSS appropriato per la visualizzazione degli elementi di controllo.
  • Gestisci l'interazione con l'utente o la mappa utilizzando i gestori di eventi per le modifiche alle proprietà della mappa o gli eventi utente (ad esempio, gli eventi 'click').
  • Crea un elemento <div> per mantenere il controllo e aggiungilo alla proprietà controls di Map.

Ognuna di queste problematiche è trattata di seguito.

Disegno di controlli personalizzati

Sei tu a decidere come ottenere il tuo controllo. In genere, consigliamo di collocare l'intera presentazione di controllo in un singolo elemento <div> in modo da poter manipolare il controllo come un'unica unità. Utilizzeremo questo pattern di progettazione negli esempi riportati di seguito.

La progettazione di controlli accattivanti richiede una certa conoscenza della struttura CSS e DOM. Il codice seguente mostra una funzione per creare un elemento pulsante che panoramica la mappa in modo che sia centrata su Chicago.

function createCenterControl(map) {
  const controlButton = document.createElement("button");

  // Set CSS for the control.
  controlButton.style.backgroundColor = "#fff";
  controlButton.style.border = "2px solid #fff";
  controlButton.style.borderRadius = "3px";
  controlButton.style.boxShadow = "0 2px 6px rgba(0,0,0,.3)";
  controlButton.style.color = "rgb(25,25,25)";
  controlButton.style.cursor = "pointer";
  controlButton.style.fontFamily = "Roboto,Arial,sans-serif";
  controlButton.style.fontSize = "16px";
  controlButton.style.lineHeight = "38px";
  controlButton.style.margin = "8px 0 22px";
  controlButton.style.padding = "0 5px";
  controlButton.style.textAlign = "center";

  controlButton.textContent = "Center Map";
  controlButton.title = "Click to recenter the map";
  controlButton.type = "button";

  // Setup the click event listeners: simply set the map to Chicago.
  controlButton.addEventListener("click", () => {
    map.setCenter(chicago);
  });

  return controlButton;
}

Gestione degli eventi dai controlli personalizzati

Affinché un controllo sia utile, deve effettivamente eseguire un'azione. Spetta a te decidere ciò che può fare il controllo. Il controllo può rispondere all'input utente o ai cambiamenti dello stato di Map.

Per rispondere all'input utente, utilizza addEventListener(), che gestisce gli eventi DOM supportati. Il seguente snippet di codice aggiunge un listener per l'evento 'click' del browser. Tieni presente che questo evento viene ricevuto dal DOM, non dalla mappa.

// Setup the click event listener: set the map to center on Chicago
var chicago = {lat: 41.850, lng: -87.650};

controlButton.addEventListener('click', () => {
  map.setCenter(chicago);
});

Rendere accessibili i controlli personalizzati

Per assicurarti che i controlli ricevano gli eventi della tastiera e vengano visualizzati correttamente dagli screen reader:

  • Utilizza sempre gli elementi HTML nativi per pulsanti, elementi dei moduli ed etichette. Utilizza un elemento DIV solo come contenitore per l'archiviazione dei controlli nativi; non riutilizzare mai un DIV come elemento interattivo dell'interfaccia utente.
  • Utilizza l'elemento label, l'attributo title o l'attributo aria-label se appropriato, per fornire informazioni su un elemento dell'interfaccia utente.

Posizionamento di controlli personalizzati

I controlli personalizzati vengono posizionati sulla mappa posizionandoli nelle posizioni appropriate all'interno della proprietà controls dell'oggetto Map. Questa proprietà contiene un array di google.maps.ControlPosition. Per aggiungere un controllo personalizzato alla mappa, aggiungi Node (in genere <div>) a un ControlPosition appropriato. Per informazioni su queste posizioni, consulta la sezione Posizionamento del controllo in alto.

Ogni ControlPosition memorizza una MVCArray dei controlli visualizzati in quella posizione. Di conseguenza, quando i controlli vengono aggiunti o rimossi dalla posizione, l'API li aggiorna di conseguenza.

L'API posiziona i controlli in ogni posizione in base all'ordine di una proprietà index; i controlli con un indice più basso vengono posizionati per primi. Ad esempio, due controlli personalizzati nella posizione BOTTOM_RIGHT verranno configurati in base a questo ordine di indice, con la precedenza i valori di indice più bassi. Per impostazione predefinita, tutti i controlli personalizzati vengono inseriti dopo aver inserito eventuali controlli predefiniti dell'API. Puoi ignorare questo comportamento impostando la proprietà index di un controllo su un valore negativo. I controlli personalizzati non possono essere posizionati a sinistra del logo o a destra del copyright.

Il codice seguente crea un nuovo controllo personalizzato (il suo costruttore non è mostrato) e lo aggiunge alla mappa nella posizione TOP_RIGHT.

var map = new google.maps.Map(document.getElementById('map'), mapOptions);

// Create a DIV to attach the control UI to the Map.
const centerControlDiv = document.createElement("div");

// Create the control. This code calls a function that
// creates a new instance of a button control.
const centerControl = createCenterControl(map);

// Append the control to the DIV.
centerControlDiv.appendChild(centerControl);

// Add the control to the map at a designated control position
// by pushing it on the position's array. This code will
// implicitly add the control to the DOM, through the Map
// object. You should not attach the control manually.
map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv);

Esempio di controllo personalizzato

Il seguente controllo è semplice (anche se non particolarmente utile) e combina i pattern mostrati sopra. Questo controllo risponde agli eventi 'click' del DOM centrando la mappa in una determinata posizione predefinita:

TypeScript

let map: google.maps.Map;

const chicago = { lat: 41.85, lng: -87.65 };

/**
 * Creates a control that recenters the map on Chicago.
 */
 function createCenterControl(map) {
  const controlButton = document.createElement('button');

  // Set CSS for the control.
  controlButton.style.backgroundColor = '#fff';
  controlButton.style.border = '2px solid #fff';
  controlButton.style.borderRadius = '3px';
  controlButton.style.boxShadow = '0 2px 6px rgba(0,0,0,.3)';
  controlButton.style.color = 'rgb(25,25,25)';
  controlButton.style.cursor = 'pointer';
  controlButton.style.fontFamily = 'Roboto,Arial,sans-serif';
  controlButton.style.fontSize = '16px';
  controlButton.style.lineHeight = '38px';
  controlButton.style.margin = '8px 0 22px';
  controlButton.style.padding = '0 5px';
  controlButton.style.textAlign = 'center';

  controlButton.textContent = 'Center Map';
  controlButton.title = 'Click to recenter the map';
  controlButton.type = 'button';

  // Setup the click event listeners: simply set the map to Chicago.
  controlButton.addEventListener('click', () => {
    map.setCenter(chicago);
  });

  return controlButton;
}

function initMap() {
  map = new google.maps.Map(document.getElementById('map') as HTMLElement, {
    zoom: 12,
    center: chicago,
  });

  // Create the DIV to hold the control.
  const centerControlDiv = document.createElement('div');
  // Create the control.
  const centerControl = createCenterControl(map);
  // Append the control to the DIV.
  centerControlDiv.appendChild(centerControl);

  map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv);
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

let map;
const chicago = { lat: 41.85, lng: -87.65 };

/**
 * Creates a control that recenters the map on Chicago.
 */
function createCenterControl(map) {
  const controlButton = document.createElement("button");

  // Set CSS for the control.
  controlButton.style.backgroundColor = "#fff";
  controlButton.style.border = "2px solid #fff";
  controlButton.style.borderRadius = "3px";
  controlButton.style.boxShadow = "0 2px 6px rgba(0,0,0,.3)";
  controlButton.style.color = "rgb(25,25,25)";
  controlButton.style.cursor = "pointer";
  controlButton.style.fontFamily = "Roboto,Arial,sans-serif";
  controlButton.style.fontSize = "16px";
  controlButton.style.lineHeight = "38px";
  controlButton.style.margin = "8px 0 22px";
  controlButton.style.padding = "0 5px";
  controlButton.style.textAlign = "center";
  controlButton.textContent = "Center Map";
  controlButton.title = "Click to recenter the map";
  controlButton.type = "button";
  // Setup the click event listeners: simply set the map to Chicago.
  controlButton.addEventListener("click", () => {
    map.setCenter(chicago);
  });
  return controlButton;
}

function initMap() {
  map = new google.maps.Map(document.getElementById("map"), {
    zoom: 12,
    center: chicago,
  });

  // Create the DIV to hold the control.
  const centerControlDiv = document.createElement("div");
  // Create the control.
  const centerControl = createCenterControl(map);

  // Append the control to the DIV.
  centerControlDiv.appendChild(centerControl);
  map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv);
}

window.initMap = initMap;
Visualizza esempio

Prova Samples

Aggiunta dello stato ai controlli

I controlli possono anche archiviare lo stato. L'esempio seguente è simile a quello mostrato in precedenza, ma il controllo contiene un pulsante "Imposta casa" aggiuntivo che imposta il controllo in modo che mostri una nuova posizione come casa. Per farlo, creiamo una proprietà home_ all'interno del controllo per archiviare questo stato e fornire getter e setter per quello stato.

TypeScript

let map: google.maps.Map;

const chicago: google.maps.LatLngLiteral = { lat: 41.85, lng: -87.65 };

/**
 * The CenterControl adds a control to the map that recenters the map on
 * Chicago.
 */
class CenterControl {
  private map_: google.maps.Map;
  private center_: google.maps.LatLng;
  constructor(
    controlDiv: HTMLElement,
    map: google.maps.Map,
    center: google.maps.LatLngLiteral
  ) {
    this.map_ = map;
    // Set the center property upon construction
    this.center_ = new google.maps.LatLng(center);
    controlDiv.style.clear = "both";

    // Set CSS for the control border
    const goCenterUI = document.createElement("button");

    goCenterUI.id = "goCenterUI";
    goCenterUI.title = "Click to recenter the map";
    controlDiv.appendChild(goCenterUI);

    // Set CSS for the control interior
    const goCenterText = document.createElement("div");

    goCenterText.id = "goCenterText";
    goCenterText.innerHTML = "Center Map";
    goCenterUI.appendChild(goCenterText);

    // Set CSS for the setCenter control border
    const setCenterUI = document.createElement("button");

    setCenterUI.id = "setCenterUI";
    setCenterUI.title = "Click to change the center of the map";
    controlDiv.appendChild(setCenterUI);

    // Set CSS for the control interior
    const setCenterText = document.createElement("div");

    setCenterText.id = "setCenterText";
    setCenterText.innerHTML = "Set Center";
    setCenterUI.appendChild(setCenterText);

    // Set up the click event listener for 'Center Map': Set the center of
    // the map
    // to the current center of the control.
    goCenterUI.addEventListener("click", () => {
      const currentCenter = this.center_;

      this.map_.setCenter(currentCenter);
    });

    // Set up the click event listener for 'Set Center': Set the center of
    // the control to the current center of the map.
    setCenterUI.addEventListener("click", () => {
      const newCenter = this.map_.getCenter()!;

      if (newCenter) {
        this.center_ = newCenter;
      }
    });
  }
}

function initMap(): void {
  map = new google.maps.Map(document.getElementById("map") as HTMLElement, {
    zoom: 12,
    center: chicago,
  });

  // Create the DIV to hold the control and call the CenterControl()
  // constructor passing in this DIV.
  const centerControlDiv = document.createElement("div");
  const control = new CenterControl(centerControlDiv, map, chicago);

  // @ts-ignore
  centerControlDiv.index = 1;
  centerControlDiv.style.paddingTop = "10px";
  map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv);
}

declare global {
  interface Window {
    initMap: () => void;
  }
}
window.initMap = initMap;

JavaScript

let map;
const chicago = { lat: 41.85, lng: -87.65 };

/**
 * The CenterControl adds a control to the map that recenters the map on
 * Chicago.
 */
class CenterControl {
  map_;
  center_;
  constructor(controlDiv, map, center) {
    this.map_ = map;
    // Set the center property upon construction
    this.center_ = new google.maps.LatLng(center);
    controlDiv.style.clear = "both";

    // Set CSS for the control border
    const goCenterUI = document.createElement("button");

    goCenterUI.id = "goCenterUI";
    goCenterUI.title = "Click to recenter the map";
    controlDiv.appendChild(goCenterUI);

    // Set CSS for the control interior
    const goCenterText = document.createElement("div");

    goCenterText.id = "goCenterText";
    goCenterText.innerHTML = "Center Map";
    goCenterUI.appendChild(goCenterText);

    // Set CSS for the setCenter control border
    const setCenterUI = document.createElement("button");

    setCenterUI.id = "setCenterUI";
    setCenterUI.title = "Click to change the center of the map";
    controlDiv.appendChild(setCenterUI);

    // Set CSS for the control interior
    const setCenterText = document.createElement("div");

    setCenterText.id = "setCenterText";
    setCenterText.innerHTML = "Set Center";
    setCenterUI.appendChild(setCenterText);
    // Set up the click event listener for 'Center Map': Set the center of
    // the map
    // to the current center of the control.
    goCenterUI.addEventListener("click", () => {
      const currentCenter = this.center_;

      this.map_.setCenter(currentCenter);
    });
    // Set up the click event listener for 'Set Center': Set the center of
    // the control to the current center of the map.
    setCenterUI.addEventListener("click", () => {
      const newCenter = this.map_.getCenter();

      if (newCenter) {
        this.center_ = newCenter;
      }
    });
  }
}

function initMap() {
  map = new google.maps.Map(document.getElementById("map"), {
    zoom: 12,
    center: chicago,
  });

  // Create the DIV to hold the control and call the CenterControl()
  // constructor passing in this DIV.
  const centerControlDiv = document.createElement("div");
  const control = new CenterControl(centerControlDiv, map, chicago);

  // @ts-ignore
  centerControlDiv.index = 1;
  centerControlDiv.style.paddingTop = "10px";
  map.controls[google.maps.ControlPosition.TOP_CENTER].push(centerControlDiv);
}

window.initMap = initMap;
Visualizza esempio

Prova Samples