KI-basierte Zusammenfassungen

Vollständigen Quellcode des Beispiels ansehen

Suchen Sie nach Orten, um die KI-basierten Zusammenfassungen zu sehen. Hier einige Beispiele für vorgeschlagene Suchanfragen:

  • „Hotel“ für Stadtteilzusammenfassungen.
  • „Ladestation für Elektrofahrzeuge“ für Zusammenfassungen von Ladestationen für Elektrofahrzeuge.
  • Alle Restaurants oder Unternehmen für Orts- und Bewertungszusammenfassungen.

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>

Testbeispiel

KI-basierte Zusammenfassungen sind Übersichten über einen Ort oder eine Region, die hilfreiche Informationen zu bestimmten Orten, der Umgebung eines Orts und Rezensionen zu einem Ort enthalten. Es gibt drei verschiedene Arten von KI-basierten Zusammenfassungen:

  • Ortszusammenfassung: Eine kurze, 100 Zeichen umfassende Übersicht zu einer bestimmten Orts-ID, in der viele verschiedene Datentypen zu einem allgemeinen Snapshot eines Orts zusammengefasst werden.

  • Zusammenfassung der Rezensionen: Eine automatisch generierte Zusammenfassung eines Orts, die ausschließlich auf Nutzerrezensionen basiert.

  • Zusammenfassung der Umgebung: Eine generierte Zusammenfassung der Umgebung eines Orts mit zusätzlichem Kontext, einschließlich nahegelegener Points of Interest. Zusammenfassungen für Gebiete können einen von zwei Typen haben:

    • Zusammenfassung der Umgebung: Ein allgemeiner Überblick über nahegelegene POIs für Orte mit den Typen premise, street_address und allen Typen in den Kategorien Wohnen und Unterkünfte.

    • Zusammenfassung der Annehmlichkeiten in der Nähe von Ladestationen für Elektrofahrzeuge: Eine allgemeine Übersicht über nahegelegene POIs für Orte vom Typ electric_vehicle_charging_station.

KI-basierte Zusammenfassungen abrufen

So rufen Sie KI-basierte Zusammenfassungen ab und zeigen sie an:

  1. Laden Sie die Places-Bibliothek.

    const { Place } = await google.maps.importLibrary("places");
  2. Place-Instanz abrufen Im folgenden Snippet wird gezeigt, wie eine Place-Instanz aus einer Orts-ID erstellt wird:

    const place = new Place("ChIJaYaXFTqq3oARNy537Kb_W_c");
  3. Geben Sie in Ihrem Aufruf von place.fetchFields() die Felder für die Arten von Zusammenfassungen an, die Sie verwenden möchten. Im folgenden Snippet werden alle Zusammenfassungsfelder angefordert:

    await place.fetchFields({
      fields: [
        'generativeSummary',
        'neighborhoodSummary',
        'reviewSummary',
        'evChargeAmenitySummary'
        // Include other fields as needed.
      ]
    });
              
  4. Rufen Sie die zusammengefassten Daten ab, indem Sie auf die Properties generativeSummary, neighborhoodSummary, reviewSummary und evChargeAmenitySummary zugreifen. Im folgenden Snippet sehen Sie, wie die Übersicht aus einem generativeSummary abgerufen wird.

    const summaryText = place.generativeSummary.overview;
            

Da nicht für alle Orte KI-basierte Zusammenfassungen verfügbar sind, sollten Sie prüfen, ob die erforderlichen Daten vorhanden sind, bevor Sie sie Nutzern anzeigen. Im folgenden Snippet wird mit einer if-Anweisung nach einem generativeSummary gesucht:

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

Alternativ können Sie einen Nullish-Operator verwenden, um kurz und bündig zu prüfen, ob eine Zusammenfassung vorhanden ist:

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

Erforderliche Quellenangaben einblenden

Alle KI-basierten Zusammenfassungen, die in Ihrer App angezeigt werden, müssen gemäß den Richtlinien und Standards von Google mit der entsprechenden Quellenangabe versehen werden. Weitere Informationen finden Sie unter Richtlinien und Quellenangaben für die Maps JavaScript API.

Zusammenfassungen für Orte

