องค์ประกอบรายละเอียดสถานที่ขั้นสูง

องค์ประกอบรายละเอียดสถานที่ขั้นสูงและองค์ประกอบรายละเอียดสถานที่ขั้นสูงแบบกะทัดรัดเป็นองค์ประกอบ HTML ที่แสดงผลรายละเอียดของสถานที่ ดังนี้

ทั้งองค์ประกอบรายละเอียดสถานที่ขั้นสูงและองค์ประกอบรายละเอียดสถานที่ขั้นสูงแบบกะทัดรัดมีฟีเจอร์ขั้นสูงเหมือนกัน ซึ่งรวมถึงการปรับแต่งปุ่มดำเนินการ การละเว้นชื่อสถานที่ และการกรองรีวิวและสื่อ

ใช้เครื่องมือปรับแต่งเพื่อดูว่าพร็อพเพอร์ตี้ชุดต่างๆ จะส่งผลต่อลักษณะที่ปรากฏขององค์ประกอบรายละเอียดสถานที่อย่างไร และเข้าถึงโค้ดใน HTML/CSS, Kotlin/XML และ Swift

องค์ประกอบรายละเอียดสถานที่ขั้นสูง

คลิกเครื่องหมายบนแผนที่เพื่อดูรายละเอียดสถานที่ในองค์ประกอบรายละเอียดสถานที่ขั้นสูง

AdvancedPlaceDetailsElement รองรับองค์ประกอบเนื้อหาที่หลากหลาย ซึ่งรวมถึงเวลาทำการทั้งหมด เว็บไซต์ หมายเลขโทรศัพท์ สรุปที่ทำงานด้วยระบบ AI พร้อมการสำรองข้อมูลไปยังสรุปจากบรรณาธิการ ไฮไลต์เฉพาะประเภท รีวิว สรุปรีวิวที่ทำงานด้วยระบบ AI, Plus Code และรายการฟีเจอร์

หากต้องการแสดงรายละเอียดสถานที่บนแผนที่ ให้เพิ่มองค์ประกอบ gmp-advanced-place-details ลงในองค์ประกอบ gmp-map ในหน้า HTML ใส่องค์ประกอบย่อย gmp-place-details-place-request เพื่อเลือกสถานที่ ซึ่งอาจเป็นออบเจ็กต์ Place, รหัสสถานที่ หรือชื่อทรัพยากรของสถานที่ ดังนี้

<gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID">
  <div class="widget-container" slot="control-inline-start-block-start">
    <gmp-advanced-place-details>
      <gmp-place-details-place-request place="places/ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
      <gmp-place-all-content></gmp-place-all-content>
    </gmp-advanced-place-details>
  </div>
  <gmp-advanced-marker></gmp-advanced-marker>
</gmp-map>

กำหนดค่าเนื้อหา

คุณควบคุมเนื้อหาของสถานที่ที่เฉพาะเจาะจงซึ่งแสดงโดยองค์ประกอบ gmp-advanced-place-details ได้โดยการฝังองค์ประกอบย่อยเพื่อเลือกและกำหนดค่ารายละเอียดสถานที่ ดังที่แสดงในตัวอย่างนี้

        <gmp-advanced-place-details>
            <gmp-place-details-place-request
                place="places/ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
                <gmp-place-name></gmp-place-name>
                <gmp-place-address></gmp-place-address>
                <gmp-place-rating></gmp-place-rating>
                <gmp-place-type></gmp-place-type>
                <gmp-place-price></gmp-place-price>
                <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
                <gmp-place-opening-hours></gmp-place-opening-hours>
                <gmp-place-website></gmp-place-website>
                <gmp-place-phone-number></gmp-place-phone-number>
                <gmp-place-summary></gmp-place-summary>
                <gmp-place-type-specific-highlights></gmp-place-type-specific-highlights>
                <gmp-place-review-summary></gmp-place-review-summary>
                <gmp-place-reviews></gmp-place-reviews>
                <gmp-place-feature-list></gmp-place-feature-list>
                <gmp-place-attribution></gmp-place-attribution>
        </gmp-advanced-place-details>

องค์ประกอบเนื้อหาย่อยแต่ละรายการจะเลือกรายละเอียดสถานที่ที่เกี่ยวข้องเพื่อแสดง ดังนี้ gmp-place-address เลือกที่อยู่ของสถานที่ gmp-place-price เลือกระดับราคาของสถานที่ เป็นต้น องค์ประกอบ gmp-place-summary และ gmp-place-review-summary จะแสดงข้อมูลสรุปของสถานที่และรีวิวที่ทำงานด้วยระบบ AI ตามลำดับ ลำดับขององค์ประกอบย่อยไม่เกี่ยวข้อง เนื่องจากรายละเอียดที่เลือกจะแสดงผลตามลำดับที่กำหนดไว้ล่วงหน้าเสมอ

องค์ประกอบบางอย่างเหล่านี้สามารถกำหนดค่าเพิ่มเติมได้โดยใช้แอตทริบิวต์เฉพาะเนื้อหา ดังนี้

  • องค์ประกอบ gmp-place-media ใช้เพื่อแสดงรูปภาพเดียว และมีแอตทริบิวต์ lightbox-preferred ที่จะเปิดรูปภาพในไลท์บ็อกซ์เมื่อคลิก ระบบจะปิดใช้ไลท์บ็อกซ์ไว้โดยค่าเริ่มต้น
  • องค์ประกอบ gmp-place-attribution ใช้เพื่อแสดงการกำหนดค่าการระบุแหล่งที่มาของข้อมูล Maps API ที่ครอบคลุม เช่น แหล่งที่มาของรูปภาพหรือรีวิว แอตทริบิวต์ light-scheme-color และ dark-scheme-color ใช้เพื่อตั้งค่าสีของข้อความแสดงแหล่งที่มาในโหมดสว่างและโหมดมืด

ดูข้อมูลเพิ่มเติมเกี่ยวกับองค์ประกอบเนื้อหาทั้งหมดที่รองรับได้ในเอกสารอ้างอิงการปรับแต่งเนื้อหาวิดเจ็ตสถานที่

เพื่อความสะดวก คุณยังสามารถใช้ gmp-place-all-content เพื่อแสดงรายละเอียดทั้งหมดที่มีอยู่ในองค์ประกอบรายละเอียดสถานที่ขั้นสูง หรือใช้ร่วมกับ gmp-place-standard-content เพื่อแสดงการกำหนดค่ามาตรฐานได้ด้วย

กำหนดค่าลักษณะที่ปรากฏ

ความกว้างที่แนะนำสำหรับองค์ประกอบ gmp-advanced-place-details คือ 250-400 พิกเซล ความกว้างที่น้อยกว่า 250 พิกเซลอาจแสดงผลไม่ถูกต้อง กำหนดความสูงให้เหมาะกับแอปพลิเคชันของคุณ องค์ประกอบรายละเอียดสถานที่ขั้นสูงออกแบบมาให้เลื่อนภายในพื้นที่ที่จัดสรรไว้ตามต้องการ

องค์ประกอบ gmp-advanced-place-details ยังรองรับพร็อพเพอร์ตี้ CSS ที่กำหนดเองที่หลากหลายเพื่อกำหนดค่าสีและแบบอักษรขององค์ประกอบด้วย ดูรายละเอียดเพิ่มเติมได้ที่การจัดรูปแบบที่กำหนดเองของ Places UI Kit

ดูตัวอย่างโค้ดที่สมบูรณ์

TypeScript

// Use querySelector to select elements for interaction.
const map = document.querySelector<google.maps.MapElement>('gmp-map')!;
const placeDetails = document.querySelector<
    HTMLElement & { place?: google.maps.places.Place }
>('gmp-advanced-place-details')!;
const placeDetailsRequest = document.querySelector<HTMLElement>(
    'gmp-place-details-place-request'
)!;
const marker = document.querySelector<google.maps.marker.AdvancedMarkerElement>(
    'gmp-advanced-marker'
)!;

