Resumos com tecnologia de IA

Confira o código-fonte de exemplo completo

Pesquise lugares para ver os resumos gerados com IA. Algumas pesquisas sugeridas:

  • "Hotel" para resumos de bairros.
  • "EV charging station" para resumos de comodidades de EVCS.
  • Qualquer restaurante ou empresa para resumos de lugares e resumos das avaliações.

TypeScript

// Define DOM elements.
const mapElement = document.querySelector('gmp-map')!;
const placeAutocomplete = document.querySelector('gmp-place-autocomplete')!;
const summaryPanel = document.getElementById('summary-panel')!;
const placeName = document.getElementById('place-name')!;
const placeAddress = document.getElementById('place-address')!;
const tabContainer = document.getElementById('tab-container')!;
const summaryContent = document.getElementById('summary-content')!;
const aiDisclosure = document.getElementById('ai-disclosure')!;
const flagContentLink = document.getElementById(
    'flag-content-link'
) as HTMLAnchorElement;

let innerMap: google.maps.Map;
let marker: google.maps.marker.AdvancedMarkerElement;

async function init(): Promise<void> {
    // Request needed libraries.
    const [{ AdvancedMarkerElement }] = await Promise.all([
        google.maps.importLibrary('marker'),
        google.maps.importLibrary('places'),
    ]);

    innerMap = mapElement.innerMap;
    innerMap.setOptions({
        mapTypeControl: false,
        streetViewControl: false,
        fullscreenControl: false,
    });

    // Bind autocomplete bounds to map bounds.
    innerMap.addListener('bounds_changed', () => {
        placeAutocomplete.locationRestriction = innerMap.getBounds()!;
    });

    // Create the marker.
    marker = new AdvancedMarkerElement({
        map: innerMap,
    });

    // Handle selection of an autocomplete result.
    placeAutocomplete.addEventListener(
        'gmp-select',
        async ({ placePrediction }) => {
            const place = placePrediction.toPlace();

            // Fetch all summary fields.
            await place.fetchFields({
                fields: [
                    'displayName',
                    'formattedAddress',
                    'location',
                    'generativeSummary',
                    'neighborhoodSummary',
                    'reviewSummary',
                    'evChargeAmenitySummary',
                ],
            });

            // Update the map viewport and position the marker.
            if (place.viewport) {
                innerMap.fitBounds(place.viewport);
            } else {
                innerMap.setCenter(place.location!);
                innerMap.setZoom(17);
            }
            marker.position = place.location;

            // Update the panel UI.
            updateSummaryPanel(place);
        }
    );
}

