В Mapbox GL JS видео может использоваться как полноценный источник данных для слоя карты. Такой подход позволяет накладывать видеопоток или локальный видеофайл на географически привязанный прямоугольник в пространстве карты, превращая его в динамический слой, синхронизированный с картографической проекцией.
Видеоисточник реализуется через тип источника video,
который интерпретируется движком рендеринга как растровое изображение,
обновляющееся по кадрам. В отличие от статических растровых тайлов,
видео не разбивается на сетку и не запрашивается по тайлам —
используется единый HTMLVideoElement или массив URL, которые
проигрываются непрерывно.
Видеоисточник описывается через объект источника карты:
type: всегда "video"urls: массив адресов видеофайлов (обычно MP4/WebM)coordinates: географические координаты углов
прямоугольникаПример базовой структуры:
map.addSource('video-source', {
type: 'video',
urls: [
'https://example.com/video.mp4',
'https://example.com/video.webm'
],
coordinates: [
[-122.51596391201019, 37.56238816766053],
[-122.51467645168304, 37.56410183312965],
[-122.51309394836426, 37.563391708549425],
[-122.51423120498657, 37.56161849366671]
]
});
Массив coordinates всегда содержит четыре точки,
задающие углы прямоугольной области:
Порядок строго фиксирован, поскольку используется для корректного наложения текстуры видео на географическую плоскость.
После создания источника видео необходимо добавить слой типа
raster, который будет отображать видеопоток:
map.addLayer({
id: 'video-layer',
type: 'raster',
source: 'video-source',
paint: {
'raster-fade-duration': 0
}
});
Видеоисточник всегда визуализируется через raster-слой,
поскольку:
Помимо передачи URL, возможно использование уже созданного элемента
<video>:
const videoElement = document.createElement('video');
videoElement.src = 'https://example.com/video.mp4';
videoElement.autoplay = true;
videoElement.loop = true;
videoElement.muted = true;
map.addSource('video-source', {
type: 'video',
video: videoElement,
coordinates: [
[-74.0125, 40.7055],
[-74.0100, 40.7055],
[-74.0100, 40.7030],
[-74.0125, 40.7030]
]
});
Использование DOM-элемента позволяет:
Видео в Mapbox GL JS не существует в абстрактной плоскости — оно жестко привязывается к координатам карты.
Движок интерпретирует видео как текстуру, натянутую на четырёхугольник в географических координатах. При каждом кадре выполняется:
При использовании проекций (например, Mercator) возможны:
Для минимизации эффектов применяются:
Видеоисточник может динамически изменять позицию на карте:
const source = map.getSource('video-source');
source.setCoordinates([
[-122.516, 37.563],
[-122.514, 37.563],
[-122.514, 37.561],
[-122.516, 37.561]
]);
Изменение координат приводит к перерасчёту матрицы трансформации без перезагрузки видео.
Видео может быть синхронизировано с состоянием карты:
Внутри WebGL pipeline видео рассматривается как текстурный слой, привязанный к геометрии, поэтому оно автоматически участвует во всех трансформациях сцены.
Видеоисточник имеет ряд ограничений, связанных с рендерингом и декодированием.
muted для автозапускаВидео как источник используется в задачах, где требуется динамическое отображение реального или синтетического движения:
Видеоисточник можно перезапускать или заменять:
const source = map.getSource('video-source');
source.setCoordinates(newCoordinates);
source.video.src = 'https://example.com/new-video.mp4';
source.video.play();
При смене источника происходит:
Видео может комбинироваться с другими слоями карты:
Порядок слоёв влияет на итоговое отображение. Видео обычно размещается ниже в стекe слоёв для корректного наложения данных.
При задании координат важно учитывать:
Неправильно заданные координаты приводят к:
Видеоисточник может реагировать на события:
Хотя сам источник не подписывается напрямую на события, обновление координат или параметров слоя позволяет синхронизировать поведение:
map.on('move', () => {
const zoom = map.getZoom();
if (zoom > 15) {
map.setLayoutProperty('video-layer', 'visibility', 'visible');
} else {
map.setLayoutProperty('video-layer', 'visibility', 'none');
}
});
Внутри Mapbox GL JS видео проходит несколько стадий обработки:
Каждый кадр видео фактически становится динамическим растровым тайлом, обновляющимся в реальном времени.
Поддержка видеоисточников зависит от:
Некоторые браузеры:
mutedЕсли видео становится недоступным:
Такая модель поведения позволяет избежать резких визуальных разрывов в отображении карты.