async function init(): Promise<void> {
    // Request needed libraries.
    await Promise.all([
        google.maps.importLibrary('maps'),
        google.maps.importLibrary('marker'),
        google.maps.importLibrary('places'),
    ]);

    // Hide the map type control.
    map.innerMap.setOptions({ mapTypeControl: false });

    // Function to update map and marker based on place details
    const updateMapAndMarker = () => {
        if (placeDetails.place?.location) {
            map.innerMap.panTo(placeDetails.place.location);
            map.innerMap.setZoom(16); // Set zoom after panning if needed
            marker.position = placeDetails.place.location;
            marker.collisionBehavior = 'REQUIRED_AND_HIDES_OPTIONAL';
            marker.style.display = 'block';
        }
    };

    // Set up map once widget is loaded.
    placeDetails.addEventListener('gmp-load', () => {
        updateMapAndMarker();
    });

    // Add an event listener to handle clicks.
    map.innerMap.addListener(
        'click',
        (event: google.maps.MapMouseEvent | google.maps.IconMouseEvent) => {
            marker.position = null;
            event.stop();
            if ('placeId' in event && event.placeId) {
                // Fire when the user clicks a POI.
                placeDetailsRequest.setAttribute(
                    'place',
                    `places/${event.placeId}`
                );
                updateMapAndMarker();
            } else {
                // Fire when the user clicks the map (not on a POI).
                console.log('No place was selected.');
                marker.style.display = 'none';
            }
        }
    );
}

void init();

JavaScript

// Use querySelector to select elements for interaction.
const map = document.querySelector('gmp-map');
const placeDetails = document.querySelector('gmp-advanced-place-details');
const placeDetailsRequest = document.querySelector(
    'gmp-place-details-place-request'
);
const marker = document.querySelector('gmp-advanced-marker');

async function init() {
    // Request needed libraries.
    await Promise.all([
        google.maps.importLibrary('maps'),
        google.maps.importLibrary('marker'),
        google.maps.importLibrary('places'),
    ]);

    // Hide the map type control.
    map.innerMap.setOptions({ mapTypeControl: false });

    // Function to update map and marker based on place details
    const updateMapAndMarker = () => {
        if (placeDetails.place?.location) {
            map.innerMap.panTo(placeDetails.place.location);
            map.innerMap.setZoom(16); // Set zoom after panning if needed
            marker.position = placeDetails.place.location;
            marker.collisionBehavior = 'REQUIRED_AND_HIDES_OPTIONAL';
            marker.style.display = 'block';
        }
    };

    // Set up map once widget is loaded.
    placeDetails.addEventListener('gmp-load', () => {
        updateMapAndMarker();
    });

    // Add an event listener to handle clicks.
    map.innerMap.addListener('click', (event) => {
        marker.position = null;
        event.stop();
        if ('placeId' in event && event.placeId) {
            // Fire when the user clicks a POI.
            placeDetailsRequest.setAttribute(
                'place',
                `places/${event.placeId}`
            );
            updateMapAndMarker();
        } else {
            // Fire when the user clicks the map (not on a POI).
            console.log('No place was selected.');
            marker.style.display = 'none';
        }
    });
}

void init();

CSS

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
    height: 100%;
    margin: 0;
    padding: 0;
}

.container {
    display: flex;
    height: 100vh;
    width: 100%;
}

gmp-map {
    flex-grow: 1;
}

.ui-panel {
    width: 400px;
    margin-left: 20px;
    margin-top: 10px;
}

gmp-place-details {
    width: 100%;
    margin: 0;
    border: none;
}

HTML

<!doctype html>
<html>
    <head>
        <title>Place Details with Google Maps</title>
        <meta charset="utf-8" />
        <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",
                v: "beta"
            });
        </script>
    </head>
    <body>
        <div class="container">
            <!-- map-id is required to use advanced markers. See https://developers.google.com/maps/documentation/javascript/map-ids/mapid-over. -->
            <gmp-map zoom="17" map-id="DEMO_MAP_ID">
                <gmp-advanced-marker></gmp-advanced-marker>
            </gmp-map>
            <div class="ui-panel">
                <gmp-advanced-place-details>
                    <gmp-place-details-place-request
                        place="places/ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>

                    <gmp-place-name></gmp-place-name>
                    <gmp-place-address></gmp-place-address>
                    <gmp-place-rating></gmp-place-rating>
                    <gmp-place-type></gmp-place-type>
                    <gmp-place-price></gmp-place-price>
                    <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
                    <gmp-place-opening-hours></gmp-place-opening-hours>
                    <gmp-place-website></gmp-place-website>
                    <gmp-place-phone-number></gmp-place-phone-number>
                    <gmp-place-summary></gmp-place-summary>
                    <gmp-place-type-specific-highlights></gmp-place-type-specific-highlights>
                    <gmp-place-review-summary></gmp-place-review-summary>
                    <gmp-place-reviews></gmp-place-reviews>
                    <gmp-place-feature-list></gmp-place-feature-list>
                </gmp-advanced-place-details>
            </div>
        </div>
    </body>
</html>

องค์ประกอบแบบกะทัดรัดของรายละเอียดสถานที่ขั้นสูง

คลิกเครื่องหมายบนแผนที่เพื่อดูรายละเอียดสถานที่ในองค์ประกอบแบบกะทัดรัดของรายละเอียดสถานที่ขั้นสูง

AdvancedPlaceDetailsCompactElement จะแสดงรายละเอียดของสถานที่ที่เลือกโดยใช้พื้นที่น้อยที่สุด ซึ่งอาจเป็นประโยชน์ในหน้าต่างข้อมูลที่ไฮไลต์สถานที่บนแผนที่ ในประสบการณ์การใช้งานโซเชียลมีเดีย เช่น การแชร์ตำแหน่งในแชท เป็นคำแนะนำสำหรับการเลือกตำแหน่งปัจจุบัน หรือภายในบทความสื่อเพื่ออ้างอิงสถานที่ใน Google Maps AdvancedPlaceDetailsCompactElement สามารถแสดงชื่อที่แสดง ที่อยู่ คะแนน ประเภท ราคา ไอคอนการช่วยเหลือพิเศษ สถานะเปิด และรูปภาพเดียว โดยจะแสดงในแนวนอนหรือแนวตั้งก็ได้ตามที่เลือกโดยแอตทริบิวต์ orientation

ในข้อมูลโค้ดต่อไปนี้ gmp-advanced-place-details-compact ได้รับการกำหนดค่าโดยตั้งค่า orientation เป็น horizontal แอตทริบิวต์เพิ่มเติม truncation-preferred จะตัดเนื้อหาบางส่วนเพื่อให้พอดีกับบรรทัดเดียวแทนที่จะตัดขึ้นบรรทัดใหม่ องค์ประกอบ gmp-advanced-place-details-compact มีองค์ประกอบย่อย gmp-place-details-place-request เพื่อเลือกสถานที่ ซึ่งอาจเป็นออบเจ็กต์ Place, รหัสสถานที่ หรือชื่อทรัพยากรของสถานที่

  <gmp-advanced-place-details-compact orientation="horizontal" truncation-preferred>
    <gmp-place-details-place-request place="places/ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
    <gmp-place-all-content></gmp-place-all-content>
  </gmp-advanced-place-details-compact>

กำหนดค่าเนื้อหา

คุณควบคุมเนื้อหาสถานที่ที่เฉพาะเจาะจงซึ่งแสดงโดยองค์ประกอบ gmp-advanced-place-details-compact ได้โดยการฝังองค์ประกอบย่อยเพื่อเลือกและกำหนดค่ารายละเอียดสถานที่ ดังที่แสดงในข้อมูลโค้ดนี้

<gmp-advanced-place-details-compact>
  <gmp-place-details-place-request place="places/ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
    <gmp-place-photo></gmp-place-photo>
    <gmp-place-name></gmp-place-name>
    <gmp-place-rating></gmp-place-rating>
    <gmp-place-address></gmp-place-address>
    <gmp-place-opening-hours></gmp-place-opening-hours>
    <gmp-place-attribution></gmp-place-attribution>
</gmp-advanced-place-details-compact>

องค์ประกอบเนื้อหาย่อยแต่ละรายการจะเลือกรายละเอียดสถานที่ที่เกี่ยวข้องเพื่อแสดง ลำดับขององค์ประกอบย่อยไม่เกี่ยวข้อง เนื่องจากรายละเอียดที่เลือกจะแสดงผลตามลำดับที่กำหนดไว้ล่วงหน้าเสมอ องค์ประกอบบางอย่างเหล่านี้สามารถกำหนดค่าเพิ่มเติมได้โดยใช้แอตทริบิวต์เฉพาะเนื้อหา

