Elementi di Place Details

Gli elementi Place Details e Place Details Compact sono elementi HTML che mostrano i dettagli di un luogo:

Utilizza lo strumento di personalizzazione per visualizzare l'impatto di diversi insiemi di proprietà sull'aspetto di un elemento Place Details e accedi al codice in HTML/CSS, Kotlin/XML e Swift.

Elemento Place Details

Fai clic su un indicatore sulla mappa per visualizzare i dettagli del luogo in un elemento Place Details.

PlaceDetailsElement supporta un'ampia gamma di elementi dei contenuti, tra cui l'orario di apertura completo, il sito web, il numero di telefono, il riepilogo basato sull'AI con fallback al riepilogo editoriale, i punti salienti specifici del tipo, le recensioni, il riepilogo delle recensioni basato sull'AI, il Plus Code e gli elenchi di funzionalità.

Per visualizzare i dettagli dei luoghi su una mappa, aggiungi un elemento gmp-place-details all'elemento gmp-map nella pagina HTML. Includi un elemento secondario, gmp-place-details-place-request, per selezionare il luogo. Può essere un oggetto Place, un ID luogo o il nome della risorsa di un luogo:

<gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID">
  <div class="widget-container" slot="control-inline-start-block-start">
    <gmp-place-details>
      <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
      <gmp-place-all-content></gmp-place-all-content>
    </gmp-place-details>
  </div>
  <gmp-advanced-marker></gmp-advanced-marker>
</gmp-map>

Configura i contenuti

Puoi controllare i contenuti specifici del luogo visualizzati dall'elemento gmp-place-details nidificando gli elementi secondari per selezionare e configurare i dettagli del luogo, come mostrato in questo esempio:

        <gmp-place-details>
            <gmp-place-details-place-request
                place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
            <gmp-place-name></gmp-place-name>
            <gmp-place-address></gmp-place-address>
            <gmp-place-rating></gmp-place-rating>
            <gmp-place-type></gmp-place-type>
            <gmp-place-price></gmp-place-price>
            <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
            <gmp-place-opening-hours></gmp-place-opening-hours>
            <gmp-place-website></gmp-place-website>
            <gmp-place-phone-number></gmp-place-phone-number>
            <gmp-place-summary></gmp-place-summary>
            <gmp-place-type-specific-highlights></gmp-place-type-specific-highlights>
            <gmp-place-review-summary></gmp-place-review-summary>
            <gmp-place-reviews></gmp-place-reviews>
            <gmp-place-feature-list></gmp-place-feature-list>
        </gmp-place-details>

Ogni elemento secondario dei contenuti seleziona un dettaglio del luogo corrispondente da visualizzare: gmp-place-address seleziona l'indirizzo del luogo, gmp-place-price seleziona il livello di prezzo del luogo e così via. Gli elementi gmp-place-summary e gmp-place-review-summary forniscono rispettivamente un riepilogo basato sull'AI del luogo e delle relative recensioni. L'ordine degli elementi secondari è irrilevante, poiché i dettagli selezionati vengono sempre visualizzati in un ordine predefinito fisso. Vengono visualizzati solo gli elementi dei contenuti che includi, quindi includi gmp-place-name per mostrare il nome del luogo.

Alcuni di questi elementi possono essere ulteriormente configurati utilizzando attributi specifici per i contenuti:

  • L'elemento gmp-place-media viene utilizzato per visualizzare una singola foto e include un attributo lightbox-preferred che apre la foto in un lightbox quando viene selezionata. Lightbox è disattivato per impostazione predefinita.
  • L'elemento gmp-place-attribution viene utilizzato per mostrare l'origine della foto. Gli attributi light-scheme-color e dark-scheme-color vengono utilizzati per impostare il colore del testo dell'attribuzione in modalità Luce e modalità Buio.

Per saperne di più su tutti gli elementi dei contenuti supportati, consulta la documentazione di riferimento sulla personalizzazione dei contenuti dei Place Widget.

Per semplicità, puoi anche utilizzare gmp-place-all-content per mostrare tutti i dettagli disponibili nell'elemento Place Details o gmp-place-standard-content per visualizzare una configurazione standard. Entrambi questi elementi includono il nome del luogo.

Configura l'aspetto

