Elementi di Place Details

Seleziona la piattaforma: Android iOS JavaScript

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

Elemento Place Details

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

Il PlaceDetailsElement supporta un'ampia gamma di elementi di contenuti, tra cui orari di apertura completi, sito web, numero di telefono, riepilogo basato sull'AI con fallback al riepilogo editoriale, punti salienti specifici per tipo, recensioni, riepilogo delle recensioni basato sull'AI, oltre a elenchi di codici e funzionalità.

Per visualizzare i dettagli del luogo 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>

Configurare i contenuti

Puoi controllare i contenuti di un luogo specifico visualizzati dall'elemento gmp-place-details utilizzando un elemento gmp-place-content-config nidificato 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-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>

L'elemento gmp-place-content-config stesso contiene una serie di elementi di contenuti secondari e ognuno 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 un riepilogo basato sull'AI del luogo e delle relative recensioni, rispettivamente. L'ordine degli elementi secondari è irrilevante, in quanto i dettagli selezionati vengono sempre visualizzati in un ordine predefinito fisso.

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 una lightbox quando viene selezionata. La lightbox è disattivata per impostazione predefinita.
  • L'elemento gmp-place-attribution viene utilizzato per visualizzare l'origine della foto. Gli attributi light-scheme-color e dark-scheme-color vengono utilizzati per impostare il colore del testo di attribuzione in modalità chiara e scura.

Per ulteriori informazioni su tutti gli elementi di contenuti supportati, consulta la documentazione di riferimento di PlaceContentConfigElement.

Per semplicità, l'elemento gmp-place-content-config può essere sostituito con gmp-place-all-content per mostrare tutti i dettagli disponibili nell'elemento Dettagli luogo o con gmp-place-standard-content per visualizzare una configurazione standard.

Configurare l'aspetto

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

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 Stili personalizzati di 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 initMap() {
    // 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 && 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 =
                google.maps.CollisionBehavior.REQUIRED_AND_HIDES_OPTIONAL;
            marker.style.display = 'block';
        }
    };
    // Set up map once widget is loaded.
    placeDetails.addEventListener('gmp-load', (event) => {
        updateMapAndMarker();
    });
    // Add an event listener to handle clicks.
    map.innerMap.addListener('click', async (event) => {
        marker.position = null;
        event.stop();
        if (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';
        }
    });
}
initMap();

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" defer></script>
        <!-- prettier-ignore -->
        <script>
      (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: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "weekly"});
    </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>

Prova campione

Elemento compatto Place Details

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

Il PlaceDetailsCompactElement mostra i 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. Il PlaceDetailsCompactElement può mostrare nome visualizzato, indirizzo, valutazione, tipo, prezzo, icona di accessibilità, stato di apertura e una singola foto. Può essere visualizzato orizzontalmente o verticalmente, come selezionato dall'attributo orientation.

Nel seguente snippet, 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>

Configurare i contenuti

Puoi controllare i contenuti di un luogo specifico visualizzati dall'elemento gmp-place-details-compact utilizzando un elemento gmp-place-content-config nidificato per selezionare e configurare i dettagli del luogo, come mostrato in questo snippet:

<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>

L'elemento gmp-place-content-config stesso contiene una serie di elementi di contenuti secondari e ognuno seleziona un dettaglio del luogo corrispondente da visualizzare. L'ordine degli elementi secondari è irrilevante, in quanto i dettagli selezionati vengono sempre visualizzati in un ordine predefinito fisso. Alcuni di questi elementi possono essere configurati ulteriormente utilizzando attributi specifici per i contenuti.

Per ulteriori informazioni su tutti gli elementi di contenuti supportati, consulta la documentazione di riferimento di PlaceContentConfigElement.

Per semplicità, l'elemento gmp-place-content-config può essere sostituito con gmp-place-all-content per mostrare tutti i dettagli disponibili nell'elemento Dettagli luogo compatti oppure con gmp-place-standard-content per visualizzare una configurazione standard.

Configurare l'aspetto

L'intervallo di larghezza consigliato per l'elemento gmp-place-details-compact in orientamento verticale è 180-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 in orientamento orizzontale è 180-500 px. Le larghezze inferiori a 160 px potrebbero non essere visualizzate correttamente. Con 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 Stili personalizzati di 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 ombra della mappa, quindi 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 l'aggiunta di 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 initMap() {
    // Request needed libraries.
    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 =
        google.maps.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', (event) => {
        // 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) {
            map.center = marker.position = placeDetails.place.location;
            showInfoWindow();
        }
    });
    // Add an event listener to handle clicks.
    map.innerMap.addListener('click', async (event) => {
        event.stop();
        if (event.placeId) {
            // 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.');
        }
    });
}
initMap();

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" defer></script>
        <!-- prettier-ignore -->
        <script>
      (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: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "weekly"});
    </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>

Prova campione