Place Photos

This rudimentary photo carousel displays photos for the specified place, including the required author attributions (shown in the upper left corner of the photo).

Read the documentation .

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 
 : 
  
 10 
 px 
 ; 
  
 width 
 : 
  
 100 
 % 
 ; 
  
 height 
 : 
  
 100 
 % 
 ; 
  
 box-sizing 
 : 
  
 border-box 
 ; 
 } 
 . 
 place-overview 
  
 { 
  
 width 
 : 
  
 400 
 px 
 ; 
  
 height 
 : 
  
 380 
 px 
 ; 
  
 overflow-x 
 : 
  
 auto 
 ; 
  
 position 
 : 
  
 relative 
 ; 
  
 margin-right 
 : 
  
 20 
 px 
 ; 
 } 
 # 
 info 
  
 { 
  
 font-family 
 : 
  
 sans-serif 
 ; 
  
 position 
 : 
  
 sticky 
 ; 
  
 position 
 : 
  
 -webkit- 
 sticky 
 ; 
  
 left 
 : 
  
 0 
 ; 
  
 padding-bottom 
 : 
  
 10 
 px 
 ; 
 } 
 # 
 heading 
  
 { 
  
 width 
 : 
  
 500 
 px 
 ; 
  
 font-size 
 : 
  
 x-large 
 ; 
  
 margin-bottom 
 : 
  
 20 
 px 
 ; 
 } 
 # 
 summary 
  
 { 
  
 width 
 : 
  
 500 
 px 
 ; 
 } 
 # 
 gallery 
  
 { 
  
 display 
 : 
  
 flex 
 ; 
 } 
 # 
 gallery 
  
 img 
  
 { 
  
 width 
 : 
  
 200 
 px 
 ; 
  
 height 
 : 
  
 200 
 px 
 ; 
  
 margin-right 
 : 
  
 10 
 px 
 ; 
  
 margin-top 
 : 
  
 40 
 px 
 ; 
  
 border-radius 
 : 
  
 10 
 px 
 ; 
  
 cursor 
 : 
  
 pointer 
 ; 
 } 
 # 
 expanded-image 
  
 { 
  
 display 
 : 
  
 flex 
 ; 
  
 height 
 : 
  
 380 
 px 
 ; 
  
 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 
 : 
  
 10 
 px 
 ; 
  
 font-family 
 : 
  
 sans-serif 
 ; 
  
 margin 
 : 
  
 2 
 px 
 ; 
  
 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>  

Try Sample

Clone Sample

Git and Node.js are required to run this sample locally. Follow these instructions to install Node.js and NPM. The following commands clone, install dependencies and start the sample application.

  
  git 
  
 clone 
  
 - 
 b 
  
 sample 
 - 
 place 
 - 
 photos 
  
 https 
 : 
 //github.com/googlemaps/js-samples.git 
 
  
  cd 
  
 js 
 - 
 samples 
 
  
  npm 
  
 i 
 
  
  npm 
  
 start 
 

Other samples can be tried by switching to any branch beginning with sample- SAMPLE_NAME .

  
  git 
  
 checkout 
  
 sample 
 - 
  SAMPLE_NAME 
 
 
  
  npm 
  
 i 
 
  
  npm 
  
 start 
 
Create a Mobile Website
View Site in Mobile | Classic
Share by: