サンプル ソースコードの全文を見る
この初歩的な写真カルーセルには指定した場所の写真が表示され、写真の左上隅には必要な著作者の帰属情報が表示されます。
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>
サンプルを試す
Place Photo を使用すると、ウェブページに質の高い写真コンテンツを追加できます。プレイス データベースに保存されている数多くの写真にアクセスし、Find Place、Nearby Search、テキスト検索、予測入力、Place Details を使用してサイズ変更可能な画像を取得することができます。
写真を取得する
ある場所の写真を取得するには、fetchFields()
リクエスト パラメータの photos
フィールドを指定します。その結果、Place インスタンスに最大 10 個の Photo
オブジェクトの配列が含まれるようになるため、画像や必要な帰属情報にアクセスできます。画像の最大の高さや幅を指定して getURI()
を呼び出すと、写真のソース URI が返されます。maxHeight
と maxWidth
の両方に値を指定すると、写真サービスでは、元のアスペクト比を維持しながら、この 2 つの値の小さい方を基準に画像サイズが変更されます。
次の例では、写真の 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;