Панорамы Street View представляют собой набор сферических изображений, привязанных к географическим координатам или идентификатору панорамы (panoId). Доступность таких данных зависит от покрытия сервиса, актуальности снимков и ограничений региона.
В JavaScript API работа с панорамами строится вокруг объекта Street View и сервиса StreetViewService, который используется для запроса информации о наличии панорамы в заданной точке.
Ключевая особенность проверки доступности заключается в том, что отсутствие панорамы не считается ошибкой API — это нормальный сценарий, который возвращается через статус ответа.
Основным инструментом проверки выступает класс StreetViewService. Он предоставляет метод получения данных о панораме в заданной области.
Метод запроса:
const service = new google.maps.StreetViewService();
Запрос панорамы по координатам:
service.getPanorama(
{
location: { lat: 55.751244, lng: 37.618423 },
radius: 50
},
(data, status) => {
// обработка результата
}
);
Параметр radius определяет радиус поиска ближайшей доступной панорамы. Чем больше радиус, тем выше вероятность получения результата при отсутствии точной точки покрытия.
Результат проверки доступности определяется значением status:
Типовая проверка строится на строгом сравнении статуса:
service.getPanorama({ location, radius: 50 }, (data, status) => {
if (status === google.maps.StreetViewStatus.OK) {
// панорама доступна
} else {
// панорама отсутствует
}
});
Наиболее распространённый сценарий — определение наличия панорамы в конкретной точке. Это используется для динамического отображения Street View или переключения интерфейса.
function checkStreetViewAvailability(lat, lng) {
const service = new google.maps.StreetViewService();
return new Promise((resolve) => {
service.getPanorama(
{
location: { lat, lng },
radius: 30
},
(data, status) => {
resolve(status === google.maps.StreetViewStatus.OK);
}
);
});
}
Такая проверка не гарантирует точное совпадение координат с центром панорамы, так как сервис может вернуть ближайшую доступную точку в пределах радиуса.
Покрытие Street View неоднородно: в городских районах плотность панорам высокая, в сельской местности — значительно ниже.
Увеличение радиуса поиска влияет на поведение сервиса:
{
location: { lat, lng },
radius: 100
}
Избыточное увеличение радиуса приводит к возврату панорам, визуально не связанных с исходной точкой, что может искажать пользовательский контекст.
Помимо координат, панорамы идентифицируются через panoId. Проверка по идентификатору используется при работе с сохранёнными или ранее загруженными панорамами.
service.getPanorama(
{ pano: 'CAoSLEFGMVFpcE...' },
(data, status) => {
if (status === google.maps.StreetViewStatus.OK) {
// panoId существует и доступен
}
}
);
Если panoId устарел или удалён, сервис возвращает ZERO_RESULTS.
Объект StreetViewPanorama не выполняет самостоятельную проверку доступности, но предоставляет события изменения состояния, которые позволяют косвенно отслеживать результат загрузки.
const panorama = new google.maps.StreetViewPanorama(
document.getElementById("pano"),
{
position: { lat: 55.751244, lng: 37.618423 },
visible: true
}
);
Контроль загрузки:
panorama.addListener("status_changed", () => {
const pano = panorama.getPano();
});
Дополнительно используется событие position_changed для отслеживания переходов между панорамами.
StreetViewCoverageLayer позволяет визуально определить области, где доступны панорамы. Этот слой не возвращает данные программно, но используется для оценки покрытия.
const coverageLayer = new google.maps.StreetViewCoverageLayer();
coverageLayer.setMap(map);
Слой отображает синие линии на карте, соответствующие зонам съёмки Street View.
Панорама открывается только при наличии данных:
service.getPanorama({ location, radius: 50 }, (data, status) => {
if (status === google.maps.StreetViewStatus.OK) {
panorama.setPano(data.location.pano);
panorama.setVisible(true);
} else {
panorama.setVisible(false);
}
});
Используется для избежания пустого контейнера Street View:
async function initStreetView(lat, lng) {
const available = await checkStreetViewAvailability(lat, lng);
if (!available) {
return;
}
new google.maps.StreetViewPanorama(document.getElementById("pano"), {
position: { lat, lng },
visible: true
});
}
При отсутствии точного совпадения координат выполняется расширенный поиск:
service.getPanorama(
{ location: { lat, lng }, radius: 500 },
(data, status) => {
if (status === google.maps.StreetViewStatus.OK) {
const nearest = data.location.latLng;
}
}
);
Частые запросы к StreetViewService могут создавать нагрузку на клиент и превышать лимиты API. Оптимизация обычно включает:
Пример простого кэширования:
const cache = new Map();
function cachedCheck(lat, lng) {
const key = `${lat.toFixed(4)}_${lng.toFixed(4)}`;
if (cache.has(key)) {
return Promise.resolve(cache.get(key));
}
const service = new google.maps.StreetViewService();
return new Promise((resolve) => {
service.getPanorama({ location: { lat, lng }, radius: 50 }, (data, status) => {
const result = status === google.maps.StreetViewStatus.OK;
cache.set(key, result);
resolve(result);
});
});
}
При проверке доступности панорам необходимо учитывать:
В ряде случаев сервис возвращает ближайшую панораму, которая может находиться вне логической области интереса, что требует дополнительной фильтрации по расстоянию между исходной точкой и data.location.latLng.