خلاصه‌های با پشتیبانی هوش مصنوعی

مشاهده کد منبع نمونه کامل

برای دیدن خلاصه‌های با پشتیبانی هوش مصنوعی، مکان‌ها را جستجو کنید. چند جستجوی پیشنهادی:

  • «هتل» برای خلاصه‌های محله.
  • «ایستگاه شارژ خودرو برقی» برای خلاصه امکانات رفاهی ایستگاه شارژ خودرو برقی.
  • هر رستوران یا کسب‌وکاری برای خلاصه‌های مرور و مکان.

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>

خلاصه‌های تولیدشده با هوش مصنوعی نمای کلی از یک مکان یا منطقه هستند که اطلاعات مفیدی درباره مکان‌های خاص، منطقه اطراف یک مکان، و مرورهای مرتبط با یک مکان ارائه می‌دهند. سه نوع مختلف خلاصه با بهره‌گیری از هوش مصنوعی وجود دارد:

  • خلاصه مکان: نمای کلی مختصر ۱۰۰ نویسه‌ای مختص شناسه مکان داده‌شده، که انواع مختلف داده‌ها را در یک عکس آنی سطح بالا از مکان جمع‌آوری می‌کند.

  • خلاصه مرور: خلاصه تولیدشده از مکان که صرفاً براساس مرورهای کاربر است.

  • خلاصه منطقه: خلاصه تولیدشده برای منطقه اطراف مکان، که بافتار بیشتری ازجمله نقاط جالب اطراف را ارائه می‌دهد. خلاصه منطقه می‌تواند یکی از این دو نوع باشد:

    • خلاصه محله: نمای کلی سطح بالایی از نقاط جالب اطراف برای مکان‌هایی با نوع premise، street_address، و همه انواع در دسته‌های مسکن و اقامتگاه.

    • خلاصه امکانات رفاهی ایستگاه شارژ خودرو برقی: نمای کلی سطح بالا از مکان‌های جالب اطراف برای مکان‌هایی با نوع electric_vehicle_charging_station.

بازیابی خلاصه‌های هوشواره‌ای

برای بازیابی و نمایش خلاصه‌های با بهره‌گیری از هوش مصنوعی، این مراحل را دنبال کنید:

  1. بار کردن کتابخانه Places.

    const { Place } = await google.maps.importLibrary("places");
  2. نمونه‌ای از Place را دریافت کنید. قطعه کد زیر ایجاد نمونه Place از شناسه مکان را نشان می‌دهد:

    const place = new Place("ChIJaYaXFTqq3oARNy537Kb_W_c");
  3. در تماس با place.fetchFields()، فیلدهای مربوط به انواع خلاصه‌هایی را که می‌خواهید استفاده کنید مشخص کنید. در قطعه کد زیر، همه فیلدهای خلاصه درخواست شده‌اند:

    await place.fetchFields({
      fields: [
        'generativeSummary',
        'neighborhoodSummary',
        'reviewSummary',
        'evChargeAmenitySummary'
        // Include other fields as needed.
      ]
    });
              
  4. داده‌های خلاصه را با دسترسی به ویژگی‌های generativeSummary، neighborhoodSummary، reviewSummary، و evChargeAmenitySummary بازیابی کنید. قطعه کد زیر بازیابی نمای کلی را از generativeSummary نشان می‌دهد.

    const summaryText = place.generativeSummary.overview;
            

چون همه مکان‌ها خلاصه با بهره‌گیری از هوش مصنوعی ندارند، حتماً قبل‌از نمایش آن به کاربران، وجود داده‌های لازم را بررسی کنید. تکه‌کد زیر از عبارت if برای بررسی generativeSummary استفاده می‌کند:

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

یا اینکه از عملگر nullish برای بررسی مختصر وجود خلاصه استفاده کنید:

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

نمایش ارجاع‌های لازم

همه خلاصه‌های تولیدشده با هوش مصنوعی که در برنامه‌تان نمایش داده می‌شود باید با ارجاع مناسب مطابق با خط‌مشی‌ها و استانداردهای Google همراه باشد. برای اطلاعات بیشتر، خط‌مشی‌ها و ارجاع‌ها برای Maps JavaScript API را ببینید.

خلاصه مکان‌ها

