Overlays в Street View
Street View в Google Maps JavaScript API представляет собой панорамный рендеринг улиц, поверх которого можно размещать интерактивные элементы интерфейса и географические объекты. Архитектурно это расширение базовой модели карты, где вместо плоской проекции используется сферическая панорама с собственной системой координат, углом обзора (POV) и уровнем масштабирования.
Панорама Street View задаётся экземпляром
google.maps.StreetViewPanorama, который может существовать
как отдельно, так и быть связанным с обычной картой через
setStreetView.
В отличие от классической карты, где используется двухмерная проекция Web Mercator, Street View работает с:
LatLng) — для
позиционирования камеры в мире;Pov) — направление взгляда камеры
(heading, pitch);Ключевое отличие заключается в том, что географическая точка должна быть проецирована в экранные координаты с учётом текущего угла обзора.
В Street View поддерживаются те же базовые overlay-объекты, что и на карте, но с особенностями поведения:
google.maps.Marker может быть добавлен напрямую на
панораму:
const panorama = new google.maps.StreetViewPanorama(
document.getElementById("pano"),
{
position: { lat: 48.8584, lng: 2.2945 },
pov: { heading: 165, pitch: 0 },
zoom: 1
}
);
const marker = new google.maps.Marker({
position: { lat: 48.8584, lng: 2.2945 },
map: panorama,
title: "Точка интереса"
});
Маркер автоматически адаптируется к повороту камеры. Если точка выходит за пределы поля зрения, он перестаёт отображаться.
Polyline и Polygon работают как
географические оверлеи. Они привязываются к миру, а не к экрану:
const line = new google.maps.Polyline({
path: [
{ lat: 48.8584, lng: 2.2945 },
{ lat: 48.8590, lng: 2.2950 }
],
strokeColor: "#FF0000",
strokeOpacity: 1.0,
strokeWeight: 2,
map: panorama
});
Поведение аналогично маркерам: объект отображается только при попадании в поле зрения камеры.
Все стандартные overlay-объекты используют метод setMap,
принимающий StreetViewPanorama вместо карты.
overlay.setMap(panorama);
Внутренне API интерпретирует это как переключение контекста рендеринга: вместо MapCanvas используется PanoramaCanvas.
Для создания произвольных интерфейсных слоёв используется
google.maps.OverlayView. Этот механизм позволяет
отрисовывать HTML или Canvas поверх панорамы с точной привязкой к
географическим координатам.
class CustomOverlay extends google.maps.OverlayView {
constructor(position, content) {
super();
this.position = position;
this.content = content;
this.div = null;
}
onAdd() {
this.div = document.createElement("div");
this.div.style.position = "absolute";
this.div.innerHTML = this.content;
const panes = this.getPanes();
panes.floatPane.appendChild(this.div);
}
draw() {
const projection = this.getProjection();
const point = projection.fromLatLngToDivPixel(this.position);
if (point && this.div) {
this.div.style.left = point.x + "px";
this.div.style.top = point.y + "px";
}
}
onRemove() {
if (this.div) {
this.div.parentNode.removeChild(this.div);
this.div = null;
}
}
}
const overlay = new CustomOverlay(
{ lat: 48.8584, lng: 2.2945 },
"Объект на панораме"
);
overlay.setMap(panorama);
Street View использует тот же механизм OverlayView, что
и карта, поэтому координатная трансформация остаётся совместимой.
Проекционная модель зависит от текущего состояния камеры:
heading — горизонтальный угол поворотаpitch — вертикальный наклонzoom — масштаб внутри панорамыПри вычислении позиции overlay используется:
LatLng)Метод getProjection() возвращает объект, который
позволяет переводить координаты в пиксели относительно текущего
viewport.
Street View является событийно-ориентированной системой. Любое изменение камеры требует перерасчёта позиции overlay.
Ключевые события:
pov_changed — изменение угла обзораposition_changed — перемещение точки обзораzoom_changed — изменение масштабаvisible_changed — изменение видимости панорамыПример обновления:
panorama.addListener("pov_changed", () => {
overlay.draw();
});
panorama.addListener("position_changed", () => {
overlay.draw();
});
Street View накладывает специфические ограничения на оверлеи:
В отличие от стандартной карты, где координатная система статична, в панораме любое движение камеры фактически изменяет матрицу преобразования сцены.
HTML-оверлеи часто используются для отображения интерактивных элементов: кнопок, подписей, инфо-блоков.
Особенность заключается в том, что такие элементы должны синхронизироваться с перспективной деформацией панорамы:
divPixelconst el = document.createElement("div");
el.className = "label";
el.textContent = "Объект интереса";
panorama.getDiv().appendChild(el);
Для получения данных о панорамах используется
StreetViewService, который позволяет находить ближайшие
панорамные снимки и их метаданные.
const service = new google.maps.StreetViewService();
service.getPanorama({
location: { lat: 48.8584, lng: 2.2945 },
radius: 50
}, (data, status) => {
if (status === "OK") {
panorama.setPano(data.location.pano);
}
});
Оверлеи при смене pano должны пересоздаваться или
пересчитываться, поскольку изменяется сама геометрия сцены.
При использовании нескольких overlay-объектов важно учитывать порядок рендеринга:
overlayMouseTarget — интерактивные элементыfloatPane — динамические HTML-слоиmarkerLayer — стандартные маркерыoverlayLayer — геометрические объектыИзменение порядка DOM влияет на перекрытие элементов, особенно при высокой плотности объектов в сцене Street View.