Street View в Google Maps JavaScript API представляет собой отдельный
слой визуализации, основанный на панорамах, которые отображаются через
объект StreetViewPanorama. Этот компонент функционирует как
самостоятельный визуальный контейнер, но тесно связан с картой
(Map) и системой событий, обеспечивающей реактивное
поведение интерфейса.
Архитектура событий Street View построена вокруг модели наблюдателя:
изменения состояния панорамы, точки обзора, позиции и доступных связей
транслируются через набор событий, к которым можно привязать обработчики
через addListener.
Центральным объектом является
google.maps.StreetViewPanorama. Он инкапсулирует состояние
панорамы и генерирует события при изменении ключевых параметров:
Каждое из этих изменений может быть перехвачено через событийную систему API.
const panorama = new google.maps.StreetViewPanorama(
document.getElementById("pano"),
{
position: { lat: 43.238949, lng: 76.889709 },
pov: { heading: 165, pitch: 0 },
zoom: 1
}
);
pano_changedСобытие pano_changed возникает при смене идентификатора
панорамы. Это ключевой индикатор того, что Street View переключился на
другое панорамное изображение.
Сценарии использования:
panorama.addListener("pano_changed", () => {
const panoId = panorama.getPano();
console.log("Текущая панорама:", panoId);
});
Особенность события заключается в том, что оно может вызываться как
при ручной навигации, так и при программной установке
setPano.
position_changedСрабатывает при изменении координат панорамы. В отличие от
pano_changed, ориентировано на географическую привязку, а
не на внутренний идентификатор панорамы.
Используется для:
panorama.addListener("position_changed", () => {
const position = panorama.getPosition();
console.log("Новая позиция:", position.toString());
});
При интеграции с картой часто используется двусторонняя связь: перемещение маркера на карте обновляет Street View и наоборот.
pov_changedОдно из наиболее часто используемых событий Street View. Отслеживает изменения точки обзора (Point of View), включая:
panorama.addListener("pov_changed", () => {
const pov = panorama.getPov();
console.log("Heading:", pov.heading);
console.log("Pitch:", pov.pitch);
});
Практическое применение:
links_changedStreet View строится на графе панорам, связанных переходами. Событие
links_changed срабатывает при обновлении доступных
переходов к соседним панорамам.
panorama.addListener("links_changed", () => {
const links = panorama.getLinks();
console.log("Доступные переходы:", links);
});
Каждый элемент массива links содержит:
Событие критично для построения кастомных навигационных интерфейсов поверх Street View.
zoom_changedОтслеживает изменение уровня приближения внутри панорамы.
panorama.addListener("zoom_changed", () => {
console.log("Zoom:", panorama.getZoom());
});
Используется для:
visible_changedОпределяет изменение видимости Street View. Панорама может быть скрыта или показана в зависимости от состояния интерфейса или переключения режима отображения карты.
panorama.addListener("visible_changed", () => {
console.log("Visible:", panorama.getVisible());
});
Применение:
status_changedИспользуется для отслеживания состояния загрузки Street View. Может сигнализировать о:
panorama.addListener("status_changed", () => {
console.log("Status:", panorama.getStatus());
});
Типичные состояния:
OKZERO_RESULTSUNKNOWN_ERRORStreet View тесно интегрирован с объектом
google.maps.Map. Часто используется синхронизация:
map.addListener("click", (e) => {
panorama.setPosition(e.latLng);
});
И обратная синхронизация:
panorama.addListener("position_changed", () => {
map.setCenter(panorama.getPosition());
});
События Street View основаны на механизме MVCEvent, где
каждый обработчик возвращает идентификатор слушателя.
const listener = panorama.addListener("pov_changed", () => {
console.log("Изменение POV");
});
// удаление обработчика
google.maps.event.removeListener(listener);
Контроль жизненного цикла обработчиков критичен при динамическом создании и уничтожении панорам, особенно в SPA-приложениях.
panorama.addListener("pov_changed", () => {
const heading = panorama.getPov().heading;
rotateCompass(heading);
});
panorama.addListener("position_changed", () => {
const pos = panorama.getPosition();
loadNearbyPlaces(pos.lat(), pos.lng());
});
panorama.addListener("links_changed", () => {
const links = panorama.getLinks();
renderNavigationGraph(links);
});
События Street View имеют ряд характерных особенностей:
Эти особенности требуют аккуратного проектирования логики обработки, особенно при двусторонней синхронизации с картой и внешними данными.
Интенсивное использование событий pov_changed и
position_changed может приводить к частым вызовам
обработчиков. В практических реализациях применяется:
let timeout;
panorama.addListener("pov_changed", () => {
clearTimeout(timeout);
timeout = setTimeout(() => {
const pov = panorama.getPov();
updateUI(pov);
}, 100);
});
Street View события часто используются совместно с дополнительными сервисами:
Комбинированное использование позволяет строить системы виртуальной навигации, где изменения POV и позиции становятся триггерами для обновления внешних данных.
const service = new google.maps.StreetViewService();
panorama.addListener("position_changed", () => {
service.getPanorama({
location: panorama.getPosition(),
radius: 50
}, (data, status) => {
console.log(status, data);
});
});
Событийная модель Street View формирует основу интерактивности слоя панорам. Она обеспечивает:
Каждое событие выступает как точка расширения, позволяющая строить сложные интерактивные системы поверх базовой инфраструктуры Street View.