L'intervallo di larghezza consigliato per l'elemento gmp-place-details è 250 px-400 px. Le larghezze inferiori a 250 px potrebbero non essere visualizzate correttamente. Imposta l'altezza in base alla tua applicazione. L'elemento Place Details è progettato per scorrere all'interno dello spazio assegnato, se necessario.

L'elemento gmp-place-details supporta anche una serie di proprietà CSS personalizzate per configurare i colori e i caratteri dell'elemento. Per maggiori dettagli, consulta Stile personalizzato del Places UI Kit.

Visualizza l'esempio di codice completo

JavaScript

// Use querySelector to select elements for interaction.
const map = document.querySelector('gmp-map');
const placeDetails = document.querySelector('gmp-place-details');
const placeDetailsRequest = document.querySelector(
    'gmp-place-details-place-request'
);
const marker = document.querySelector('gmp-advanced-marker');

async function init() {
    // Request needed libraries.
    await Promise.all([
        google.maps.importLibrary('maps'),
        google.maps.importLibrary('marker'),
        google.maps.importLibrary('places'),
    ]);

    // Hide the map type control.
    map.innerMap.setOptions({ mapTypeControl: false });

    // Function to update map and marker based on place details
    const updateMapAndMarker = () => {
        if (placeDetails.place?.location) {
            map.innerMap.panTo(placeDetails.place.location);
            map.innerMap.setZoom(16); // Set zoom after panning if needed
            marker.position = placeDetails.place.location;
            marker.collisionBehavior = 'REQUIRED_AND_HIDES_OPTIONAL';
            marker.style.display = 'block';
        }
    };

    // Set up map once widget is loaded.
    placeDetails.addEventListener('gmp-load', () => {
        updateMapAndMarker();
    });

    // Add an event listener to handle clicks.
    map.innerMap.addListener('click', (event) => {
        marker.position = null;
        event.stop();
        if ('placeId' in event && event.placeId) {
            // Fire when the user clicks a POI.
            placeDetailsRequest.place = event.placeId;
            updateMapAndMarker();
        } else {
            // Fire when the user clicks the map (not on a POI).
            console.log('No place was selected.');
            marker.style.display = 'none';
        }
    });
}

void init();

CSS

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
    height: 100%;
    margin: 0;
    padding: 0;
}

.container {
    display: flex;
    height: 100vh;
    width: 100%;
}

gmp-map {
    flex-grow: 1;
}

.ui-panel {
    width: 400px;
    margin-left: 20px;
    margin-top: 10px;
}

gmp-place-details {
    width: 100%;
    margin: 0;
    border: none;
}

HTML

<!doctype html>
<html>
    <head>
        <title>Place Details with Google Maps</title>
        <meta charset="utf-8" />
        <link rel="stylesheet" type="text/css" href="style.css" />
        <script type="module" src="./index.js"></script>
        <script>
            // prettier-ignore
            (g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
                key: "GOOGLE_MAPS_API_KEY"
            });
        </script>
    </head>
    <body>
        <div class="container">
            <!-- map-id is required to use advanced markers. See https://developers.google.com/maps/documentation/javascript/map-ids/mapid-over. -->
            <gmp-map zoom="17" map-id="DEMO_MAP_ID">
                <gmp-advanced-marker></gmp-advanced-marker>
            </gmp-map>
            <div class="ui-panel">
                <gmp-place-details>
                    <gmp-place-details-place-request
                        place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
                    <gmp-place-content-config>
                        <gmp-place-address></gmp-place-address>
                        <gmp-place-rating></gmp-place-rating>
                        <gmp-place-type></gmp-place-type>
                        <gmp-place-price></gmp-place-price>
                        <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
                        <gmp-place-opening-hours></gmp-place-opening-hours>
                        <gmp-place-website></gmp-place-website>
                        <gmp-place-phone-number></gmp-place-phone-number>
                        <gmp-place-summary></gmp-place-summary>
                        <gmp-place-type-specific-highlights></gmp-place-type-specific-highlights>
                        <gmp-place-review-summary></gmp-place-review-summary>
                        <gmp-place-reviews></gmp-place-reviews>
                        <gmp-place-feature-list></gmp-place-feature-list>
                    </gmp-place-content-config>
                </gmp-place-details>
            </div>
        </div>
    </body>
</html>

Elemento Place Details Compact

Fai clic su un indicatore sulla mappa per visualizzare i dettagli del luogo in un elemento Place Details Compact.