خلاصه‌های مکان، نمای کلی کوتاه ۱۰۰ نویسه‌ای مختص شناسه مکان داده‌شده هستند تا عکس آنی سطح بالایی از مکان ارائه دهند. خلاصه مکان‌ها ممکن است غذاها، خدمات، یا کالاهای پرطرفدار دردسترس برای خرید در مکان را برجسته کند:

  • «غذاخوری Forum Shops که غذاهای سنتی ایتالیایی را در فضایی راحت و بی‌تکلف با حجم زیاد سرو می‌کند.»

  • «سالن شیک که خدمات کوتاهی و رنگ مو، به‌علاوه سشوار ارائه می‌دهد.»

  • «فروشگاه بزرگ با فروشندگان متعدد که انواع دکوراسیون، مبلمان، و پوشاک قدیمی را عرضه می‌کنند.»

خلاصه مکان‌ها برای انواع مکان‌های نشان‌داده‌شده در انواع پشتیبانی‌شده برای دسته‌های فرهنگ، سرگرمی و تفریح، غذا و نوشیدنی، خرید، خدمات، و ورزش دردسترس است.

خلاصه مکان برای نقاط دیدنی در زبان‌ها و مناطق زیر پشتیبانی می‌شود:

زبان منطقه
انگلیسی

هند

ایالات متحده

درخواست خلاصه مکان

برای درخواست خلاصه مکان زایا، فیلد generativeSummary را هنگام فراخوانی fetchFields() اضافه کنید:

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

از ویژگی generativeSummary برای بازیابی خلاصه مکان‌ها استفاده کنید. گزیده زیر نمای کلی و نوشتار شفاف‌سازی را از generativeSummary بازیابی می‌کند:

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

خلاصه‌های مرور

خلاصه مرورها خلاصه‌هایی تولیدشده هستند که صرفاً براساس مرورهای کاربران ایجاد می‌شوند. خلاصه مرورها با ترکیب عناصر کلیدی مرورهای کاربر، مثل مشخصه‌های مکان و احساسات مرورگر، اطلاعات آماری سطح بالایی ارائه می‌دهد و به کاربران کمک می‌کند تصمیمات آگاهانه بگیرند.

برای مثال، خلاصه مرورهای «ساختمان فری» در سان فرانسیسکو شامل اطلاعاتی از غذا و خرید گرفته تا مناظر و جو است:

«بازدیدکنندگان می‌گویند این مکان تاریخی مجموعه‌ای متنوع از فروشگاه‌ها، رستوران‌ها، و بازار کشاورزان را ارائه می‌دهد و بسیاری از آن‌ها چشم‌اندازهای خلیج و شهر را تحسین می‌کنند. آن‌ها همچنین به فضای پرجنب‌وجوش، دسترسی راحت با کشتی به مقصدهای دیگر، و فرصت لذت بردن از کسب‌وکارهای محلی اشاره می‌کنند.»

خلاصه مرورها برای مکان‌های جالب به زبان‌ها و در مناطق زیر پشتیبانی می‌شود:

زبان منطقه
انگلیسی آرژانتین، بولیوی، برزیل، شیلی، کلمبیا، کاستاریکا، جمهوری دومینیکن، اکوادور، گواتمالا، هند، ژاپن، مکزیک، پاراگوئه، پرو، پادشاهی متحد (UK)، ایالات متحده، اروگوئه، ونزوئلا
ژاپنی ژاپن
پرتغالی برزیل
اسپانیایی آرژانتین، بولیوی، پاراگوئه، پرو، جمهوری دومینیکن، شیلی، کلمبیا، کاستاریکا، گواتمالا، مکزیک، ونزوئلا، ایالات متحده، اروگوئه

درخواست خلاصه مرورها

برای درخواست خلاصه مرورها، هنگام تماس با fetchFields()، فیلد reviewSummary را اضافه کنید:

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

از ویژگی reviewSummary برای بازیابی خلاصه مرورها استفاده کنید. برای بازیابی خلاصه مرورها، به ویژگی reviewSummary.text دسترسی پیدا کنید. قطعه کد زیر نوشتار را از reviewSummary بازیابی می‌کند.

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

خلاصه منطقه

