Afficher l'exemple de code source complet
Recherchez des lieux pour afficher les résumés optimisés par l'IA. Voici quelques recherches suggérées :
- "Hôtel" pour les résumés de quartier.
- "Borne de recharge de véhicules électriques" pour les résumés des équipements de bornes de recharge de véhicules électriques
- Tout restaurant ou établissement pour les résumés de lieux et d'avis.
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>Essayer l'exemple
Les résumés optimisés par l'IA sont des aperçus d'un lieu ou d'une zone qui fournissent des informations utiles sur des lieux spécifiques, la zone autour d'un lieu et les avis associés à un lieu. Il existe trois types de résumés optimisés par l'IA :
-
Résumé du lieu : aperçu bref de 100 caractères spécifique à un ID de lieu donné, qui regroupe de nombreux types de données différents dans un aperçu général d'un lieu.
-
Résumé des avis : résumé généré d'un lieu basé uniquement sur les avis des utilisateurs.
-
Résumé de la zone : résumé généré pour la zone entourant un lieu, qui fournit un contexte supplémentaire, y compris les points d'intérêt à proximité. Les récapitulatifs de zone peuvent être de deux types :
-
Résumé du quartier : aperçu général des points d'intérêt à proximité pour les lieux de types
premise,street_addresset tous les types des catégories Logement et Hébergement. -
Récapitulatif des commodités des bornes de recharge pour véhicules électriques : aperçu général des points d'intérêt à proximité pour les lieux de type
electric_vehicle_charging_station.
-
Récupérer les résumés optimisés par l'IA
Pour récupérer et afficher des résumés générés par IA, procédez comme suit :
Chargez la bibliothèque
Places.const { Place } = await google.maps.importLibrary("places");
Obtenez une instance
Place. L'extrait suivant montre comment créer une instancePlaceà partir d'un ID de lieu :const place = new Place("ChIJaYaXFTqq3oARNy537Kb_W_c");
Dans votre appel à
place.fetchFields(), spécifiez les champs pour les types de résumés que vous souhaitez utiliser. Dans l'extrait suivant, tous les champs récapitulatifs sont demandés :await place.fetchFields({ fields: [ 'generativeSummary', 'neighborhoodSummary', 'reviewSummary', 'evChargeAmenitySummary' // Include other fields as needed. ] });
Récupérez les données récapitulatives en accédant respectivement aux propriétés
generativeSummary,neighborhoodSummary,reviewSummaryetevChargeAmenitySummary. L'extrait suivant montre comment récupérer l'aperçu à partir d'ungenerativeSummary.const summaryText = place.generativeSummary.overview;
Comme toutes les fiches de lieux ne comportent pas de résumés générés par IA, assurez-vous de vérifier la présence des données nécessaires avant de les afficher aux utilisateurs. L'extrait suivant utilise une instruction "if" pour rechercher un generativeSummary :
if (place.generativeSummary) { overviewText = place.generativeSummary.overview; } else { overviewText = 'No summary is available.'; }
Vous pouvez également utiliser un opérateur nullish pour vérifier de manière concise la présence d'un résumé :
const overviewText = place.generativeSummary.overview ?? 'No summary is available.';
Afficher les attributions requises
Tous les résumés générés par IA affichés dans votre application doivent être accompagnés de l'attribution appropriée, conformément aux règles et normes de Google. Pour en savoir plus, consultez Règles et attributions de l'API Maps JavaScript.
Résumés des lieux
Les résumés de lieux sont de brefs aperçus de 100 caractères spécifiques à un ID de lieu donné. Ils permettent d'obtenir un aperçu général d'un lieu. Les résumés de lieux peuvent mettre en avant les plats, services ou produits populaires disponibles à l'achat dans un lieu :
-
"Restaurant du Forum Shops servant de grandes portions de plats italiens traditionnels dans un espace décontracté."
-
"Salon élégant proposant des coupes et des colorations, ainsi que des brushings."
-
"Grand magasin avec de nombreux vendeurs proposant une variété de décorations, de meubles et de vêtements vintage."
Les résumés de lieux sont disponibles pour les types de lieux indiqués dans Types acceptés pour les catégories Culture, Divertissement et loisirs, Restaurants et bars, Shopping, Services et Sports.
Les résumés de lieux sont disponibles pour les points d'intérêt dans les langues et régions suivantes :
| Langue | Région |
|---|---|
| Anglais |
Inde États-Unis |
Demander un résumé d'un lieu
Pour demander un résumé génératif d'un lieu, incluez le champ generativeSummary lorsque vous appelez fetchFields() :
await place.fetchFields({ fields: [ 'generativeSummary', // Include other fields as needed. ], });
Utilisez la propriété generativeSummary pour récupérer les résumés des lieux. L'extrait suivant récupère le texte de présentation et de divulgation à partir d'un generativeSummary :
if (place.generativeSummary) { console.log("Place Overview:", place.generativeSummary.overview); console.log("Disclosure:", place.generativeSummary.disclosureText); }
Résumés des avis
Les résumés d'avis sont générés à partir des avis des utilisateurs uniquement. En synthétisant les éléments clés des avis des utilisateurs, tels que les attributs des lieux et le sentiment des auteurs, les résumés d'avis fournissent des informations générales et aident les utilisateurs à prendre des décisions éclairées.
Par exemple, un résumé des avis sur le Ferry Building à San Francisco inclut des informations allant de la nourriture et du shopping aux vues et à l'atmosphère :
"Les visiteurs affirment que ce monument historique propose une sélection variée de boutiques, de restaurants et d'un marché de producteurs, et beaucoup apprécient la vue sur la baie et la ville. Ils soulignent également l'atmosphère animée, l'accès pratique aux ferries vers d'autres destinations et la possibilité de profiter des commerces locaux."
Les résumés d'avis sont disponibles pour les points d'intérêt dans les langues et régions suivantes :
| Langue | Région |
|---|---|
| Anglais | Argentine, Bolivie, Brésil, Chili, Colombie, Costa Rica, Équateur, États-Unis, Guatemala, Inde, Japon, Mexique, Paraguay, Pérou, Royaume-Uni, République dominicaine, Uruguay, Venezuela |
| Japonais | Japon |
| Portugais | Brésil |
| Espagnol | Argentine, Bolivie, Chili, Colombie, Costa Rica, Équateur, États-Unis, Guatemala, Mexique, Nicaragua, Panama, Paraguay, Pérou, Porto Rico, République dominicaine, Salvador, Uruguay, Venezuela |
Demander un résumé des avis
Pour demander un récapitulatif des avis, incluez le champ reviewSummary lorsque vous appelez fetchFields() :
await place.fetchFields({ fields: [ 'reviewSummary', // Include other fields as needed. ], });
Utilisez la propriété reviewSummary pour récupérer les résumés des avis. Pour récupérer les résumés des avis, accédez à la propriété reviewSummary.text. L'extrait suivant récupère le texte d'un reviewSummary.
if (place.reviewSummary) { console.log("Place Review Summary:", place.reviewSummary.text); }
Résumés des zones
Les résumés de zone sont générés pour la zone entourant un lieu. Les résumés de zone fournissent des informations contextuelles supplémentaires sur un lieu, y compris les points d'intérêt à proximité. Les utilisateurs peuvent ainsi prendre une décision plus éclairée sur l'endroit où aller et sur ce qu'ils feront une fois sur place. Par exemple, lorsque vous visitez une nouvelle ville, vous pouvez consulter un résumé du quartier d'un hôtel pour en savoir plus sur les environs :
-
"Ce quartier animé de San Francisco, qui mélange North Beach et Chinatown, se trouve au nord-ouest du quartier financier. Il abrite des monuments littéraires, des attractions culturelles uniques et des restaurants variés. Parmi les lieux incontournables, citons la célèbre librairie City Lights, le fascinant Cable Car Museum et les rues animées de Chinatown."
Si vous envisagez de recharger un véhicule électrique, vous pouvez consulter un résumé généré pour une borne de recharge de véhicules électriques afin d'en savoir plus sur les environs :
-
"Ce quartier propose un large choix de restaurants à moins de 9 minutes à pied, dont Starbucks, Sushi Jin et Safeway."
En plus d'une description de la zone, la réponse contient également une liste d'instances Place pour les lieux référencés dans la description. Appelez fetchFields() sur ces instances Place pour demander plus de détails sur chaque lieu.
Il existe deux types de résumés de zone optimisés par l'IA :
-
Résumé du quartier : aperçu général des points d'intérêt à proximité pour les lieux de types
premise,street_addresset tous les types des catégories Logement et Hébergement. -
Récapitulatif des commodités des bornes de recharge pour véhicules électriques : aperçu général des points d'intérêt à proximité pour les lieux de type
electric_vehicle_charging_station.
Les résumés de zones sont disponibles pour les points d'intérêt dans les langues et régions suivantes :
| Langue | Région |
|---|---|
| Anglais | États-Unis |
Demander un résumé du quartier
Vous pouvez demander des résumés de quartier pour les lieux de type premise, street_address et tous les types des catégories Logement et Hébergement. Pour demander un résumé du quartier, incluez le champ neighborhoodSummary lorsque vous appelez fetchFields() :
await place.fetchFields({ fields: [ 'neighborhoodSummary', // Include other fields as needed. ], });
Utilisez la propriété neighborhoodSummary pour récupérer les résumés des quartiers. Pour récupérer les résumés de quartier, accédez à la propriété neighborhoodSummary.content pour obtenir le texte.
L'extrait suivant récupère le contenu d'un neighborhoodSummary :
if (place.neighborhoodSummary) { console.log("Place Neighborhood Summary:", place.neighborhoodSummary.overview.content); }
Demander un récapitulatif des équipements de recharge pour véhicules électriques
Vous pouvez demander des résumés des équipements de recharge pour véhicules électriques pour les lieux de type electric_vehicle_charging_station. Le récapitulatif des équipements de recharge pour véhicules électriques propose quatre types de récapitulatifs : overview, coffee, restaurant et store. La structure de données est donc un tableau d'objets, chacun contenant un récapitulatif. Pour demander un récapitulatif des bornes de recharge pour véhicules électriques, incluez le champ evChargeAmenitySummary lorsque vous appelez fetchFields() :
await place.fetchFields({ fields: [ 'evChargeAmenitySummary', // Include other fields as needed. ], });
Utilisez la propriété evChargeAmenitySummary pour récupérer les résumés des équipements de recharge pour véhicules électriques. Pour récupérer le texte des résumés, accédez à la propriété content des propriétés evChargeAmenitySummary.overview, evChargeAmenitySummary.coffee, evChargeAmenitySummary.restaurant et evChargeAmenitySummary.store.
L'extrait suivant récupère le contenu d'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); }