Lihat contoh kode sumber yang lengkap
Telusuri tempat untuk melihat ringkasan yang didukung AI. Beberapa penelusuran yang disarankan:
- "Hotel" untuk ringkasan kawasan.
- "Stasiun pengisian kendaraan listrik" untuk ringkasan fasilitas SPKLU.
- Restoran atau bisnis mana pun untuk ringkasan tempat dan ulasan.
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>Mencoba Contoh
Ringkasan yang dibuat AI adalah ringkasan tempat atau area yang memberikan insight bermanfaat tentang tempat tertentu, area di sekitar tempat, dan ulasan yang terkait dengan tempat. Ada tiga jenis ringkasan yang didukung AI:
-
Ringkasan tempat: Ringkasan singkat 100 karakter khusus untuk ID tempat tertentu, yang menggabungkan berbagai jenis data menjadi ringkasan tingkat tinggi suatu tempat.
-
Ringkasan ulasan: Ringkasan tempat yang dibuat hanya berdasarkan ulasan pengguna.
-
Ringkasan area: Ringkasan yang dihasilkan untuk area di sekitar suatu tempat, yang memberikan konteks tambahan termasuk tempat menarik di sekitar. Ringkasan area dapat berupa salah satu dari dua jenis berikut:
-
Ringkasan lingkungan sekitar: Ringkasan umum lokasi menarik di sekitar untuk tempat dengan jenis
premise,street_address, dan semua jenis dalam kategori Perumahan dan Penginapan. -
Ringkasan fasilitas stasiun pengisian kendaraan listrik: Ringkasan tingkat tinggi tempat menarik terdekat untuk tempat dengan jenis
electric_vehicle_charging_station.
-
Mengambil ringkasan yang didukung AI
Untuk mengambil dan menampilkan ringkasan yang didukung AI, ikuti langkah-langkah berikut:
-
const { Place } = await google.maps.importLibrary("places");
Dapatkan instance
Place. Cuplikan berikut menunjukkan cara membuat instancePlacedari ID tempat:const place = new Place("ChIJaYaXFTqq3oARNy537Kb_W_c");
Dalam panggilan ke
place.fetchFields(), tentukan kolom untuk jenis ringkasan yang ingin Anda gunakan. Dalam cuplikan berikut, semua kolom ringkasan diminta:await place.fetchFields({ fields: [ 'generativeSummary', 'neighborhoodSummary', 'reviewSummary', 'evChargeAmenitySummary' // Include other fields as needed. ] });
Ambil data ringkasan dengan mengakses properti
generativeSummary,neighborhoodSummary,reviewSummary, danevChargeAmenitySummary. Cuplikan berikut menunjukkan pengambilan ringkasan darigenerativeSummary.const summaryText = place.generativeSummary.overview;
Karena tidak semua tempat memiliki ringkasan yang didukung AI, pastikan untuk memeriksa keberadaan data yang diperlukan sebelum menampilkannya kepada pengguna. Cuplikan berikut menggunakan pernyataan if untuk memeriksa
generativeSummary:
if (place.generativeSummary) { overviewText = place.generativeSummary.overview; } else { overviewText = 'No summary is available.'; }
Atau, gunakan operator nullish untuk memeriksa keberadaan ringkasan secara ringkas:
const overviewText = place.generativeSummary.overview ?? 'No summary is available.';
Menampilkan atribusi yang diperlukan
Semua ringkasan yang didukung AI yang ditampilkan di aplikasi Anda harus disertai dengan atribusi yang sesuai sesuai dengan kebijakan dan standar Google. Untuk mengetahui informasi selengkapnya, lihat Kebijakan dan atribusi untuk Maps JavaScript API.
Ringkasan tempat
Ringkasan tempat adalah ringkasan singkat 100 karakter yang khusus untuk ID tempat tertentu, untuk memberikan ringkasan tingkat tinggi tentang suatu tempat. Ringkasan tempat dapat menyoroti makanan, layanan, atau barang populer yang tersedia untuk dibeli di suatu lokasi:
-
"Restoran Forum Shops yang menyajikan hidangan tradisional Italia dalam porsi besar di tempat kasual."
-
"Salon bergaya yang menawarkan potongan rambut dan pewarnaan, serta penataan rambut."
-
"Toko besar dengan banyak vendor yang menawarkan berbagai dekorasi, furnitur, dan pakaian vintage."
Ringkasan tempat tersedia untuk jenis tempat yang ditampilkan di Jenis yang didukung untuk kategori Budaya, Hiburan dan Rekreasi, Makanan dan Minuman, Belanja, Layanan, dan Olahraga.
Ringkasan tempat didukung untuk tempat menarik dalam bahasa dan wilayah berikut:
| Language | Wilayah |
|---|---|
| Inggris |
India Amerika Serikat |
Meminta ringkasan tempat
Untuk meminta ringkasan tempat generatif, sertakan kolom generativeSummary
saat memanggil fetchFields():
await place.fetchFields({ fields: [ 'generativeSummary', // Include other fields as needed. ], });
Gunakan properti generativeSummary
untuk mengambil ringkasan tempat. Cuplikan berikut mengambil ringkasan dan
teks pengungkapan dari generativeSummary:
if (place.generativeSummary) { console.log("Place Overview:", place.generativeSummary.overview); console.log("Disclosure:", place.generativeSummary.disclosureText); }
Ringkasan ulasan
Ringkasan ulasan adalah ringkasan yang dibuat hanya berdasarkan ulasan pengguna. Dengan menyintesis elemen utama ulasan pengguna, seperti atribut tempat dan sentimen pengulas, ringkasan ulasan memberikan insight tingkat tinggi dan membantu pengguna membuat keputusan yang tepat.
Misalnya, ringkasan ulasan Ferry Building di San Francisco mencakup informasi mulai dari makanan dan belanja hingga pemandangan dan suasana:
"Pengunjung mengatakan bahwa landmark bersejarah ini menawarkan beragam pilihan toko, restoran, dan pasar petani, dengan banyak yang memuji pemandangan teluk dan kota. Mereka juga menyoroti suasana yang semarak, akses feri yang nyaman ke tujuan lain, dan peluang untuk menikmati bisnis lokal."
Ringkasan ulasan didukung untuk tempat menarik dalam bahasa dan wilayah berikut:
| Language | Wilayah |
|---|---|
| Inggris | Argentina, Bolivia, Brasil, Cile, Kolombia, Kosta Rika, Republik Dominika, Ekuador, Guatemala, India, Jepang, Meksiko, Paraguay, Peru, Inggris Raya, Amerika Serikat, Uruguay, Venezuela |
| Jepang | Jepang |
| Portugis | Brasil |
| Spanyol | Argentina, Bolivia, Cile, Kolombia, Kosta Rika, Republik Dominika, Ekuador, Guatemala, Meksiko, Paraguay, Peru, Amerika Serikat, Uruguay, Venezuela |
Meminta ringkasan peninjauan
Untuk meminta ringkasan ulasan, sertakan kolom reviewSummary
saat memanggil fetchFields():
await place.fetchFields({ fields: [ 'reviewSummary', // Include other fields as needed. ], });
Gunakan
properti reviewSummary
untuk mengambil ringkasan ulasan. Untuk mengambil ringkasan ulasan, akses properti reviewSummary.text. Cuplikan berikut mengambil teks dari reviewSummary.
if (place.reviewSummary) { console.log("Place Review Summary:", place.reviewSummary.text); }
Ringkasan area
Ringkasan area dibuat untuk area di sekitar suatu tempat. Ringkasan area memberikan konteks tambahan untuk suatu lokasi, termasuk tempat menarik di sekitar, sehingga pengguna dapat membuat keputusan yang lebih tepat tentang tempat tujuan dan aktivitas yang akan dilakukan setelah tiba di sana. Misalnya, saat mengunjungi kota baru, Anda dapat melihat ringkasan lingkungan yang dibuat untuk hotel guna mempelajari lebih lanjut area sekitarnya:
-
"Kawasan yang ramai di San Francisco ini, yang memadukan North Beach dan Chinatown, terletak di barat laut Financial District dan menampilkan landmark sastra, objek wisata budaya yang unik, dan beragam restoran. Tempat terkenal di antaranya City Lights Bookstore yang ikonis, Cable Car Museum yang menarik, dan jalanan Chinatown yang ramai."
Jika Anda mempertimbangkan untuk mengisi daya kendaraan listrik, Anda dapat melihat ringkasan yang dibuat untuk stasiun pengisian daya kendaraan listrik untuk mempelajari lebih lanjut area di sekitarnya:
-
"Area ini menawarkan berbagai pilihan tempat makan dalam jarak 9 menit berjalan kaki, termasuk Starbucks, Sushi Jin, dan Safeway."
Selain deskripsi area, respons juga berisi daftar instance Place
untuk tempat yang dirujuk dalam deskripsi; panggil fetchFields() pada instance Place
ini untuk meminta detail lebih lanjut untuk setiap tempat.
Ada dua jenis ringkasan area yang didukung AI:
-
Ringkasan lingkungan sekitar: Ringkasan umum lokasi menarik di sekitar untuk tempat dengan jenis
premise,street_address, dan semua jenis dalam kategori Perumahan dan Penginapan. -
Ringkasan fasilitas stasiun pengisian kendaraan listrik: Ringkasan tingkat tinggi tempat menarik terdekat untuk tempat dengan jenis
electric_vehicle_charging_station.
Ringkasan area didukung untuk tempat menarik dalam bahasa dan wilayah berikut:
| Language | Wilayah |
|---|---|
| Inggris | Amerika Serikat |
Meminta ringkasan lingkungan
Anda dapat meminta ringkasan lingkungan untuk tempat dengan jenis premise,
street_address, dan semua jenis dalam kategori Perumahan dan
Penginapan. Untuk meminta ringkasan lingkungan, sertakan kolom
neighborhoodSummary saat memanggil fetchFields():
await place.fetchFields({ fields: [ 'neighborhoodSummary', // Include other fields as needed. ], });
Gunakan properti neighborhoodSummary
untuk mengambil ringkasan lingkungan. Untuk mengambil ringkasan lingkungan, akses properti
neighborhoodSummary.content untuk mendapatkan teks.
Cuplikan berikut mengambil konten neighborhoodSummary:
if (place.neighborhoodSummary) { console.log("Place Neighborhood Summary:", place.neighborhoodSummary.overview.content); }
Meminta ringkasan fasilitas stasiun pengisian kendaraan listrik
Anda dapat meminta ringkasan fasilitas SPKLU untuk tempat dengan jenis
electric_vehicle_charging_station. Ringkasan fasilitas EVCS menawarkan empat jenis
ringkasan: overview, coffee, restaurant, dan
store; oleh karena itu, struktur datanya adalah array objek, yang masing-masing berisi
ringkasan. Untuk meminta ringkasan fasilitas SPKLU, sertakan kolom
evChargeAmenitySummary saat memanggil fetchFields():
await place.fetchFields({ fields: [ 'evChargeAmenitySummary', // Include other fields as needed. ], });
Gunakan properti evChargeAmenitySummary
untuk mengambil ringkasan fasilitas stasiun pengisian kendaraan listrik. Untuk mengambil teks dari
ringkasan, akses properti content dari properti evChargeAmenitySummary.overview,
evChargeAmenitySummary.coffee, evChargeAmenitySummary.restaurant, dan
evChargeAmenitySummary.store.
Cuplikan berikut mengambil konten 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); }