خلاصه‌های منطقه برای منطقه اطراف مکان تولید می‌شود. خلاصه‌های منطقه بافت بیشتری برای مکان ارائه می‌دهد، ازجمله نقاط جالب اطراف، تا کاربران بتوانند تصمیم آگاهانه‌تری درباره اینکه کجا بروند و وقتی به آنجا رسیدند چه کار کنند بگیرند. برای مثال، هنگام بازدید از شهری جدید، می‌توانید خلاصه تولیدشده محله را برای هتلی مشاهده کنید تا درباره منطقه اطراف آن بیشتر بدانید:

  • «این منطقه پرجنب‌وجوش در سان‌فرانسیسکو، که ترکیبی از نورث بیچ و چایناتاون است، در شمال غربی منطقه مالی واقع شده و دارای مکان‌های تاریخی ادبی، جاذبه‌های فرهنگی منحصربه‌فرد، و غذاخوری‌های متنوع است. مکان‌های برجسته عبارتند از «کتاب‌فروشی سیتی لایتس»، «موزه خودروهای کابلی» جذاب، و خیابان‌های شلوغ «چایناتاون».»

اگر قصد دارید خودرو برقی را شارژ کنید، می‌توانید خلاصه تولیدشده برای ایستگاه شارژ خودرو برقی را مشاهده کنید تا درباره منطقه اطراف بیشتر بدانید:

  • «این منطقه گزینه‌های متنوعی برای صرف غذا در فاصله ۹ دقیقه پیاده‌روی ارائه می‌دهد، ازجمله استارباکس، سوشی جین، و سیف‌وی.»

همراه با شرح منطقه، پاسخ حاوی فهرستی از نمونه‌های Place برای مکان‌های ارجاع‌شده در شرح نیز هست؛ برای درخواست جزئیات بیشتر برای هر مکان، fetchFields() را در این نمونه‌های Place فراخوانی کنید.

دو نوع خلاصه منطقه با بهره‌گیری از هوش مصنوعی وجود دارد:

  • خلاصه محله: نمای کلی سطح بالا از نقاط جالب اطراف برای مکان‌هایی با نوع premise،‏ street_address، و همه انواع در دسته‌های مسکن و اقامتگاه.

  • خلاصه امکانات رفاهی ایستگاه شارژ خودرو برقی: نمای کلی سطح بالا از مکان‌های جالب اطراف برای مکان‌هایی با نوع electric_vehicle_charging_station.

خلاصه منطقه برای مکان‌های جالب در زبان‌ها و مناطق زیر پشتیبانی می‌شود:

زبان منطقه
انگلیسی ایالات متحده

درخواست خلاصه محله

می‌توانید برای مکان‌هایی با نوع premise، street_address، و همه انواع در دسته‌های مسکن و اقامتگاه خلاصه محله درخواست کنید. برای درخواست خلاصه محله، هنگام فراخوانی fetchFields()، فیلد neighborhoodSummary را اضافه کنید:

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

از ویژگی neighborhoodSummary برای بازیابی خلاصه‌های محله استفاده کنید. برای بازیابی خلاصه‌های محله، به ویژگی neighborhoodSummary.content دسترسی پیدا کنید تا نوشتار را دریافت کنید.

قطعه کد زیر محتوای neighborhoodSummary را بازیابی می‌کند:

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

درخواست خلاصه امکانات رفاهی ایستگاه شارژ خودرو برقی

می‌توانید خلاصه امکانات رفاهی ایستگاه شارژ خودرو برقی را برای مکان‌هایی با نوع electric_vehicle_charging_station درخواست کنید. خلاصه امکانات رفاهی EVCS چهار نوع خلاصه ارائه می‌دهد: overview،‏ coffee،‏ restaurant، و store؛ به همین دلیل، ساختار داده‌ها آرایه‌ای از اشیاء است که هرکدام حاوی یک خلاصه هستند. برای درخواست خلاصه امکانات رفاهی ایستگاه شارژ خودرو برقی، هنگام فراخوانی fetchFields()، فیلد evChargeAmenitySummary را اضافه کنید:

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

از ویژگی evChargeAmenitySummary برای بازیابی خلاصه امکانات رفاهی ایستگاه شارژ خودرو برقی استفاده کنید. برای بازیابی نوشتار از خلاصه‌ها، به ویژگی content از ویژگی‌های evChargeAmenitySummary.overview، evChargeAmenitySummary.coffee، evChargeAmenitySummary.restaurant، و evChargeAmenitySummary.store دسترسی پیدا کنید.

قطعه کد زیر محتوای 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);
}