Consulta el ejemplo de código fuente completo
Busca lugares para ver los resúmenes potenciados por IA. Algunas búsquedas sugeridas:
- "Hotel" para los resúmenes de vecindarios
- "Estación de carga de VE" para los resúmenes de servicios de EVCS
- Cualquier restaurante o empresa para los resúmenes de lugares y opiniones
TypeScript
// Define DOM elements. const mapElement = document.querySelector('gmp-map') as google.maps.MapElement; const placeAutocomplete = document.querySelector( 'gmp-place-autocomplete' ) as google.maps.places.PlaceAutocompleteElement; const summaryPanel = document.getElementById('summary-panel') as HTMLDivElement; const placeName = document.getElementById('place-name') as HTMLElement; const placeAddress = document.getElementById('place-address') as HTMLElement; const tabContainer = document.getElementById('tab-container') as HTMLDivElement; const summaryContent = document.getElementById( 'summary-content' ) as HTMLDivElement; const aiDisclosure = document.getElementById('ai-disclosure') as HTMLDivElement; const flagContentLink = document.getElementById('flag-content-link') as HTMLAnchorElement; let innerMap; let marker: google.maps.marker.AdvancedMarkerElement; async function initMap(): Promise<void> { // Request needed libraries. const [] = 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. google.maps.event.addListener(innerMap, 'bounds_changed', async () => { placeAutocomplete.locationRestriction = innerMap.getBounds(); }); // Create the marker. marker = new google.maps.marker.AdvancedMarkerElement({ map: innerMap, }); // Handle selection of an autocomplete result. // prettier-ignore // @ts-ignore 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, flagUrl: string ) => { 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) --- //@ts-ignore if (place.generativeSummary?.overview) { createTab( 'Overview', //@ts-ignore place.generativeSummary.overview, //@ts-ignore place.generativeSummary.disclosureText, //@ts-ignore place.generativeSummary.flagContentURI ); } // --- 2. Review Summary --- //@ts-ignore if (place.reviewSummary?.text) { createTab( 'Reviews', //@ts-ignore place.reviewSummary.text, //@ts-ignore place.reviewSummary.disclosureText, //@ts-ignore place.reviewSummary.flagContentURI ); } // --- 3. Neighborhood Summary --- //@ts-ignore if (place.neighborhoodSummary?.overview?.content) { createTab( 'Neighborhood', //@ts-ignore place.neighborhoodSummary.overview.content, //@ts-ignore place.neighborhoodSummary.disclosureText, //@ts-ignore place.neighborhoodSummary.flagContentURI ); } // --- 4. EV Amenity Summary (uses content blocks)) --- //@ts-ignore if (place.evChargeAmenitySummary) { //@ts-ignore 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 = ''; } } initMap();
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 initMap() { // Request needed libraries. const [] = 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. google.maps.event.addListener(innerMap, 'bounds_changed', async () => { placeAutocomplete.locationRestriction = innerMap.getBounds(); }); // Create the marker. marker = new google.maps.marker.AdvancedMarkerElement({ map: innerMap, }); // Handle selection of an autocomplete result. // prettier-ignore // @ts-ignore 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) --- //@ts-ignore if (place.generativeSummary?.overview) { createTab('Overview', //@ts-ignore place.generativeSummary.overview, //@ts-ignore place.generativeSummary.disclosureText, //@ts-ignore place.generativeSummary.flagContentURI); } // --- 2. Review Summary --- //@ts-ignore if (place.reviewSummary?.text) { createTab('Reviews', //@ts-ignore place.reviewSummary.text, //@ts-ignore place.reviewSummary.disclosureText, //@ts-ignore place.reviewSummary.flagContentURI); } // --- 3. Neighborhood Summary --- //@ts-ignore if (place.neighborhoodSummary?.overview?.content) { createTab('Neighborhood', //@ts-ignore place.neighborhoodSummary.overview.content, //@ts-ignore place.neighborhoodSummary.disclosureText, //@ts-ignore place.neighborhoodSummary.flagContentURI); } // --- 4. EV Amenity Summary (uses content blocks)) --- //@ts-ignore if (place.evChargeAmenitySummary) { //@ts-ignore 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 = ''; } } initMap();
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: 15px; font-family: Roboto, sans-serif; font-size: 1rem; } gmp-place-autocomplete { width: 300px; } /* 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; } /* 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: 15px; font-family: Roboto, sans-serif; font-size: 1rem; } gmp-place-autocomplete { width: 300px; } /* 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; }
HTML
<html>
<head>
<title>AI Place Summaries</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></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>
<gmp-map center="37.805, -122.425" zoom="14" map-id="DEMO_MAP_ID">
<!-- Search Input Card -->
<div
class="place-autocomplete-card"
slot="control-inline-start-block-start">
<p>Search for a place with AI summaries:</p>
<gmp-place-autocomplete></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>Prueba la muestra
Los resúmenes potenciados por IA son descripciones generales de un lugar o área que proporcionan estadísticas útiles sobre lugares específicos, el área alrededor de un lugar y las opiniones asociadas con un lugar. Existen tres tipos diferentes de resúmenes potenciados por IA:
-
Resumen del lugar: Es una breve descripción general de 100 caracteres específica para un ID de lugar determinado, que agrega muchos tipos diferentes de datos en un resumen de alto nivel de un lugar.
-
Resumen de opiniones: Es un resumen generado de un lugar basado únicamente en las opiniones de los usuarios.
-
Resumen del área: Es un resumen generado para el área que rodea un lugar, que proporciona contexto adicional, incluidos los puntos de interés cercanos. Los resúmenes de área pueden ser de uno de los siguientes dos tipos:
-
Resumen del vecindario: Es una descripción general de alto nivel de los puntos de interés cercanos para los lugares con los tipos
premise,street_addressy todos los tipos de las categorías Alojamiento y Hospedaje. -
Resumen de servicios de estaciones de carga de vehículos eléctricos: Es un resumen de alto nivel de los lugares de interés cercanos para los lugares con el tipo
electric_vehicle_charging_station.
-
Recupera resúmenes potenciados por IA
Para recuperar y mostrar resúmenes potenciados por IA, sigue estos pasos:
Carga la biblioteca de
Places.const { Place } = await google.maps.importLibrary("places");
Obtén una instancia de
Place. En el siguiente fragmento, se muestra cómo crear una instancia dePlacea partir de un ID de lugar:const place = new Place("ChIJaYaXFTqq3oARNy537Kb_W_c");
En la llamada a
place.fetchFields(), especifica los campos para los tipos de resúmenes que deseas usar. En el siguiente fragmento, se solicitan todos los campos de resumen:await place.fetchFields({ fields: [ 'generativeSummary', 'neighborhoodSummary', 'reviewSummary', 'evChargeAmenitySummary' // Include other fields as needed. ] });
Recupera los datos de resumen accediendo a las propiedades
generativeSummary,neighborhoodSummary,reviewSummaryyevChargeAmenitySummary, respectivamente. En el siguiente fragmento, se muestra cómo recuperar la descripción general de ungenerativeSummary.const summaryText = place.generativeSummary.overview;
Dado que no todos los lugares tienen resúmenes potenciados por IA, asegúrate de verificar la presencia de los datos necesarios antes de mostrarlos a los usuarios. En el siguiente fragmento, se usa una sentencia if para verificar si hay un generativeSummary:
if (place.generativeSummary) { overviewText = place.generativeSummary.overview; } else { overviewText = 'No summary is available.'; }
Como alternativa, usa un operador nulo para verificar de forma concisa la presencia de un resumen:
const overviewText = place.generativeSummary.overview ?? 'No summary is available.';
Se deben mostrar las atribuciones requeridas.
Todos los resúmenes potenciados por IA que se muestren en tu app deben incluir la atribución adecuada de conformidad con las políticas y los estándares de Google. Para obtener más información, consulta las políticas y atribuciones de la API de Maps JavaScript.
Resúmenes de lugares
Los resúmenes de lugares son descripciones generales breves de 100 caracteres específicas para un ID de lugar determinado, con el objetivo de proporcionar una instantánea de alto nivel de un lugar. En los resúmenes de lugares, se pueden destacar comidas, servicios o bienes populares disponibles para la compra en una ubicación:
-
"Restaurante de Forum Shops que sirve grandes porciones de comida italiana tradicional en un espacio informal"
-
"Salón elegante que ofrece cortes y tintes, además de peinados".
-
"Tienda grande con muchos vendedores que ofrecen una variedad de decoración, muebles y ropa vintage".
Los resúmenes de lugares están disponibles para los tipos de lugares que se muestran en Tipos admitidos para las categorías Cultura, Entretenimiento y recreación, Comida y bebida, Compras, Servicios y Deportes.
Los resúmenes de lugares se admiten para los puntos de interés en los siguientes idiomas y regiones:
| Idioma | Región |
|---|---|
| Inglés |
India Estados Unidos |
Solicita un resumen de un lugar
Para solicitar un resumen de lugar generado por IA, incluye el campo generativeSummary cuando llames a fetchFields():
await place.fetchFields({ fields: [ 'generativeSummary', // Include other fields as needed. ], });
Usa la propiedad generativeSummary para recuperar resúmenes de lugares. El siguiente fragmento recupera el texto de divulgación y el resumen de un objeto generativeSummary:
if (place.generativeSummary) { console.log("Place Overview:", place.generativeSummary.overview); console.log("Disclosure:", place.generativeSummary.disclosureText); }
Resúmenes de opiniones
Los resúmenes de opiniones son resúmenes generados únicamente en función de las opiniones de los usuarios. Al sintetizar elementos clave de las opiniones de los usuarios, como los atributos de los lugares y el sentimiento de los revisores, los resúmenes de opiniones proporcionan estadísticas de alto nivel y ayudan a los usuarios a tomar decisiones fundamentadas.
Por ejemplo, un resumen de opiniones sobre el Ferry Building en San Francisco incluye información que abarca desde comida y compras hasta vistas y ambiente:
"Los visitantes dicen que este monumento histórico ofrece una selección diversa de tiendas, restaurantes y un mercado de agricultores, y muchos elogian las vistas de la bahía y la ciudad. También destacan el ambiente vibrante, el acceso conveniente en ferry a otros destinos y la oportunidad de disfrutar de las empresas locales".
Los resúmenes de opiniones son compatibles con los puntos de interés en los siguientes idiomas y regiones:
| Idioma | Región |
|---|---|
| Inglés | Argentina, Bolivia, Brasil, Chile, Colombia, Costa Rica, Ecuador, Estados Unidos, Guatemala, India, Japón, México, Paraguay, Perú, Reino Unido, República Dominicana, Uruguay y Venezuela |
| Japonés | Japón |
| Portugués | Brasil |
| Español | Argentina, Bolivia, Chile, Colombia, Costa Rica, Ecuador, Estados Unidos, Guatemala, México, Paraguay, Perú, República Dominicana, Uruguay y Venezuela |
Solicita un resumen de la revisión
Para solicitar un resumen de la revisión, incluye el campo reviewSummary cuando llames a fetchFields():
await place.fetchFields({ fields: [ 'reviewSummary', // Include other fields as needed. ], });
Usa la propiedad reviewSummary para recuperar resúmenes de opiniones. Para recuperar los resúmenes de opiniones, accede a la propiedad reviewSummary.text. El siguiente fragmento recupera el texto de un reviewSummary.
if (place.reviewSummary) { console.log("Place Review Summary:", place.reviewSummary.text); }
Resúmenes de áreas
Se generan resúmenes del área que rodea un lugar. Los resúmenes de áreas proporcionan contexto adicional sobre una ubicación, incluidos los puntos de interés cercanos, para que los usuarios puedan tomar una decisión más fundamentada sobre dónde ir y qué hacer cuando lleguen. Por ejemplo, cuando visites una ciudad nueva, puedes ver un resumen generado del vecindario de un hotel para obtener más información sobre el área circundante:
-
"Esta vibrante zona de San Francisco, que combina North Beach y Chinatown, se encuentra al noroeste del distrito financiero y cuenta con lugares de interés literario, atracciones culturales únicas y una gastronomía diversa. Entre los lugares destacados, se incluyen la icónica librería City Lights, el fascinante Cable Car Museum y las bulliciosas calles de Chinatown".
Si estás pensando en cargar un vehículo eléctrico, puedes ver un resumen generado de una estación de carga de vehículos eléctricos para obtener más información sobre el área circundante:
-
"Esta área ofrece una variedad de opciones gastronómicas a 9 minutos a pie, como Starbucks, Sushi Jin y Safeway".
Junto con una descripción del área, la respuesta también contiene una lista de instancias de Place para los lugares a los que se hace referencia en la descripción. Llama a fetchFields() en estas instancias de Place para solicitar más detalles de cada lugar.
Existen dos tipos de resúmenes de áreas potenciados por IA:
-
Resumen del vecindario: Es una descripción general de alto nivel de los puntos de interés cercanos para los lugares con los tipos
premise,street_addressy todos los tipos de las categorías Alojamiento y Hospedaje. -
Resumen de servicios de estaciones de carga de vehículos eléctricos: Es un resumen de alto nivel de los lugares de interés cercanos para los lugares con el tipo
electric_vehicle_charging_station.
Los resúmenes de áreas son compatibles con los puntos de interés en los siguientes idiomas y regiones:
| Idioma | Región |
|---|---|
| Inglés | Estados Unidos |
Solicita un resumen del vecindario
Puedes solicitar resúmenes de vecindarios para lugares con los tipos premise, street_address y todos los tipos de las categorías Vivienda y Alojamiento. Para solicitar un resumen del vecindario, incluye el campo neighborhoodSummary cuando llames a fetchFields():
await place.fetchFields({ fields: [ 'neighborhoodSummary', // Include other fields as needed. ], });
Usa la propiedad neighborhoodSummary para recuperar resúmenes de vecindarios. Para recuperar resúmenes de vecindarios, accede a la propiedad neighborhoodSummary.content para obtener el texto.
El siguiente fragmento recupera el contenido de un neighborhoodSummary:
if (place.neighborhoodSummary) { console.log("Place Neighborhood Summary:", place.neighborhoodSummary.overview.content); }
Solicita un resumen de los servicios de la estación de carga de vehículos eléctricos
Puedes solicitar resúmenes de servicios de estaciones de carga de vehículos eléctricos para lugares de tipo electric_vehicle_charging_station. El resumen de servicios de EVCS ofrece cuatro tipos de resúmenes: overview, coffee, restaurant y store. Por este motivo, la estructura de datos es un array de objetos, cada uno de los cuales contiene un resumen. Para solicitar un resumen de los servicios de una estación de carga de vehículos eléctricos, incluye el campo evChargeAmenitySummary cuando llames a fetchFields():
await place.fetchFields({ fields: [ 'evChargeAmenitySummary', // Include other fields as needed. ], });
Usa la propiedad evChargeAmenitySummary para recuperar resúmenes de servicios de estaciones de carga de vehículos eléctricos. Para recuperar texto de los resúmenes, accede a la propiedad content de las propiedades evChargeAmenitySummary.overview, evChargeAmenitySummary.coffee, evChargeAmenitySummary.restaurant y evChargeAmenitySummary.store.
El siguiente fragmento recupera el contenido de un 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); }