function updateSummaryPanel(place: google.maps.places.Place) {
    // Reset UI
    summaryPanel.classList.remove('hidden');
    tabContainer.innerHTML = ''; // innerHTML is OK here since we're clearing known child elements.
    summaryContent.textContent = '';
    aiDisclosure.textContent = '';

    placeName.textContent = place.displayName || '';
    placeAddress.textContent = place.formattedAddress || '';

    let firstTabActivated = false;

    /**
     * Safe Helper: Accepts either a text string or a DOM Node (like a div or DocumentFragment).
     */
    const createTab = (
        label: string,
        content: string | Node,
        disclosure: string | null,
        flagUrl: string | null
    ) => {
        const btn = document.createElement('button');
        btn.className = 'tab-button';
        btn.textContent = label;

        btn.onclick = () => {
            // Do nothing if the tab is already active.
            if (btn.classList.contains('active')) {
                return;
            }

            // Manage the active class state.
            document.querySelectorAll('.tab-button').forEach((b) => {
                b.classList.remove('active');
            });
            btn.classList.add('active');

            if (typeof content === 'string') {
                summaryContent.textContent = content;
            } else {
                summaryContent.replaceChildren(content.cloneNode(true));
            }

            // Set the disclosure text.
            aiDisclosure.textContent = disclosure || 'AI-generated content.';

            // Add the content flag URI.
            if (flagUrl) {
                flagContentLink.href = flagUrl;
                flagContentLink.textContent = 'Report an issue';
            }
        };

        tabContainer.appendChild(btn);

        // Auto-select the first available summary.
        if (!firstTabActivated) {
            btn.click();
            firstTabActivated = true;
        }
    };

    // --- 1. Generative Summary (Place) ---
    if (place.generativeSummary?.overview) {
        createTab(
            'Overview',
            place.generativeSummary.overview,
            place.generativeSummary.disclosureText,
            place.generativeSummary.flagContentURI
        );
    }

    // --- 2. Review Summary ---
    if (place.reviewSummary?.text) {
        createTab(
            'Reviews',
            place.reviewSummary.text,
            place.reviewSummary.disclosureText,
            place.reviewSummary.flagContentURI
        );
    }

    // --- 3. Neighborhood Summary ---
    if (place.neighborhoodSummary?.overview?.content) {
        createTab(
            'Neighborhood',
            place.neighborhoodSummary.overview.content,
            place.neighborhoodSummary.disclosureText,
            place.neighborhoodSummary.flagContentURI
        );
    }

    // --- 4. EV Amenity Summary (uses content blocks)) ---
    if (place.evChargeAmenitySummary) {
        const evSummary = place.evChargeAmenitySummary;
        const evContainer = document.createDocumentFragment();

        // Helper to build a safe DOM section for EV categories.
        const createSection = (title: string, text: string) => {
            const wrapper = document.createElement('div');
            wrapper.style.marginBottom = '15px'; // Or use a CSS class

            const titleEl = document.createElement('strong');
            titleEl.textContent = title;

            const textEl = document.createElement('div');
            textEl.textContent = text;

            wrapper.appendChild(titleEl);
            wrapper.appendChild(textEl);
            return wrapper;
        };

        // Check and append each potential section
        if (evSummary.overview?.content) {
            evContainer.appendChild(
                createSection('Overview', evSummary.overview.content)
            );
        }
        if (evSummary.coffee?.content) {
            evContainer.appendChild(
                createSection('Coffee', evSummary.coffee.content)
            );
        }
        if (evSummary.restaurant?.content) {
            evContainer.appendChild(
                createSection('Food', evSummary.restaurant.content)
            );
        }
        if (evSummary.store?.content) {
            evContainer.appendChild(
                createSection('Shopping', evSummary.store.content)
            );
        }

        // Only add the tab if the container has children
        if (evContainer.hasChildNodes()) {
            createTab(
                'EV Amenities',
                evContainer, // Passing a Node instead of string
                evSummary.disclosureText,
                evSummary.flagContentURI
            );
        }
    }

    // Safely handle the empty state.
    if (!firstTabActivated) {
        const msg = document.createElement('em');
        msg.textContent =
            'No AI summaries are available for this specific location.';
        summaryContent.replaceChildren(msg);
        aiDisclosure.textContent = '';
    }
}

void init();

JavaScript

// Define DOM elements.
const mapElement = document.querySelector('gmp-map');
const placeAutocomplete = document.querySelector('gmp-place-autocomplete');
const summaryPanel = document.getElementById('summary-panel');
const placeName = document.getElementById('place-name');
const placeAddress = document.getElementById('place-address');
const tabContainer = document.getElementById('tab-container');
const summaryContent = document.getElementById('summary-content');
const aiDisclosure = document.getElementById('ai-disclosure');
const flagContentLink = document.getElementById('flag-content-link');

let innerMap;
let marker;

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

    innerMap = mapElement.innerMap;
    innerMap.setOptions({
        mapTypeControl: false,
        streetViewControl: false,
        fullscreenControl: false,
    });

    // Bind autocomplete bounds to map bounds.
    innerMap.addListener('bounds_changed', () => {
        placeAutocomplete.locationRestriction = innerMap.getBounds();
    });

    // Create the marker.
    marker = new AdvancedMarkerElement({
        map: innerMap,
    });

    // Handle selection of an autocomplete result.
    placeAutocomplete.addEventListener(
        'gmp-select',
        async ({ placePrediction }) => {
            const place = placePrediction.toPlace();

            // Fetch all summary fields.
            await place.fetchFields({
                fields: [
                    'displayName',
                    'formattedAddress',
                    'location',
                    'generativeSummary',
                    'neighborhoodSummary',
                    'reviewSummary',
                    'evChargeAmenitySummary',
                ],
            });

            // Update the map viewport and position the marker.
            if (place.viewport) {
                innerMap.fitBounds(place.viewport);
            } else {
                innerMap.setCenter(place.location);
                innerMap.setZoom(17);
            }
            marker.position = place.location;

            // Update the panel UI.
            updateSummaryPanel(place);
        }
    );
}

function updateSummaryPanel(place) {
    // Reset UI
    summaryPanel.classList.remove('hidden');
    tabContainer.innerHTML = ''; // innerHTML is OK here since we're clearing known child elements.
    summaryContent.textContent = '';
    aiDisclosure.textContent = '';

    placeName.textContent = place.displayName || '';
    placeAddress.textContent = place.formattedAddress || '';

    let firstTabActivated = false;

    /**
     * Safe Helper: Accepts either a text string or a DOM Node (like a div or DocumentFragment).
     */
    const createTab = (label, content, disclosure, flagUrl) => {
        const btn = document.createElement('button');
        btn.className = 'tab-button';
        btn.textContent = label;

        btn.onclick = () => {
            // Do nothing if the tab is already active.
            if (btn.classList.contains('active')) {
                return;
            }

            // Manage the active class state.
            document.querySelectorAll('.tab-button').forEach((b) => {
                b.classList.remove('active');
            });
            btn.classList.add('active');

            if (typeof content === 'string') {
                summaryContent.textContent = content;
            } else {
                summaryContent.replaceChildren(content.cloneNode(true));
            }

            // Set the disclosure text.
            aiDisclosure.textContent = disclosure || 'AI-generated content.';

            // Add the content flag URI.
            if (flagUrl) {
                flagContentLink.href = flagUrl;
                flagContentLink.textContent = 'Report an issue';
            }
        };

        tabContainer.appendChild(btn);

        // Auto-select the first available summary.
        if (!firstTabActivated) {
            btn.click();
            firstTabActivated = true;
        }
    };

    // --- 1. Generative Summary (Place) ---
    if (place.generativeSummary?.overview) {
        createTab(
            'Overview',
            place.generativeSummary.overview,
            place.generativeSummary.disclosureText,
            place.generativeSummary.flagContentURI
        );
    }

    // --- 2. Review Summary ---
    if (place.reviewSummary?.text) {
        createTab(
            'Reviews',
            place.reviewSummary.text,
            place.reviewSummary.disclosureText,
            place.reviewSummary.flagContentURI
        );
    }

    // --- 3. Neighborhood Summary ---
    if (place.neighborhoodSummary?.overview?.content) {
        createTab(
            'Neighborhood',
            place.neighborhoodSummary.overview.content,
            place.neighborhoodSummary.disclosureText,
            place.neighborhoodSummary.flagContentURI
        );
    }

    // --- 4. EV Amenity Summary (uses content blocks)) ---
    if (place.evChargeAmenitySummary) {
        const evSummary = place.evChargeAmenitySummary;
        const evContainer = document.createDocumentFragment();

        // Helper to build a safe DOM section for EV categories.
        const createSection = (title, text) => {
            const wrapper = document.createElement('div');
            wrapper.style.marginBottom = '15px'; // Or use a CSS class

            const titleEl = document.createElement('strong');
            titleEl.textContent = title;

            const textEl = document.createElement('div');
            textEl.textContent = text;

            wrapper.appendChild(titleEl);
            wrapper.appendChild(textEl);
            return wrapper;
        };

        // Check and append each potential section
        if (evSummary.overview?.content) {
            evContainer.appendChild(
                createSection('Overview', evSummary.overview.content)
            );
        }
        if (evSummary.coffee?.content) {
            evContainer.appendChild(
                createSection('Coffee', evSummary.coffee.content)
            );
        }
        if (evSummary.restaurant?.content) {
            evContainer.appendChild(
                createSection('Food', evSummary.restaurant.content)
            );
        }
        if (evSummary.store?.content) {
            evContainer.appendChild(
                createSection('Shopping', evSummary.store.content)
            );
        }

        // Only add the tab if the container has children
        if (evContainer.hasChildNodes()) {
            createTab(
                'EV Amenities',
                evContainer, // Passing a Node instead of string
                evSummary.disclosureText,
                evSummary.flagContentURI
            );
        }
    }

    // Safely handle the empty state.
    if (!firstTabActivated) {
        const msg = document.createElement('em');
        msg.textContent =
            'No AI summaries are available for this specific location.';
        summaryContent.replaceChildren(msg);
        aiDisclosure.textContent = '';
    }
}

void init();

CSS

/* Reuse existing map height */
gmp-map {
    height: 100%;
}

html,
body {
    height: 100%;
    margin: 0;
    padding: 0;
}

/* Existing Autocomplete Card Style */
.place-autocomplete-card {
    background-color: #fff;
    border-radius: 5px;
    box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;
    margin: 10px;
    padding: 2px;
    font-family: Roboto, sans-serif;
    font-size: 1rem;
}

gmp-place-autocomplete {
    width: 330px;
}