Il componente PlaceDetailsCompactElement esegue il rendering dei dettagli di un luogo selezionato utilizzando uno spazio minimo. Questo può essere utile in una finestra informativa che mette in evidenza un luogo su una mappa, in un'esperienza sui social media come la condivisione di una posizione in una chat, come suggerimento per selezionare la tua posizione attuale o all'interno di un articolo multimediale per fare riferimento al luogo su Google Maps. PlaceDetailsCompactElement può mostrare nome visualizzato, indirizzo, valutazione, tipo, prezzo, icona di accessibilità, stato di apertura e una singola foto. Può essere visualizzato in orizzontale o in verticale, a seconda dell'attributo orientation selezionato.

Nello snippet seguente, gmp-place-details-compact è configurato con orientation impostato su horizontal. Un attributo aggiuntivo, truncation-preferred, tronca determinati contenuti per adattarli a una riga anziché andare a capo. L'elemento gmp-place-details-compact contiene un elemento secondario, gmp-place-details-place-request, per selezionare il luogo. Può essere un oggetto Place, un ID luogo o il nome della risorsa di un luogo.

  <gmp-place-details-compact orientation="horizontal" truncation-preferred>
    <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
    <gmp-place-all-content></gmp-place-all-content>
  </gmp-place-details-compact>

Configura i contenuti

Puoi controllare i contenuti specifici del luogo visualizzati dall'elemento gmp-place-details-compact nidificando gli elementi secondari per selezionare e configurare i dettagli del luogo, come mostrato in questo snippet:

<gmp-place-details-compact orientation="horizontal" truncation-preferred>
  <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
  <gmp-place-media lightbox-preferred></gmp-place-media>
  <gmp-place-name></gmp-place-name>
  <gmp-place-rating></gmp-place-rating>
  <gmp-place-type></gmp-place-type>
  <gmp-place-price></gmp-place-price>
  <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
  <gmp-place-open-now-status></gmp-place-open-now-status>
  <gmp-place-attribution light-scheme-color="gray" dark-scheme-color="white"></gmp-place-attribution>
</gmp-place-details-compact>

Ogni elemento secondario dei contenuti seleziona un dettaglio del luogo corrispondente da visualizzare. L'ordine degli elementi secondari è irrilevante, poiché i dettagli selezionati vengono sempre visualizzati in un ordine predefinito fisso. Vengono visualizzati solo gli elementi dei contenuti che includi, quindi includi gmp-place-name per mostrare il nome del luogo. Alcuni di questi elementi possono essere ulteriormente configurati utilizzando attributi specifici dei contenuti.

Per saperne di più su tutti gli elementi dei contenuti supportati, consulta la documentazione di riferimento sulla personalizzazione dei contenuti dei Place Widget.

Per semplicità, puoi anche utilizzare gmp-place-all-content per mostrare tutti i dettagli disponibili nell'elemento Place Details Compact o gmp-place-standard-content per visualizzare una configurazione standard. Entrambi questi elementi includono il nome del luogo.

Configura l'aspetto

L'intervallo di larghezza consigliato per l'elemento gmp-place-details-compact con orientamento verticale è compreso tra 180 px e 300 px. Le larghezze inferiori a 160 px potrebbero non essere visualizzate correttamente. Non impostare un'altezza fissa.

L'intervallo di larghezza consigliato per l'elemento gmp-place-details-compact con orientamento orizzontale è compreso tra 180 px e 500 px. Le larghezze inferiori a 160 px potrebbero non essere visualizzate correttamente. Per larghezze inferiori a 350 px, l'immagine in miniatura non verrà mostrata. Non impostare un'altezza fissa.

L'elemento gmp-place-details-compact supporta anche una serie di proprietà CSS personalizzate per configurare i colori e i caratteri dell'elemento. Per maggiori dettagli, consulta Stile personalizzato del Places UI Kit.

Tieni presente che se l'elemento Place Details Compact viene aggiunto a una finestra informativa, lo stile personalizzato deve essere applicato direttamente all'elemento gmp-place-details-compact. Questo perché la finestra informativa fa parte del DOM shadow della mappa, pertanto gli stili CSS esterni non verranno applicati.