ดูข้อมูลเพิ่มเติมเกี่ยวกับองค์ประกอบเนื้อหาทั้งหมดที่รองรับได้ในเอกสารอ้างอิงการปรับแต่งเนื้อหาวิดเจ็ตสถานที่

เพื่อความสะดวก คุณยังสามารถใช้ gmp-place-all-content เพื่อแสดงรายละเอียดทั้งหมดที่มีอยู่ในองค์ประกอบ Advanced รายละเอียดสถานที่ กะทัดรัด หรือใช้ gmp-place-standard-content เพื่อแสดงการกำหนดค่า Standard ได้ด้วย

กำหนดค่าลักษณะที่ปรากฏ

ช่วงความกว้างที่แนะนำสำหรับองค์ประกอบ gmp-advanced-place-details-compact ในแนวตั้งคือ 180-300 พิกเซล ความกว้างที่น้อยกว่า 160 พิกเซลอาจแสดงผลไม่ถูกต้อง อย่าตั้งค่าความสูงคงที่

ช่วงความกว้างที่แนะนำสำหรับองค์ประกอบ gmp-advanced-place-details-compact ในการวางแนวแนวนอนคือ 180-500 พิกเซล ความกว้างที่น้อยกว่า 160 พิกเซลอาจแสดงผลไม่ถูกต้อง หากความกว้างน้อยกว่า 350 พิกเซล ระบบจะไม่แสดงภาพปก อย่าตั้งค่าความสูงคงที่

องค์ประกอบ gmp-advanced-place-details-compact ยังรองรับพร็อพเพอร์ตี้ CSS ที่กำหนดเองที่หลากหลายเพื่อกำหนดค่าสีและแบบอักษรขององค์ประกอบด้วย ดูรายละเอียดเพิ่มเติมได้ที่การจัดรูปแบบที่กำหนดเองของ Places UI Kit

โปรดทราบว่าหากเพิ่มองค์ประกอบ Advanced รายละเอียดสถานที่ Compact ลงในหน้าต่างข้อมูล คุณต้องใช้รูปแบบที่กำหนดเองกับองค์ประกอบ gmp-advanced-place-details-compact โดยตรง เนื่องจากหน้าต่างข้อมูลเป็นส่วนหนึ่งของ Shadow DOM ของแผนที่ รูปแบบ CSS ภายนอกจึงไม่มีผล

gmp-advanced-place-details-compact {
  --gmp-color-surface: #202124;
  --gmp-color-on-surface: #ffffff;
  --gmp-color-on-surface-variant: #9aa0a6;
  --gmp-color-primary: #8ab4f8;
  --gmp-font-family: "Roboto", sans-serif;
}

ดูตัวอย่างโค้ดที่สมบูรณ์

TypeScript

// Use querySelector to select elements for interaction.
const map = document.querySelector<google.maps.MapElement>('gmp-map')!;
const placeDetails = document.querySelector<
    HTMLElement & { place?: google.maps.places.Place }
>('gmp-advanced-place-details-compact')!;
const placeDetailsRequest = document.querySelector<HTMLElement>(
    'gmp-place-details-place-request'
)!;
const marker = document.querySelector<google.maps.marker.AdvancedMarkerElement>(
    'gmp-advanced-marker'
)!;
async function init(): Promise<void> {
    // Request needed libraries.
    void Promise.all([
        google.maps.importLibrary('marker'),
        google.maps.importLibrary('places'),
    ]);
    const { InfoWindow } = await google.maps.importLibrary('maps');

    await window.customElements.whenDefined('gmp-map');
    // Set the inner map options.
    map.innerMap.setOptions({
        mapTypeControl: false,
        streetViewControl: false,
    });

    await window.customElements.whenDefined('gmp-advanced-marker');
    marker.collisionBehavior = 'REQUIRED_AND_HIDES_OPTIONAL';

    const infoWindow = new InfoWindow();
    infoWindow.addListener('close', () => {
        marker.position = null;
    });

    const showInfoWindow = () => {
        if (infoWindow.isOpen) return;
        infoWindow.setContent(placeDetails);
        infoWindow.open({ anchor: marker });
    };

    placeDetails.addEventListener('gmp-load', () => {
        // For the initial load case, with no user click, we fall back to the place's location, and ensure the map has a center set and the InfoWindow is show.
        // (The clicked POI LatLng will be a more natural marker position, when available.)
        if (!map.center && placeDetails.place?.location) {
            map.center = marker.position = placeDetails.place.location;
            showInfoWindow();
        }
    });

    // Add an event listener to handle clicks.
    map.innerMap.addListener(
        'click',
        (event: google.maps.MapMouseEvent | google.maps.IconMouseEvent) => {
            event.stop();

            if ('placeId' in event && event.placeId) {
                // When the user clicks a POI.
                marker.position = event.latLng;
                placeDetailsRequest.setAttribute(
                    'place',
                    `places/${event.placeId}`
                );
                showInfoWindow();
            } else {
                // When the user clicks the map (not on a POI).
                marker.position = null;
                placeDetailsRequest.removeAttribute('place');
                console.log('No place was selected.');
            }
        }
    );
}
void init();

JavaScript

// Use querySelector to select elements for interaction.
const map = document.querySelector('gmp-map');
const placeDetails = document.querySelector(
    'gmp-advanced-place-details-compact'
);
const placeDetailsRequest = document.querySelector(
    'gmp-place-details-place-request'
);
const marker = document.querySelector('gmp-advanced-marker');
async function init() {
    // Request needed libraries.
    void Promise.all([
        google.maps.importLibrary('marker'),
        google.maps.importLibrary('places'),
    ]);
    const { InfoWindow } = await google.maps.importLibrary('maps');

    await window.customElements.whenDefined('gmp-map');
    // Set the inner map options.
    map.innerMap.setOptions({
        mapTypeControl: false,
        streetViewControl: false,
    });

    await window.customElements.whenDefined('gmp-advanced-marker');
    marker.collisionBehavior = 'REQUIRED_AND_HIDES_OPTIONAL';

    const infoWindow = new InfoWindow();
    infoWindow.addListener('close', () => {
        marker.position = null;
    });

    const showInfoWindow = () => {
        if (infoWindow.isOpen) return;
        infoWindow.setContent(placeDetails);
        infoWindow.open({ anchor: marker });
    };

    placeDetails.addEventListener('gmp-load', () => {
        // For the initial load case, with no user click, we fall back to the place's location, and ensure the map has a center set and the InfoWindow is show.
        // (The clicked POI LatLng will be a more natural marker position, when available.)
        if (!map.center && placeDetails.place?.location) {
            map.center = marker.position = placeDetails.place.location;
            showInfoWindow();
        }
    });

    // Add an event listener to handle clicks.
    map.innerMap.addListener('click', (event) => {
        event.stop();

        if ('placeId' in event && event.placeId) {
            // When the user clicks a POI.
            marker.position = event.latLng;
            placeDetailsRequest.setAttribute(
                'place',
                `places/${event.placeId}`
            );
            showInfoWindow();
        } else {
            // When the user clicks the map (not on a POI).
            marker.position = null;
            placeDetailsRequest.removeAttribute('place');
            console.log('No place was selected.');
        }
    });
}
void init();

CSS

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
    height: 100%;
    margin: 0;
    padding: 0;
}

.container {
    display: flex;
    height: 100vh;
    width: 100%;
}

gmp-map {
    flex-grow: 1;
}

HTML

<!doctype html>
<html>
    <head>
        <title>Place Details Compact with Google Maps</title>
        <meta charset="utf-8" />
        <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",
                v: "beta"
            });
        </script>
    </head>
    <body>
        <div class="container">
            <!-- map-id is required to use Advanced Markers. See https://developers.google.com/maps/documentation/javascript/map-ids/mapid-over. -->
            <gmp-map zoom="17" map-id="DEMO_MAP_ID">
                <gmp-advanced-marker></gmp-advanced-marker>
            </gmp-map>
        </div>
        <!--
        The gmp-advanced-place-details-compact element is styled inline because it is
        conditionally rendered and moved into the info window, which is
        part of the map's shadow DOM.
        -->
        <gmp-advanced-place-details-compact
            orientation="horizontal"
            truncation-preferred
            style="
                width: 400px;
                padding: 0;
                margin: 0;
                border: none;
                background-color: transparent;
                color-scheme: light;
            ">
            <gmp-place-details-place-request
                place="places/ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>

            <gmp-place-name></gmp-place-name>
            <gmp-place-media lightbox-preferred></gmp-place-media>
            <gmp-place-rating></gmp-place-rating>
            <gmp-place-type></gmp-place-type>
            <gmp-place-price></gmp-place-price>
            <gmp-place-accessible-entrance-icon></gmp-place-accessible-entrance-icon>
            <gmp-place-open-now-status></gmp-place-open-now-status>
            <gmp-place-attribution
                light-scheme-color="gray"
                dark-scheme-color="white"></gmp-place-attribution>

        </gmp-advanced-place-details-compact>
    </body>
