地点照片

欧洲经济区 (EEA) 开发者

借助地点照片,您可以向网页添加高品质照片内容。访问存储在地点数据库中的数百万张照片,并使用“查找地点”“附近搜索”“文本搜索”“自动补全”和“地点详情”获取可调整大小的图片。

查看完整的示例源代码

此基本照片轮播界面会显示指定地点的照片,包括必需的作者归属信息(显示在照片的左上角)。

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>

试用示例

获取照片

如需获取某个地点的照片,请在 fetchFields() 请求参数中添加 photos 字段。生成的地点实例包含最多 10 个 Photo 对象的数组,您可以通过该数组访问图片及其所需的归属信息。 调用 getURI() 以返回源照片 URI,并指定图片的最大高度和/或宽度。如果您同时为 maxHeightmaxWidth 指定值,照片服务会将图片大小调整为两种尺寸中的较小者,同时保留原始宽高比。

以下示例展示了如何针对照片发出地点详情请求、对照片实例调用 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)。以下代码段展示了如何返回地点照片的 displayNameuriphotoURI

 let name = place.photos[0].authorAttributions[0].displayName;  let url = place.photos[0].authorAttributions[0].uri;  let authorPhoto = place.photos[0].authorAttributions[0].photoURI;