/* New: Summary Panel Styles */
.summary-card {
    background-color: #fff;
    border-radius: 5px;
    box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;
    margin: 10px;
    padding: 0; /* Padding handled by children */
    font-family: Roboto, sans-serif;
    width: 350px;
    max-height: 80vh; /* Prevent overflow on small screens */
    overflow-y: auto;
    display: flex;
    flex-direction: column;
}

.hidden {
    display: none;
}

#place-header {
    padding: 15px;
    background-color: #f8f9fa;
    border-bottom: 1px solid #ddd;
}

#place-header h2 {
    margin: 0 0 5px 0;
    font-size: 1.2rem;
}

#place-address {
    margin: 0;
    color: #555;
    font-size: 0.9rem;
}

/* Tab Navigation */
.tab-container {
    display: flex;
    border-bottom: 1px solid #ddd;
    background-color: #fff;
}

.tab-button {
    flex: 1;
    background: none;
    border: none;
    padding: 10px;
    cursor: pointer;
    font-weight: 500;
    color: #555;
    border-bottom: 3px solid transparent;
}

.tab-button:hover {
    background-color: #f1f1f1;
}

.tab-button.active {
    font-weight: bold;
    border-bottom: 3px solid #000000;
}

.tab-button.active:hover {
    background-color: #ffffff;
    cursor: default;
}

/* Content Area */
.content-area {
    padding: 15px;
    line-height: 1.5;
    font-size: 0.95rem;
    color: #333;
}

.disclosure-footer {
    font-size: 0.75rem;
    color: #666;
    padding: 10px 15px;
    border-top: 1px solid #eee;
    font-style: italic;
}

.flag-content-link {
    font-size: 0.75rem;
    color: #666;
    padding: 10px 15px;
    border-top: 1px solid #eee;
}

HTML

<html>
    <head>
        <title>AI Place Summaries</title>
        <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>
        <gmp-map center="37.80, -122.425" zoom="14" map-id="DEMO_MAP_ID">
            <!-- Search Input Card -->
            <div
                class="place-autocomplete-card"
                slot="control-inline-start-block-start">
                <gmp-place-autocomplete
                    placeholder="Find places with AI summaries"></gmp-place-autocomplete>
            </div>

            <!-- Summary text panel (initially hidden) -->
            <div
                id="summary-panel"
                class="summary-card hidden"
                slot="control-inline-end-block-start">
                <div id="place-header">
                    <h2 id="place-name"></h2>
                    <p id="place-address"></p>
                </div>

                <!-- Tabs for toggling summary types -->
                <div class="tab-container" id="tab-container"></div>

                <!-- Content display area -->
                <div id="summary-content" class="content-area"></div>

                <!-- Legal/AI Disclosure -->
                <div id="ai-disclosure" class="disclosure-footer"></div>

                <!-- Flag content link -->
                <a id="flag-content-link" class="flag-content-link"></a>
            </div>
        </gmp-map>
    </body>
</html>

Os resumos gerados com IA são visões gerais de um lugar ou área que fornecem informações úteis sobre lugares específicos, a área ao redor de um lugar e as avaliações associadas a ele. Há três tipos diferentes de resumos gerados com IA:

  • Resumo do lugar: uma breve visão geral de 100 caracteres específica para um determinado ID de lugar, agregando muitos tipos diferentes de dados em um resumo de alto nível de um lugar.

  • Resumo das avaliações: um resumo gerado de um lugar com base apenas nas avaliações dos usuários.

  • Resumo da área: um resumo gerado para a área ao redor de um lugar, fornecendo mais contexto, incluindo pontos de interesse próximos. Os resumos de área podem ser de dois tipos:

    • Resumo do bairro: uma visão geral dos pontos de interesse próximos para lugares com os tipos premise, street_address e todos os tipos nas categorias Moradia e Hospedagem.

    • Resumo de comodidades da estação de recarga de veículos elétricos: uma visão geral dos pontos de interesse próximos para lugares com o tipo electric_vehicle_charging_station.

Receber resumos gerados com IA

Para recuperar e mostrar resumos gerados com IA, siga estas etapas:

  1. Carregue a biblioteca Places.

    const { Place } = await google.maps.importLibrary("places");
  2. Receba uma instância de Place. O snippet a seguir mostra como criar uma instância de Place usando um ID de lugar:

    const place = new Place("ChIJaYaXFTqq3oARNy537Kb_W_c");
  3. Na chamada para place.fetchFields(), especifique os campos para os tipos de resumos que você quer usar. No snippet a seguir, todos os campos de resumo são solicitados:

    await place.fetchFields({
      fields: [
        'generativeSummary',
        'neighborhoodSummary',
        'reviewSummary',
        'evChargeAmenitySummary'
        // Include other fields as needed.
      ]
    });
              
  4. Recupere os dados de resumo acessando as propriedades generativeSummary, neighborhoodSummary, reviewSummary e evChargeAmenitySummary, respectivamente. O snippet a seguir mostra como recuperar a visão geral de um generativeSummary.

    const summaryText = place.generativeSummary.overview;
            