<gmp-place-details-compact
    orientation="horizontal"
    truncation-preferred
    style="
        width: 400px;
        padding: 0;
        margin: 0;
        border: none;
        background-color: transparent;
        color-scheme: light;
    ">
    <gmp-place-details-place-request
        place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>

Visualizza un esempio di codice completo

Questo esempio mostra come aggiungere un PlaceDetailsCompactElement a una mappa in modo programmatico utilizzando un InfoWindow e un AdvancedMarkerElement.

JavaScript

// Use querySelector to select elements for interaction.
const map = document.querySelector('gmp-map');
const placeDetails = document.querySelector('gmp-place-details-compact');
const placeDetailsRequest = document.querySelector(
    'gmp-place-details-place-request'
);
const marker = document.querySelector('gmp-advanced-marker');
async function init() {
    // Request needed libraries.
    void Promise.all([
        google.maps.importLibrary('marker'),
        google.maps.importLibrary('places'),
    ]);
    const { InfoWindow } = await google.maps.importLibrary('maps');

    await window.customElements.whenDefined('gmp-map');
    // Set the inner map options.
    map.innerMap.setOptions({
        mapTypeControl: false,
        streetViewControl: false,
    });

    await window.customElements.whenDefined('gmp-advanced-marker');
    marker.collisionBehavior = 'REQUIRED_AND_HIDES_OPTIONAL';

    const infoWindow = new InfoWindow();
    infoWindow.addListener('close', () => {
        marker.position = null;
    });

    const showInfoWindow = () => {
        if (infoWindow.isOpen) return;
        infoWindow.setContent(placeDetails);
        infoWindow.open({ anchor: marker });
    };

    placeDetails.addEventListener('gmp-load', () => {
        // For the initial load case, with no user click, we fall back to the place's location, and ensure the map has a center set and the InfoWindow is show.
        // (The clicked POI LatLng will be a more natural marker position, when available.)
        if (!map.center && placeDetails.place?.location) {
            map.center = marker.position = placeDetails.place.location;
            showInfoWindow();
        }
    });

    // Add an event listener to handle clicks.
    map.innerMap.addListener('click', (event) => {
        event.stop();

        if ('placeId' in event) {
            // When the user clicks a POI.
            marker.position = event.latLng;
            placeDetailsRequest.place = event.placeId;
            showInfoWindow();
        } else {
            // When the user clicks the map (not on a POI).
            marker.position = null;
            placeDetailsRequest.place = null;
            console.log('No place was selected.');
        }
    });
}
void init();

CSS

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
    height: 100%;
    margin: 0;
    padding: 0;
}

.container {
    display: flex;
    height: 100vh;
    width: 100%;
}

gmp-map {
    flex-grow: 1;
}

HTML

<!doctype html>
<html>
    <head>
        <title>Place Details Compact with Google Maps</title>
        <meta charset="utf-8" />
        <link rel="stylesheet" type="text/css" href="style.css" />
        <script type="module" src="./index.js"></script>
        <script>
            // prettier-ignore
            (g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
                key: "GOOGLE_MAPS_API_KEY"
            });
        </script>
    </head>
    <body>
        <div class="container">
            <!-- map-id is required to use Advanced Markers. See https://developers.google.com/maps/documentation/javascript/map-ids/mapid-over. -->
            <gmp-map zoom="17" map-id="DEMO_MAP_ID">
                <gmp-advanced-marker></gmp-advanced-marker>
            </gmp-map>
        </div>
        <!--
        The gmp-place-details-compact element is styled inline because it is
        conditionally rendered and moved into the info window, which is
        part of the map's shadow DOM.
        -->
        <gmp-place-details-compact
            orientation="horizontal"
            truncation-preferred
            style="
                width: 400px;
                padding: 0;
                margin: 0;
                border: none;
                background-color: transparent;
                color-scheme: light;
            ">
            <gmp-place-details-place-request
                place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
            <gmp-place-content-config>
                <gmp-place-media lightbox-preferred></gmp-place-media>
                <gmp-place-rating></gmp-place-rating>
                <gmp-place-type></gmp-place-type>
                <gmp-place-price></gmp-place-price>
                <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
                <gmp-place-open-now-status></gmp-place-open-now-status>
                <gmp-place-attribution
                    light-scheme-color="gray"
                    dark-scheme-color="white"></gmp-place-attribution>
            </gmp-place-content-config>
        </gmp-place-details-compact>
    </body>
</html>