查看完整範例原始碼
這個簡單的相片輪轉介面會顯示指定地點的相片,包括必要的作者出處資訊 (顯示於相片左上角)。
TypeScript
async function init() { const { Place } = await google.maps.importLibrary('places') as google.maps.PlacesLibrary; // Use a place ID to create a new Place instance. const place = new Place({ id: 'ChIJydSuSkkUkFQRsqhB-cEtYnw', // Woodland Park Zoo, Seattle WA }); // Call fetchFields, passing the desired data fields. await place.fetchFields({ fields: ['displayName', 'photos', 'editorialSummary'] }); // Get the various HTML elements. let heading = document.getElementById('heading') as HTMLElement; let summary = document.getElementById('summary') as HTMLElement; let gallery = document.getElementById('gallery') as HTMLElement; let expandedImageDiv = document.getElementById('expanded-image') as HTMLElement; let attributionLabel; // Show the display name and summary for the place. heading.textContent = place.displayName as string; summary.textContent = place.editorialSummary as string; // Add photos to the gallery. if (place.photos) { place.photos?.forEach((photo) => { const img = document.createElement('img'); const expandedImage = document.createElement('img'); img.src = photo.getURI({maxHeight: 380}); img.addEventListener('click', (event) => { event.preventDefault(); expandedImage.src = img.src; expandedImageDiv.innerHTML = ''; expandedImageDiv.appendChild(expandedImage); attributionLabel = createAttribution(photo.authorAttributions); expandedImageDiv.appendChild(attributionLabel); }); gallery.appendChild(img); }); } // Display the first photo. const img = document.createElement('img'); img.src = place.photos![0].getURI(); expandedImageDiv.appendChild(img); attributionLabel = createAttribution(place.photos![0].authorAttributions); expandedImageDiv.appendChild(attributionLabel); // Helper function to create attribution DIV. function createAttribution(attribution) { attributionLabel = document.createElement("a"); attributionLabel.classList.add('attribution-label'); attributionLabel.textContent = attribution[0].displayName; attributionLabel.href = attribution[0].uri; attributionLabel.target = '_blank;' return attributionLabel; } } init();
JavaScript
async function init() { const { Place } = await google.maps.importLibrary("places"); // Use a place ID to create a new Place instance. const place = new Place({ id: "ChIJydSuSkkUkFQRsqhB-cEtYnw", // Woodland Park Zoo, Seattle WA }); // Call fetchFields, passing the desired data fields. await place.fetchFields({ fields: ["displayName", "photos", "editorialSummary"], }); // Get the various HTML elements. let heading = document.getElementById("heading"); let summary = document.getElementById("summary"); let gallery = document.getElementById("gallery"); let expandedImageDiv = document.getElementById("expanded-image"); let attributionLabel; // Show the display name and summary for the place. heading.textContent = place.displayName; summary.textContent = place.editorialSummary; // Add photos to the gallery. if (place.photos) { place.photos?.forEach((photo) => { const img = document.createElement("img"); const expandedImage = document.createElement("img"); img.src = photo.getURI({ maxHeight: 380 }); img.addEventListener("click", (event) => { event.preventDefault(); expandedImage.src = img.src; expandedImageDiv.innerHTML = ""; expandedImageDiv.appendChild(expandedImage); attributionLabel = createAttribution(photo.authorAttributions); expandedImageDiv.appendChild(attributionLabel); }); gallery.appendChild(img); }); } // Display the first photo. const img = document.createElement("img"); img.src = place.photos[0].getURI(); expandedImageDiv.appendChild(img); attributionLabel = createAttribution(place.photos[0].authorAttributions); expandedImageDiv.appendChild(attributionLabel); // Helper function to create attribution DIV. function createAttribution(attribution) { attributionLabel = document.createElement("a"); attributionLabel.classList.add("attribution-label"); attributionLabel.textContent = attribution[0].displayName; attributionLabel.href = attribution[0].uri; attributionLabel.target = "_blank;"; return attributionLabel; } } init();
CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } #container { display: flex; padding: 10px; width: 100%; height: 100%; box-sizing: border-box; } .place-overview { width: 400px; height: 380px; overflow-x: auto; position: relative; margin-right: 20px; } #info { font-family: sans-serif; position: sticky; position: -webkit-sticky; left: 0; padding-bottom: 10px; } #heading { width: 500px; font-size: x-large; margin-bottom: 20px; } #summary { width: 500px; } #gallery { display: flex; } #gallery img { width: 200px; height: 200px; margin-right: 10px; margin-top: 40px; border-radius: 10px; cursor: pointer; } #expanded-image { display: flex; height: 380px; overflow: hidden; background-color: #000; } #expanded-image img { width: 100%; height: auto; object-fit: contain; } .attribution-label { background-color: #fff; opacity: 0.7; font-size: 10px; font-family: sans-serif; margin: 2px; position: absolute; }
HTML
<html> <head> <title>Place Photos</title> <link rel="stylesheet" type="text/css" href="./style.css" /> <script type="module" src="./index.js"></script> </head> <body> <div id="container"> <div class="place-overview"> <div id="info"> <div id="heading"></div> <div id="summary"></div> </div> <div id="gallery"></div> </div> <div id="expanded-image"></div> </div> <!-- 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: "AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg", v: "weekly"});</script> </body> </html>
測試範例
地點相片功能可讓您在網頁中加入高品質的相片內容。存取儲存在 Places 資料庫中的數百萬張相片,並使用 Find Place、Nearby Search、Text Search、Autocomplete 和 Place Details 取得可調整大小的圖片。
取得相片
如要取得地點的相片,請在 fetchFields()
要求參數中加入 photos
欄位。產生的 Place 例項包含最多 10 個 Photo
物件的陣列,您可以透過這些物件存取圖片和相關必要的歸屬資訊。呼叫 getURI()
即可傳回來源相片 URI,並指定圖片的最大高度和/或寬度。如果同時指定 maxHeight
和 maxWidth
的值,「地點相片」服務會將圖片調整為兩種尺寸中的較小尺寸,並保留原始的顯示比例。
以下範例說明如何針對相片提出 Place Details 要求、在相片例項上呼叫 getURI()
以傳回圖片的來源 URI,然後將第一個相片結果新增至 img
元素 (為了清楚起見,已略去出處資訊):
const { Place } = await google.maps.importLibrary('places'); // Use a place ID to create a new Place instance. const place = new Place({ id: 'ChIJydSuSkkUkFQRsqhB-cEtYnw', // Woodland Park Zoo, Seattle WA }); // Call fetchFields, passing the desired data fields. await place.fetchFields({ fields: ['photos'] }); // Add the first photo to an img element. const photoImg = document.getElementById('image-container'); photoImg.src = place.photos[0].getURI({maxHeight: 400});
作者出處資訊
顯示相片時,您也必須一併顯示相片作者的出處資訊。使用 AuthorAttribution
類別傳回歸因資訊。歸屬資訊包括作者名稱 (displayName
)、Google 地圖個人資料的 URI (uri
),以及作者相片的 URI (photoURI
)。以下程式碼片段示範如何針對地點相片傳回 displayName
、uri
和 photoURI
。
let name = place.photos[0].authorAttributions[0].displayName; let url = place.photos[0].authorAttributions[0].uri; let authorPhoto = place.photos[0].authorAttributions[0].photoURI;