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

เลือกแพลตฟอร์ม: Android iOS JavaScript

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

  • PlaceDetailsElement รองรับ ข้อมูลสถานที่ที่แสดงภาพได้ทั้งหมด และอาจมีรูปภาพหลายรูป
  • PlaceDetailsCompactElement ได้รับการออกแบบมาให้ใช้พื้นที่น้อยที่สุดและแสดงชุดข้อมูลที่กระชับ เกี่ยวกับสถานที่ ซึ่งรวมถึงชื่อ ที่อยู่ คะแนน ฯลฯ และอาจมีรูปภาพ 1 รูปด้วย

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

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

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

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

<gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID">
    <gmp-advanced-marker></gmp-advanced-marker>
</gmp-map>
<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-place-details>
      <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
      <gmp-place-all-content></gmp-place-all-content>
    </gmp-place-details>
  </div>
  <gmp-advanced-marker></gmp-advanced-marker>
</gmp-map>

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

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

<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-place-details>
      <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
      <gmp-place-content-config>
        <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-reviews></gmp-place-reviews>
        <gmp-place-feature-list></gmp-place-feature-list>
        <gmp-place-media
          lightbox-preferred
          ></gmp-place-media>
          <gmp-place-attribution light-scheme-color="gray" dark-scheme-color="white"></gmp-place-attribution>
      </gmp-place-content-config>
    </gmp-place-details>
  </div>
  <gmp-advanced-marker></gmp-advanced-marker>
</gmp-map>

องค์ประกอบ gmp-place-content-config เองมีองค์ประกอบเนื้อหาย่อยหลายรายการ และแต่ละรายการจะเลือกรายละเอียดสถานที่ที่เกี่ยวข้องเพื่อแสดง ดังนี้ PlaceAddressElement เลือกที่อยู่ของสถานที่ PlacePriceElement เลือกระดับราคาของสถานที่ ฯลฯ ลำดับขององค์ประกอบย่อยไม่เกี่ยวข้อง เนื่องจากระบบจะแสดงรายละเอียดที่เลือกตามลำดับที่กำหนดไว้ล่วงหน้าเสมอ

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

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

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

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

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

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

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

JavaScript

// Use querySelector to select elements for interaction.
const map = document.querySelector('gmp-map');
const placeDetails = document.querySelector('gmp-place-details');
const placeDetailsRequest = document.querySelector('gmp-place-details-place-request');
const marker = document.querySelector('gmp-advanced-marker');
let center = { lat: 47.759737, lng: -122.250632 };
async function initMap() {
    // Request needed libraries.
    await google.maps.importLibrary("maps");
    await google.maps.importLibrary("marker");
    await 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 && placeDetails.place.location) {
            let adjustedCenter = offsetLatLngRight(placeDetails.place.location, -0.005);
            map.innerMap.panTo(adjustedCenter);
            map.innerMap.setZoom(16); // Set zoom after panning if needed
            marker.position = placeDetails.place.location;
            marker.collisionBehavior = google.maps.CollisionBehavior.REQUIRED_AND_HIDES_OPTIONAL;
            marker.style.display = 'block';
        }
    };
    // Set up map once widget is loaded.
    placeDetails.addEventListener('gmp-load', (event) => {
        updateMapAndMarker();
    });
    // Add an event listener to handle clicks.
    map.innerMap.addListener('click', async (event) => {
        marker.position = null;
        event.stop();
        if (event.placeId) {
            // Fire when the user clicks a POI.
            placeDetailsRequest.place = 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';
        }
    });
}
// Helper function to offset marker placement for better visual appearance.
function offsetLatLngRight(latLng, longitudeOffset) {
    const newLng = latLng.lng() + longitudeOffset;
    return new google.maps.LatLng(latLng.lat(), newLng);
}
initMap();

CSS

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
    display: flex; /* Use flexbox for layout */
    justify-content: center; /* Center the content horizontally */
    align-items: flex-start; /* Align items to the top */
    width: 100%
}

h1 {
  font-size: 16px;
  text-align: center;
}

gmp-map {
  height: 500px;
}

gmp-place-details {
  border-radius: 0px;
  margin: 20px;
  width: 400px;
  height: 500px;
  margin-top: 0px;
}

gmp-advanced-marker {
    display: none;
}

.widget-container {
  min-width: 400px;
  overflow-y: none;
  overflow-x: none;
}

HTML

<!DOCTYPE html>
<html>
  <head>
    <title>Click on the map to view place details</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="style.css">
    <script type="module" src="./index.js"></script>
  </head>
  <body>
    <gmp-map center="47.759737, -122.250632" zoom="16" map-id="DEMO_MAP_ID">
        <gmp-advanced-marker></gmp-advanced-marker>
    </gmp-map>
    <div class="widget-container" slot="control-inline-start-block-start">
      <gmp-place-details>
        <gmp-place-details-place-request place="ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
        <gmp-place-all-content></gmp-place-all-content> 
      </gmp-place-details>
    </div>
    <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>
  </body>