Ortszusammenfassungen sind kurze, 100 Zeichen umfassende Übersichten, die sich auf eine bestimmte Orts-ID beziehen und einen allgemeinen Überblick über einen Ort bieten. In Ortszusammenfassungen können beliebte Speisen, Dienstleistungen oder Waren hervorgehoben werden, die an einem Ort zum Kauf angeboten werden:

  • „Restaurant in den Forum Shops mit großen Portionen traditioneller italienischer Küche in ungezwungener Atmosphäre.“

  • „Stilvoller Salon mit Haarschnitten, Colorationen und Föhnen.“

  • „Großes Geschäft mit vielen Anbietern, die eine Vielzahl von Vintage-Dekoration, Möbeln und Kleidung anbieten.“

Ortszusammenfassungen sind für die in Unterstützte Typen aufgeführten Ortstypen für die Kategorien Kultur, Unterhaltung und Freizeit, Essen und Trinken, Shopping, Dienstleistungen und Sport verfügbar.

Zusammenfassungen von Orten werden für POIs in den folgenden Sprachen und Regionen unterstützt:

Sprache Region
Englisch

Indien

USA

: Zusammenfassungen von Orten sind nicht für alle Orte verfügbar.

Zusammenfassung eines Orts anfordern

Wenn Sie eine generierte Zusammenfassung für einen Ort anfordern möchten, fügen Sie beim Aufrufen von fetchFields() das Feld generativeSummary ein:

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

Verwenden Sie die Property generativeSummary, um Ortszusammenfassungen abzurufen. Im folgenden Snippet werden der Übersichtstext und der Offenlegungstext aus einem generativeSummary abgerufen:

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

Zusammenfassungen von Rezensionen

Rezensionszusammenfassungen werden ausschließlich auf Grundlage von Nutzerrezensionen generiert. Durch die Zusammenfassung wichtiger Elemente von Nutzerrezensionen, z. B. Ortsattribute und die Stimmung des Rezensenten, werden allgemeine Informationen bereitgestellt, die Nutzern helfen, fundierte Entscheidungen zu treffen.

Eine Zusammenfassung von Rezensionen zum Ferry Building in San Francisco enthält beispielsweise Informationen zu Essen und Shopping sowie zu Aussicht und Atmosphäre:

„Besucher sagen, dass dieses historische Wahrzeichen eine vielfältige Auswahl an Geschäften, Restaurants und einen Bauernmarkt bietet. Viele loben die Aussicht auf die Bucht und die Stadt. Sie heben auch die lebendige Atmosphäre, die gute Fähranbindung an andere Ziele und die Möglichkeit hervor, lokale Unternehmen zu besuchen.“

Zusammenfassungen von Rezensionen werden für Sehenswürdigkeiten in den folgenden Sprachen und Regionen unterstützt:

Sprache Region
Englisch Argentinien, Bolivien, Brasilien, Chile, Costa Rica, Dominikanische Republik, Ecuador, Guatemala, Indien, Japan, Kolumbien, Mexiko, Paraguay, Peru, Vereinigtes Königreich, USA, Uruguay, Venezuela
Japanisch Japan
Portugiesisch Brasilien
Spanisch Argentinien, Bolivien, Chile, Costa Rica, Dominikanische Republik, Ecuador, Guatemala, Kolumbien, Mexiko, Paraguay, Peru, Uruguay, USA, Venezuela
: Zusammenfassungen von Rezensionen sind nicht für alle Orte verfügbar.

Zusammenfassung der Rezensionen anfordern

Wenn Sie eine Zusammenfassung der Rezensionen anfordern möchten, fügen Sie das Feld reviewSummary beim Aufrufen von fetchFields() ein:

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

Verwenden Sie die Property reviewSummary, um Rezensionszusammenfassungen abzurufen. Zusammenfassungen von Rezensionen können Sie über das Attribut reviewSummary.text abrufen. Mit dem folgenden Snippet wird der Text aus einem reviewSummary abgerufen.

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

Zusammenfassungen für Regionen

