התכונה 'מיקום תמונות' מאפשרת לכם להוסיף תוכן צילומי באיכות גבוהה לדפי האינטרנט שלכם. גישה למיליוני תמונות שמאוחסנות במסד הנתונים של המקומות, וקבלת תמונות שניתן לשנות את הגודל שלהן באמצעות חיפוש מקום, חיפוש בקרבת מקום, חיפוש טקסט, השלמה אוטומטית ופרטי מקום.
קוד מקור מלא לדוגמה
קרוסלת התמונות הפשוטה הזו מציגה תמונות של המקום שצוין, כולל שיוך היוצרים הנדרש (שמוצג בפינה הימנית העליונה של התמונה שנבחרה).
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. const heading = document.getElementById('heading') as HTMLElement; const summary = document.getElementById('summary') as HTMLElement; const gallery = document.getElementById('gallery') as HTMLElement; const expandedImageDiv = document.getElementById( 'expanded-image' ) as HTMLElement; // 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. place.photos?.forEach((photo) => { const altText = 'Photo of ' + place.displayName; const img = document.createElement('img'); const imgButton = document.createElement('button'); const expandedImage = document.createElement('img'); img.src = photo?.getURI({ maxHeight: 380 }); img.alt = altText; imgButton.addEventListener('click', (event) => { centerSelectedThumbnail(imgButton); event.preventDefault(); expandedImage.src = img.src; expandedImage.alt = altText; expandedImageDiv.innerHTML = ''; expandedImageDiv.appendChild(expandedImage); const attributionLabel = createAttribution( photo.authorAttributions[0] )!; expandedImageDiv.appendChild(attributionLabel); }); imgButton.addEventListener('focus', () => { centerSelectedThumbnail(imgButton); }); imgButton.appendChild(img); gallery.appendChild(imgButton); }); // Display the first photo. if (place.photos && place.photos.length > 0) { const photo = place.photos[0]; const img = document.createElement('img'); img.alt = 'Photo of ' + place.displayName; img.src = photo.getURI(); expandedImageDiv.appendChild(img); if (photo.authorAttributions && photo.authorAttributions.length > 0) { expandedImageDiv.appendChild( createAttribution(photo.authorAttributions[0]) ); } } // Helper function to create attribution DIV. function createAttribution( attribution: google.maps.places.AuthorAttribution ) { const attributionLabel = document.createElement('a'); attributionLabel.classList.add('attribution-label'); attributionLabel.textContent = attribution.displayName; attributionLabel.href = attribution.uri!; attributionLabel.target = '_blank'; attributionLabel.rel = 'noopener noreferrer'; return attributionLabel; } // Helper function to center the selected thumbnail in the gallery. function centerSelectedThumbnail(element: HTMLElement) { element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center', }); } } 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. const heading = document.getElementById('heading'); const summary = document.getElementById('summary'); const gallery = document.getElementById('gallery'); const expandedImageDiv = document.getElementById('expanded-image'); // Show the display name and summary for the place. heading.textContent = place.displayName; summary.textContent = place.editorialSummary; // Add photos to the gallery. place.photos?.forEach((photo) => { const altText = 'Photo of ' + place.displayName; const img = document.createElement('img'); const imgButton = document.createElement('button'); const expandedImage = document.createElement('img'); img.src = photo?.getURI({ maxHeight: 380 }); img.alt = altText; imgButton.addEventListener('click', (event) => { centerSelectedThumbnail(imgButton); event.preventDefault(); expandedImage.src = img.src; expandedImage.alt = altText; expandedImageDiv.innerHTML = ''; expandedImageDiv.appendChild(expandedImage); const attributionLabel = createAttribution(photo.authorAttributions[0]); expandedImageDiv.appendChild(attributionLabel); }); imgButton.addEventListener('focus', () => { centerSelectedThumbnail(imgButton); }); imgButton.appendChild(img); gallery.appendChild(imgButton); }); // Display the first photo. if (place.photos && place.photos.length > 0) { const photo = place.photos[0]; const img = document.createElement('img'); img.alt = 'Photo of ' + place.displayName; img.src = photo.getURI(); expandedImageDiv.appendChild(img); if (photo.authorAttributions && photo.authorAttributions.length > 0) { expandedImageDiv.appendChild(createAttribution(photo.authorAttributions[0])); } } // Helper function to create attribution DIV. function createAttribution(attribution) { const attributionLabel = document.createElement('a'); attributionLabel.classList.add('attribution-label'); attributionLabel.textContent = attribution.displayName; attributionLabel.href = attribution.uri; attributionLabel.target = '_blank'; attributionLabel.rel = 'noopener noreferrer'; return attributionLabel; } // Helper function to center the selected thumbnail in the gallery. function centerSelectedThumbnail(element) { element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center', }); } } init();
CSS
/* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } #container { display: flex; border: 2px solid black; border-radius: 10px; padding: 10px; max-width: 950px; height: 100%; max-height: 400px; 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: 100%; } #gallery { display: flex; padding-top: 10px; } #gallery img { width: 200px; height: 200px; margin: 10px; border-radius: 10px; cursor: pointer; object-fit: cover; /* fill the area without distorting the image */ } #expanded-image { display: flex; height: 370px; overflow: hidden; background-color: #000; border-radius: 10px; margin: 0 auto; } .attribution-label { background-color: rgba(255, 255, 255, 0.7); font-size: 10px; font-family: sans-serif; margin: 2px; position: absolute; } button { display: flex; outline: none; border: none; padding: 0; background: none; cursor: pointer; } button:focus { border: 2px solid blue; border-radius: 10px; }
HTML
<html lang="en">
<head>
<title>Place Photos</title>
<link rel="stylesheet" type="text/css" href="./style.css" />
<script type="module" src="./index.js"></script>
<!-- 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: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "weekly" });</script>
</head>
<body>
<div id="container">
<div class="place-overview">
<div id="info">
<h1 id="heading"></h1>
<div id="summary"></div>
</div>
<div id="gallery"></div>
</div>
<div id="expanded-image"></div>
</div>
</body>
</html>דוגמה לניסיון
ייבוא תמונות
כדי לקבל תמונות של מקום מסוים, צריך לכלול את השדה photos בפרמטרים של בקשת fetchFields(). מופע המקום שמתקבל מכיל מערך של עד 10 אובייקטים של Photo, שממנו אפשר לגשת לתמונות ולפרטי השיוך הנדרשים שלהן.
מתקשרים אל getURI()
כדי להחזיר את ה-URI של תמונת המקור, באמצעות
PhotoOptions
כדי להגדיר את הגובה או הרוחב המקסימליים של התמונה שמוחזרת. אם תציינו ערך גם במאפיין maxHeight וגם במאפיין maxWidth, שירות הצילום ישנה את גודל התמונה לגודל הקטן מבין השניים, תוך שמירה על יחס הגובה-רוחב המקורי. אם לא מציינים מימד, תוחזר התמונה בגודל המלא.
המחלקות Photo חושפות את המאפיינים הבאים:
-
authorAttributions: מערך של אובייקטים מסוגAuthorAttributionשמכילים את הטקסט וכתובות ה-URL הנדרשים לשיוך. flagContentURI: קישור שדרכו המשתמש יכול לסמן בעיה בתמונה.-
googleMapsURI: קישור להצגת התמונה במפות Google. -
heightPx: הגובה של התמונה בפיקסלים. -
widthPx: רוחב התמונה בפיקסלים.
בדוגמה הבאה מוצגת בקשה לפרטי מקום לגבי תמונות, הפעלה של 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), URI לפרופיל שלו במפות Google (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;