Mapbox GL JS поддерживает несколько типов источников данных, и
image source используется для наложения одиночного
геопривязанного изображения поверх карты. В отличие от тайловых
источников, image source представляет собой цельный растр, который
«натягивается» на заданные координаты поверхности карты.
Ключевая особенность этого типа источника — привязка изображения к четырём угловым координатам, что позволяет использовать его как оверлей для исторических карт, планов зданий, спутниковых снимков или пользовательских визуализаций.
Image source в Mapbox GL JS задаётся через четыре угловые точки:
Каждая точка задаётся в формате
[longitude, latitude].
Структура координат выглядит следующим образом:
const coordinates = [
[-80.425, 46.437],
[-71.516, 46.437],
[-71.516, 37.936],
[-80.425, 37.936]
];
Такая схема позволяет «растянуть» изображение по поверхности карты с учётом проекции Web Mercator, используемой в Mapbox GL JS.
Image source добавляется через метод addSource. В
отличие от растровых тайлов, здесь используется тип image и
объект coordinates.
map.on('load', () => {
map.addSource('overlay-image', {
type: 'image',
url: 'https://example.com/overlay.png',
coordinates: [
[-80.425, 46.437],
[-71.516, 46.437],
[-71.516, 37.936],
[-80.425, 37.936]
]
});
});
После добавления источника он становится доступным для слоя типа
raster:
map.addLayer({
id: 'overlay-layer',
type: 'raster',
source: 'overlay-image',
paint: {
'raster-opacity': 0.7
}
});
Image source обрабатывается как единый текстурный объект. Это означает:
Внутри рендеринга Mapbox GL JS изображение накладывается как текстура на два треугольника, формирующих прямоугольник в пространстве карты.
Image source можно изменять без повторного добавления источника.
const source = map.getSource('overlay-image');
source.setCoordinates([
[-80.0, 46.0],
[-70.0, 46.0],
[-70.0, 37.0],
[-80.0, 37.0]
]);
Это позволяет «перетягивать» изображение по карте в реальном времени.
const source = map.getSource('overlay-image');
source.updateImage('https://example.com/new-overlay.png');
Используется при необходимости динамической подмены визуального слоя, например при переключении датасетов или временных слоёв.
map.removeLayer('overlay-layer');
map.removeSource('overlay-image');
Удаление должно выполняться в правильном порядке: сначала слой, затем источник.
В Mapbox GL JS существует принципиальное различие между
image и raster источниками:
Отдельный механизм — addImage, который не относится к
image source напрямую.
map.loadImage('icon.png', (error, image) => {
if (error) throw error;
map.addImage('custom-icon', image);
});
Этот механизм используется для иконок в symbol layers, а не для геопривязанных изображений.
Разграничение:
addImage → иконки в стиляхimage source → геопривязанные растровые оверлеиImage source применяется для наложения отсканированных карт:
map.addSource('historic-map', {
type: 'image',
url: '/maps/1900.png',
coordinates: [...]
});
Используется для привязки схем к географическим координатам:
Image source часто служит контейнером для заранее подготовленных heatmap-рендеров или научных визуализаций.
Image source имеет ряд ограничений, связанных с архитектурой WebGL:
Оптимизация заключается в подборе изображения с достаточным разрешением под максимальный зум карты.
Image source интегрируется в стиль карты как полноценный слой данных. Он участвует в:
layout.visibilitymap.setLayoutProperty('overlay-layer', 'visibility', 'none');
Mapbox GL JS использует Web Mercator projection, поэтому геопривязка изображения выполняется в проекционном пространстве.
Это означает:
Координаты должны строго соответствовать порядку углов. Перепутанные точки приводят к зеркальному или перевёрнутому изображению.
Если соотношение сторон изображения не соответствует географическому прямоугольнику, возникает растяжение.
Image source не поддерживает tile-based рендеринг, поэтому не масштабируется как raster source.
Image source можно комбинировать с событиями Mapbox GL JS:
map.on('click', 'overlay-layer', (e) => {
console.log(e.lngLat);
});
Хотя сам image source не является интерактивным по умолчанию, слой поверх него может обрабатывать события.
При работе с временными данными image source часто обновляется в зависимости от состояния приложения:
function updateOverlay(url, coords) {
const source = map.getSource('overlay-image');
source.updateImage(url);
source.setCoordinates(coords);
}
Внутри Mapbox GL JS image source выступает как минималистичный тип данных, обеспечивающий:
Он занимает промежуточное положение между статическим изображением и полноценным геоданным слоем.