Работа с изображениями в Mapbox GL JS основана на принципе геопривязки растровых данных к координатам карты и их последующего рендеринга как отдельного слоя. В отличие от векторных источников, изображения не разбиваются на тайлы и отображаются как единые текстуры, «натянутые» на заданный географический прямоугольник.
Платформа Mapbox предоставляет механизм добавления изображений через
тип источника image, который позволяет накладывать любые
растровые данные: исторические карты, сканы планов, тепловые карты,
визуализации с дронов, схемы помещений.
Изображение в Mapbox GL JS рассматривается как текстура, закреплённая за четырьмя координатами:
Эти координаты формируют четырёхугольник в географическом пространстве, в пределах которого изображение растягивается и трансформируется вместе с картой.
Ключевой момент: изображение не «знает» про проекцию само по себе, оно лишь интерполируется в соответствии с текущей проекцией карты.
Основной способ наложения изображения — использование
map.addSource с типом image.
map.on('load', () => {
map.addSource('overlay-image', {
type: 'image',
url: 'https://example.com/image.png',
coordinates: [
[-80.425, 46.437],
[-71.516, 46.437],
[-71.516, 37.936],
[-80.425, 37.936]
]
});
map.addLayer({
id: 'overlay-layer',
type: 'raster',
source: 'overlay-image',
paint: {
'raster-opacity': 0.7
}
});
});
Здесь:
url — источник изображения (PNG, JPEG, WebP)coordinates — географическая привязка четырёх
угловraster отвечает за отображениеПорядок координат строго фиксирован:
Любое нарушение порядка приводит к искажению изображения.
Пример логики привязки:
Изображение фактически интерполируется в экранное пространство через матрицы трансформации WebGL.
Источник изображения можно динамически заменять через
setCoordinates и setUrl (через
setSource-подход или удаление/добавление источника).
Типичный подход обновления координат:
const source = map.getSource('overlay-image');
source.setCoordinates([
[-80.0, 46.0],
[-71.0, 46.0],
[-71.0, 38.0],
[-80.0, 38.0]
]);
Обновление URL обычно реализуется через пересоздание источника:
map.removeSource('overlay-image');
map.addSource('overlay-image', {
type: 'image',
url: 'https://example.com/new-image.png',
coordinates: [...]
});
Растровый слой поддерживает стандартные параметры рендеринга:
paint: {
'raster-opacity': 0.5,
'raster-fade-duration': 0
}
Особенности композитинга:
addLayer и
beforeIdПример вставки слоя под подписи:
map.addLayer(
{
id: 'overlay',
type: 'raster',
source: 'overlay-image'
},
'waterway-label'
);
Изображение ведёт себя как геопривязанный слой:
В отличие от тайловых слоёв, изображение не пере-загружается и не дробится.
Наложение старых карт на современную географию:
Использование изображений как подложки:
Видимость слоя регулируется стандартными свойствами:
map.setLayoutProperty('overlay-layer', 'visibility', 'none');
или
map.setLayoutProperty('overlay-layer', 'visibility', 'visible');
Порядок слоёв критичен, так как растровые изображения могут перекрывать векторные данные.
При работе с большими растровыми слоями важно учитывать ограничения WebGL:
Слишком большие изображения приводят к:
Рекомендуется использовать:
Система имеет ряд архитектурных ограничений:
Для больших наборов данных вместо image-source применяется:
При изменении проекции карты изображение:
Это особенно заметно при использовании наклонённого вида (pitch > 0), где верхняя часть изображения визуально «сжимается».
Хотя image-layer не имеет встроенных событий, взаимодействие реализуется через:
queryRenderedFeaturesПример проверки попадания:
map.on('click', (e) => {
const features = map.queryRenderedFeatures(e.point, {
layers: ['overlay-layer']
});
if (features.length) {
console.log('Клик по изображению');
}
});
Часто изображение используется как фон для векторных данных:
Порядок слоёв определяет читаемость: