查看完整範例原始碼
這個基本相片輪轉介面會顯示指定地點的相片,包括 要求的作者姓名 (如相片左上角所示)。
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>
測試範例
「地點相片」可讓您在網頁中加入高品質的相片內容。存取權 Google 地方資訊資料庫儲存了數百萬張相片,並使用「尋找地點」功能取得可調整大小的圖片。 Nearby Search、Text Search、Autocomplete 和 Place Details。
取得相片
如要取得某個地點的相片,請在photos
fetchFields()
要求參數。產生的 Place 例項會包含
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;