Работа с фотографиями объектов в Google Maps JavaScript API основана на сервисе Places Library, который предоставляет доступ к данным о местах, включая изображения, загруженные пользователями и владельцами бизнеса. Фотографии являются частью объекта Place и представляют собой отдельные метаданные, требующие дополнительного запроса после получения базовой информации о месте.
Фотографии не загружаются автоматически при получении объекта Place.
Вместо этого API возвращает ссылки на фото в виде массива объектов
PlacePhoto. Каждый объект содержит метаданные, а также
методы для получения изображения в нужном размере.
Ключевая особенность заключается в том, что изображения запрашиваются отдельно, что снижает нагрузку и позволяет гибко управлять качеством и размером загружаемых ресурсов.
Основные этапы работы:
photosgetUrl()Для работы с фотографиями необходимо, чтобы запрос к Places Service
включал поле photos. Без этого поля API не вернёт
изображения.
Пример запроса:
const service = new google.maps.places.PlacesService(map);
service.getDetails(
{
placeId: "ChIJN1t_tDeuEmsRUsoyG83frY4",
fields: ["name", "photos", "formatted_address", "rating"]
},
(place, status) => {
if (status === google.maps.places.PlacesServiceStatus.OK) {
console.log(place.photos);
}
}
);
Результат содержит массив объектов PlacePhoto, каждый из
которых представляет одно изображение.
Каждый элемент массива photos содержит:
getUrl(options) — получение URL изображенияОсновной способ использования — вызов getUrl, где
задаются параметры размера.
Метод getUrl позволяет динамически сформировать ссылку
на изображение с нужными параметрами.
const photo = place.photos[0];
const imgUrl = photo.getUrl({
maxWidth: 800,
maxHeight: 600
});
const img = document.createElement("img");
img.src = imgUrl;
document.body.appendChild(img);
Приоритет параметров:
maxWidth — максимальная ширинаmaxHeight — максимальная высотаЕсли указаны оба параметра, API подбирает изображение, сохраняя пропорции.
Места часто содержат несколько изображений, и их можно последовательно отображать:
place.photos.forEach(photo => {
const img = document.createElement("img");
img.src = photo.getUrl({
maxWidth: 400,
maxHeight: 300
});
document.querySelector("#gallery").appendChild(img);
});
Такой подход используется для создания галерей объектов, карточек мест и списков рекомендаций.
Система фотографий Places API имеет ряд технических ограничений:
Кроме того, необходимо учитывать обязательную атрибуцию авторов,
которая предоставляется через свойства объекта
PlacePhoto.
Каждая фотография может содержать информацию об авторе. API требует отображения атрибуции в соответствии с правилами использования данных Google.
Пример извлечения атрибуции:
const photo = place.photos[0];
if (photo.html_attributions) {
photo.html_attributions.forEach(attr => {
const div = document.createElement("div");
div.innerHTML = attr;
document.body.appendChild(div);
});
}
HTML-атрибуции должны отображаться без изменений, так как они содержат ссылки на источники изображений.
При работе с фотографиями в интерфейсах с большим количеством мест важно минимизировать нагрузку:
Фотографии следует загружать только при попадании элемента в область видимости.
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
const photoRef = img.dataset.photoRef;
img.src = photoRef;
observer.unobserve(img);
}
});
});
Использование меньших размеров уменьшает задержку загрузки:
Не все места содержат фотографии. В таких случаях photos
может быть:
undefinedРекомендуется проверка перед использованием:
if (place.photos && place.photos.length > 0) {
const url = place.photos[0].getUrl({ maxWidth: 600 });
} else {
console.log("Фотографии отсутствуют");
}
Фотографии часто являются ключевым визуальным элементом карточки места.
Пример структуры карточки:
function createPlaceCard(place) {
const card = document.createElement("div");
const title = document.createElement("h3");
title.textContent = place.name;
const img = document.createElement("img");
if (place.photos?.length) {
img.src = place.photos[0].getUrl({
maxWidth: 500,
maxHeight: 300
});
}
card.appendChild(title);
card.appendChild(img);
return card;
}
Браузерное кэширование играет важную роль при работе с фотографиями.
URL, возвращаемые методом getUrl, могут быть повторно
использованы без повторного вызова API.
Практики оптимизации:
getUrl без
необходимостиОсновные ошибки разработчиков:
photos без запроса поля
photosundefinedgetUrl без кэширования
результатаФотографии часто используются совместно с маркерами и информационными окнами:
const infowindow = new google.maps.InfoWindow();
marker.addListener("click", () => {
const photo = place.photos?.[0];
infowindow.setContent(`
<div>
<h3>${place.name}</h3>
<img src="${photo?.getUrl({ maxWidth: 300 })}">
</div>
`);
infowindow.open(map, marker);
});
Такой подход позволяет связывать визуальные данные с географическими объектами на карте.
Разные категории мест имеют разное качество и количество изображений:
Эта неоднородность требует адаптивного интерфейса, который корректно обрабатывает отсутствие данных и различия в качестве.