Como nem todos os lugares têm resumos gerados com IA, verifique se os dados necessários estão presentes antes de mostrá-los aos usuários. O snippet a seguir usa uma instrução if para verificar se há um generativeSummary:

if (place.generativeSummary) {
  overviewText = place.generativeSummary.overview;
} else {
  overviewText = 'No summary is available.';
}
    

Como alternativa, use um operador de coalescência nula para verificar de forma concisa a presença de um resumo:

const overviewText = place.generativeSummary.overview ?? 'No summary is available.';
    

Mostrar as atribuições necessárias

Todos os resumos gerados com IA mostrados no seu app precisam incluir a atribuição adequada, de acordo com as políticas e os padrões do Google. Para mais informações, consulte Políticas e atribuições da API Maps JavaScript.

Resumos de lugares

Os resumos de lugares são visões gerais breves de 100 caracteres específicas de um determinado ID de lugar, para fornecer um panorama geral de um lugar. Os resumos de lugares podem destacar alimentos, serviços ou produtos populares disponíveis para compra em um local:

  • "Restaurante no Forum Shops que serve porções generosas de pratos italianos tradicionais em um espaço casual."

  • "Salão de beleza elegante que oferece cortes de cabelo, coloração e escova."

  • "Loja grande com muitos vendedores que oferecem uma variedade de decoração, móveis e roupas vintage."

Os resumos de lugares estão disponíveis para os tipos mostrados em Tipos compatíveis para as categorias Cultura, Entretenimento e lazer, Comida e bebida, Compras, Serviços e Esportes.

Os resumos de lugares estão disponíveis para pontos de interesse nos seguintes idiomas e regiões:

Idioma Região
Inglês

Índia

Estados Unidos

Pedir um resumo do lugar

Para solicitar um resumo generativo de lugar, inclua o campo generativeSummary ao chamar fetchFields():

await place.fetchFields({
    fields: [
        'generativeSummary',
        // Include other fields as needed.
    ],
});
    

Use a propriedade generativeSummary para recuperar resumos de lugares. O snippet a seguir recupera a visão geral e o texto de declaração de um generativeSummary:

if (place.generativeSummary) {
    console.log("Place Overview:", place.generativeSummary.overview);
    console.log("Disclosure:", place.generativeSummary.disclosureText);
}
    

Resumos das avaliações

Os resumos das avaliações são gerados com base apenas nas avaliações dos usuários. Ao sintetizar elementos-chave das avaliações dos usuários, como atributos do lugar e sentimento do avaliador, os resumos das avaliações fornecem insights de alto nível e ajudam os usuários a tomar decisões informadas.

Por exemplo, um resumo das avaliações do Ferry Building em São Francisco inclui informações que vão de comida e compras a vistas e atmosfera:

"Os visitantes dizem que esse ponto turístico histórico oferece uma seleção diversificada de lojas, restaurantes e uma feira livre, e muitos elogiam as vistas da baía e da cidade. Eles também destacam a atmosfera vibrante, o acesso conveniente de balsa a outros destinos e a oportunidade de aproveitar as empresas locais."

Os resumos das avaliações estão disponíveis para pontos de interesse nos seguintes idiomas e regiões:

Idioma Região
Inglês Argentina, Bolívia, Brasil, Chile, Colômbia, Costa Rica, Equador, Estados Unidos, Guatemala, Índia, Japão, México, Paraguai, Peru, Reino Unido, República Dominicana, Uruguai e Venezuela
Japonês Japão
Português Brasil
Espanhol Argentina, Bolívia, Chile, Colômbia, Costa Rica, Equador, Estados Unidos, Guatemala, México, Paraguai, Peru, República Dominicana, Uruguai e Venezuela

Pedir um resumo das avaliações

Para solicitar um resumo das avaliações, inclua o campo reviewSummary ao chamar fetchFields():

await place.fetchFields({
    fields: [
        'reviewSummary',
        // Include other fields as needed.
    ],
});
  

Use a propriedade reviewSummary para recuperar resumos de avaliações. Para recuperar resumos das avaliações, acesse a propriedade reviewSummary.text. O snippet a seguir recupera o texto de um reviewSummary.

if (place.reviewSummary) {
    console.log("Place Review Summary:", place.reviewSummary.text);
}
  

Resumos de áreas

Os resumos de área são gerados para a área ao redor de um lugar. Os resumos de área fornecem mais contexto para um local, incluindo pontos de interesse próximos, para que os usuários possam tomar uma decisão mais informada sobre onde ir e o que fazer quando chegarem lá. Por exemplo, ao visitar uma nova cidade, você pode ver um resumo gerado do bairro de um hotel para saber mais sobre a área ao redor:

  • "Essa área vibrante em San Francisco, que combina North Beach e Chinatown, fica a noroeste do Distrito Financeiro e conta com marcos literários, atrações culturais únicas e diversas opções gastronômicas. Os pontos turísticos mais famosos incluem a icônica livraria City Lights, o fascinante Cable Car Museum e as ruas movimentadas de Chinatown."

Se você estiver pensando em carregar um veículo elétrico, confira um resumo gerado para uma estação de recarga de veículos elétricos para saber mais sobre a área ao redor:

  • "Esta área oferece várias opções de restaurantes a 9 minutos de caminhada, incluindo Starbucks, Sushi Jin e Safeway."

Além de uma descrição da área, a resposta também contém uma lista de instâncias de Place para os lugares referenciados na descrição. Chame fetchFields() nessas instâncias de Place para solicitar mais detalhes sobre cada lugar.

Há dois tipos de resumos de área gerados com IA:

  • Resumo do bairro: uma visão geral dos pontos de interesse próximos para lugares com os tipos premise, street_address e todos os tipos nas categorias Moradia e Hospedagem.

  • Resumo de comodidades da estação de recarga de veículos elétricos: uma visão geral dos pontos de interesse próximos para lugares com o tipo electric_vehicle_charging_station.

Os resumos de área estão disponíveis para pontos de interesse nos seguintes idiomas e regiões:

Idioma Região
Inglês Estados Unidos

Pedir um resumo do bairro

É possível solicitar resumos de bairros para lugares com os tipos premise, street_address e todos os tipos nas categorias Moradia e Hospedagem. Para solicitar um resumo do bairro, inclua o campo neighborhoodSummary ao chamar fetchFields():

await place.fetchFields({
    fields: [
        'neighborhoodSummary',
        // Include other fields as needed.
    ],
});
  

Use a propriedade neighborhoodSummary para recuperar resumos de bairros. Para recuperar resumos de bairros, acesse a propriedade neighborhoodSummary.content para receber o texto.

O snippet a seguir recupera o conteúdo de um neighborhoodSummary:

if (place.neighborhoodSummary) {
    console.log("Place Neighborhood Summary:", place.neighborhoodSummary.overview.content);
}
  

Solicitar um resumo de comodidades de uma estação de recarga de veículos elétricos

É possível solicitar resumos de comodidades de estações de recarga de veículos elétricos para lugares com o tipo electric_vehicle_charging_station. O resumo de comodidades do EVCS oferece quatro tipos de resumos: overview, coffee, restaurant e store. Por isso, a estrutura de dados é uma matriz de objetos, cada um contendo um resumo. Para solicitar um resumo de comodidades de uma estação de recarga de veículos elétricos, inclua o campo evChargeAmenitySummary ao chamar fetchFields():

await place.fetchFields({
    fields: [
        'evChargeAmenitySummary',
        // Include other fields as needed.
    ],
});
  

Use a propriedade evChargeAmenitySummary para recuperar resumos de comodidades de estações de recarga de veículos elétricos. Para recuperar o texto dos resumos, acesse a propriedade content das propriedades evChargeAmenitySummary.overview, evChargeAmenitySummary.coffee, evChargeAmenitySummary.restaurant e evChargeAmenitySummary.store.

O snippet a seguir recupera o conteúdo de um evChargeAmenitySummary:

// overview, coffee, restaurant, store.
if (place.evChargeAmenitySummary) {
    console.log("Place EVCS Amenity Summary:", place.evChargeAmenitySummary.overview.content);
    console.log("Coffee:", place.evChargeAmenitySummary.coffee.content);
    console.log("Restaurants:", place.evChargeAmenitySummary.restaurant.content);
    console.log("Stores:", place.evChargeAmenitySummary.store.content);
}