</html>

ฟีเจอร์ขั้นสูง

ปรับแต่งปุ่มดำเนินการ

เพิ่มปุ่มดำเนินการเป็นองค์ประกอบย่อยโดยตรงขององค์ประกอบรายละเอียดสถานที่ขั้นสูง ใช้ <gmp-place-link> สำหรับการเชื่อมต่อการนำทางมาตรฐาน และระบุแอตทริบิวต์ action อย่างชัดเจน คุณระบุแอตทริบิวต์ slot ได้ (ไม่บังคับ) การดำเนินการที่กำหนดไว้ล่วงหน้าที่ถูกต้องคือ open-website, open-directions, open-map และ call หากไม่ระบุแอตทริบิวต์ slot ระบบจะใช้ค่าเริ่มต้นเป็น action-main

<gmp-advanced-place-details-compact orientation="vertical" truncation-preferred>
  <gmp-place-details-place-request place="places/ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
  <!-- Other content items -->
  <gmp-place-link action="open-website" target="_blank"></gmp-place-link>
  <gmp-place-link action="open-directions" slot="action-corner"></gmp-place-link>
</gmp-advanced-place-details-compact>

ข้อกำหนดในการระบุแหล่งที่มาแบบภาพ

สำคัญ: คุณต้องแจ้งให้ผู้ใช้ปลายทางทราบอย่างชัดเจนเมื่อปุ่มการดำเนินการที่กำหนดเองจะแชร์ข้อมูลผู้ใช้กับบุคคลที่สามที่ไม่ใช่ Google ดูข้อกำหนดการระบุแหล่งที่มาแบบภาพ

ละชื่อสถานที่

หากต้องการละเว้นชื่อสถานที่ ให้ยกเว้นองค์ประกอบ <gmp-place-name> จากเนื้อหาที่กำหนดเองอย่างชัดแจ้ง

<gmp-advanced-place-details>
  <gmp-place-details-place-request place="places/ChIJT7FdmYiAhYAROFOvrIxRJDU"></gmp-place-details-place-request>
  <!-- Exclude <gmp-place-name> to hide the place name -->
  <gmp-place-rating></gmp-place-rating>
  <gmp-place-address></gmp-place-address>
</gmp-advanced-place-details>

กรองรีวิวและสื่อ

ตัวอย่างโค้ดนี้แสดงเฉพาะสื่อและรีวิวที่พูดถึง "กาแฟ"

<gmp-advanced-place-details>
  <gmp-place-details-place-request place="places/ChIJT7FdmYiAhYAROFOvrIxRJDU"></gmp-place-details-place-request>
  <gmp-place-media query="coffee"></gmp-place-media>
  <gmp-place-reviews query="coffee" rank-preference="newest"></gmp-place-reviews>
</gmp-advanced-place-details>

นอกจากนี้ คุณยังใช้ JavaScript เพื่อดึงข้อมูลจำนวนรายการทั้งหมดที่ตรงกับคำค้นหาที่ระบุได้โดยการอ่านพร็อพเพอร์ตี้ searchMediaCount และ searchReviewsCount คุณต้องรอเหตุการณ์ gmp-load ก่อนจึงจะเข้าถึงพร็อพเพอร์ตี้เหล่านี้ได้

const detailsElement = document.querySelector('gmp-advanced-place-details');
const mediaElement = detailsElement.querySelector('gmp-place-media');
mediaElement.addEventListener('gmp-load', (e) => {
  console.log('Total matching photos: ', e.target.searchMediaCount);
});

const reviewsElement = detailsElement.querySelector('gmp-place-reviews');
reviewsElement.addEventListener('gmp-load', (e) => {
  console.log('Total matching reviews: ', e.target.searchReviewsCount);
});