</html>

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

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

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

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

<gmp-map center="47.75972, -122.25094" zoom="19" map-id="DEMO_MAP_ID">
  <gmp-place-details-compact orientation = "horizontal" truncation-preferred slot="control-block-start-inline-center" >
    <gmp-place-details-place-request place = "ChIJC8HakaIRkFQRiOgkgdHmqkk"></gmp-place-details-place-request>
    <gmp-place-content-config>
        <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-place-content-config>
  </gmp-place-details-compact>
  <gmp-advanced-marker></gmp-advanced-marker>
</gmp-map>

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

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

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

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

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

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

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

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

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

ตัวอย่างนี้แสดงการเพิ่ม PlaceDetailsCompactElement ลงในแผนที่โดยใช้โปรแกรมผ่าน AdvancedMarkerElement

JavaScript

// Use querySelector to select elements for interaction.
const mapContainer = document.getElementById("map-container");
const placeDetails = document.querySelector("gmp-place-details-compact");
const placeDetailsRequest = document.querySelector("gmp-place-details-place-request");
let gMap;
let marker;
async function initMap() {
    const { PlaceDetailsCompactElement, PlaceDetailsPlaceRequestElement } = await google.maps.importLibrary("places");
    const { Map } = await google.maps.importLibrary("maps");
    const { AdvancedMarkerElement } = await google.maps.importLibrary("marker");
    gMap = new Map(mapContainer, { mapId: 'DEMO_MAP_ID' });
    marker = new AdvancedMarkerElement({ map: gMap });
    // Hide the map type control.
    gMap.setOptions({ mapTypeControl: false });
    // Set up map, marker, and infowindow once widget is loaded.
    placeDetails.style.visibility = 'visible';
    placeDetails.addEventListener('gmp-load', (event) => {
        console.log("placeDetails initialized!");
        updateMapAndMarker();
    });
    // Add an event listener to handle clicks.
    gMap.addListener("click", async (event) => {
        event.stop();
        // Fire when the user clicks on a POI.
        if (event.placeId) {
            console.log("clicked on POI");
            console.log(event.placeId);
            placeDetailsRequest.place = event.placeId;
            updateMapAndMarker();
        }
        else {
            // Fire when the user clicks the map (not on a POI).
            console.log('No place was selected.');
        }
        ;
    });
    // Function to update map, marker, and infowindow based on place details
    const updateMapAndMarker = () => {
        console.log("function called");
        if (placeDetails.place && placeDetails.place.location) {
            marker.gMap = null;
            let adjustedCenter = offsetLatLngRight(placeDetails.place.location, 0.002);
            gMap.panTo(adjustedCenter);
            gMap.setZoom(16); // Set zoom after panning if needed
            marker.content = placeDetails;
            marker.position = placeDetails.place.location;
        }
        else {
            console.log("else");
        }
    };
}
// Helper function to offset marker placement for better visual appearance.
function offsetLatLngRight(latLng, latitudeOffset) {
    const newLat = latLng.lat() + latitudeOffset;
    return new google.maps.LatLng(newLat, latLng.lng());
}
initMap();

CSS

html,
body {
  display: flex;
  width: 100%;
  height: 400px;
  margin: 0;
}

h1 {
  font-size: 16px;
  text-align: center;
}

#map-container {
    box-sizing: border-box;
    width: 100%;
}
gmp-place-details-compact {
  /* Sets the color for text and icons on the surface */
  /* Adapts automatically to the user's system light/dark mode preference */
  --gmp-mat-color-on-surface: light-dark(black, white);
  /* Sets the background color of the surface */
  /* Adapts automatically to the user's system light/dark mode preference */
  --gmp-mat-color-surface: light-dark(white, black);
  /* Defines the primary font stack used within the component */
  --gmp-mat-font-family: Google Sans Text, sans-serif;
  /* Defines the style for medium body text (e.g., address, descriptions) */
  --gmp-mat-font-body-medium: normal 400 0.875em/1.25em var(--gmp-mat-font-family, 'Google Sans Text');

  width: 360px;
  border: none;
  padding: 0;
  margin: 0;
  position: relative;
  transform: translate(0, calc(-20px));
}

/* This creates the pointer attached to the bottom of the element. */
gmp-place-details-compact::after {
  content: "";
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  width: 0;
  height: 0;
  border-left: 16px solid transparent;
  border-right: 16px solid transparent;
  border-top: 20px solid var(--gmp-mat-color-surface, light-dark(white, black));
}

HTML

<!DOCTYPE html>
<html>
  <head>
    <title>Click on the map to view place details</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="style.css">
    <script type="module" src="./index.js"></script>
  </head>
  <body>
    <div id = "map-container"></div>
    <gmp-place-details-compact orientation="horizontal">
        <gmp-place-details-place-request place = ChIJn97JQNpC1moRIcJsVMEQLI8></gmp-place-details-place-request>
        <gmp-place-all-content></gmp-place-all-content>
    </gmp-place-details-compact>
    <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>  
  </body>
</html>