Zusammenfassungen werden für die Umgebung eines Orts generiert. Gebietszusammenfassungen liefern zusätzlichen Kontext für einen Ort, einschließlich Sehenswürdigkeiten in der Nähe, damit Nutzer bessere Entscheidungen darüber treffen können, wohin sie gehen und was sie dort tun möchten. Wenn Sie beispielsweise eine neue Stadt besuchen, können Sie sich eine generierte Zusammenfassung des Stadtviertels für ein Hotel ansehen, um mehr über die Umgebung zu erfahren:

  • „Dieses lebhafte Viertel in San Francisco, das North Beach und Chinatown vereint, liegt nordwestlich des Financial District und bietet literarische Sehenswürdigkeiten, einzigartige kulturelle Attraktionen und vielfältige Restaurants. Zu den Sehenswürdigkeiten gehören der berühmte City Lights Bookstore, das faszinierende Cable Car Museum und die belebten Straßen von Chinatown.“

Wenn Sie ein Elektrofahrzeug aufladen möchten, können Sie sich eine Zusammenfassung für eine Ladestation für Elektrofahrzeuge ansehen, um mehr über die Umgebung zu erfahren:

  • „In dieser Gegend gibt es eine Reihe von Restaurants, die innerhalb von 9 Gehminuten erreichbar sind, darunter Starbucks, Sushi Jin und Safeway.“

Die Antwort enthält neben einer Beschreibung des Gebiets auch eine Liste von Place-Instanzen für die in der Beschreibung genannten Orte. Rufen Sie fetchFields() für diese Place-Instanzen auf, um weitere Details zu den einzelnen Orten anzufordern.

Es gibt zwei Arten von KI-basierten Bereichszusammenfassungen:

  • Zusammenfassung der Umgebung: Ein allgemeiner Überblick über nahegelegene POIs für Orte mit den Typen premise, street_address und allen Typen in den Kategorien Wohnen und Unterkünfte.

  • Zusammenfassung der Annehmlichkeiten in der Nähe von Ladestationen für Elektrofahrzeuge: Ein allgemeiner Überblick über nahegelegene POIs für Orte vom Typ electric_vehicle_charging_station.

Zusammenfassungen von Gebieten werden für POIs in den folgenden Sprachen und Regionen unterstützt:

Sprache Region
Englisch USA
: Zusammenfassungen von Gebieten sind nicht für alle Orte verfügbar.

Zusammenfassung eines Stadtteils anfordern

Sie können Zusammenfassungen von Stadtteilen für Orte mit den Typen premise, street_address und allen Typen in den Kategorien Wohnen und Unterkünfte anfordern. Wenn Sie eine Zusammenfassung für ein Viertel anfordern möchten, geben Sie das Feld neighborhoodSummary beim Aufrufen von fetchFields() an:

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

Verwenden Sie die Property neighborhoodSummary, um Zusammenfassungen von Stadtteilen abzurufen. Um Zusammenfassungen von Stadtteilen abzurufen, greifen Sie auf das Attribut neighborhoodSummary.content zu, um den Text zu erhalten.

Das folgende Snippet ruft den Inhalt eines neighborhoodSummary ab:

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

Zusammenfassung der Ausstattung einer Ladestation für Elektrofahrzeuge anfordern

Sie können Zusammenfassungen der Ausstattung von Ladestationen für Elektrofahrzeuge für Orte mit dem Typ electric_vehicle_charging_station anfordern. Die Zusammenfassung der EVCS-Ausstattung bietet vier Arten von Zusammenfassungen: overview, coffee, restaurant und store. Daher ist die Datenstruktur ein Array von Objekten, die jeweils eine Zusammenfassung enthalten. Wenn Sie eine Zusammenfassung der Ladestation für Elektrofahrzeuge anfordern möchten, fügen Sie das Feld evChargeAmenitySummary beim Aufrufen von fetchFields() hinzu:

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

Verwenden Sie die Eigenschaft evChargeAmenitySummary, um Zusammenfassungen der Ladestationen für Elektrofahrzeuge abzurufen. Wenn Sie Text aus den Zusammenfassungen abrufen möchten, greifen Sie auf das Attribut content der Attribute evChargeAmenitySummary.overview, evChargeAmenitySummary.coffee, evChargeAmenitySummary.restaurant und evChargeAmenitySummary.store zu.

Das folgende Snippet ruft den Inhalt eines evChargeAmenitySummary ab:

// 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);
}