Работа с Mapbox GL JS строится вокруг создания экземпляра карты,
привязанного к DOM-контейнеру и конфигурации начального состояния
отображения. В основе лежит объект Map, который управляет
WebGL-рендерингом, слоями, источниками данных и интерактивностью.
mapboxgl.accessToken = 'YOUR_ACCESS_TOKEN';
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [69.2401, 41.2995],
zoom: 10
});
Ключевые параметры и их роль:
container — идентификатор DOM-элемента или сам элемент,
в котором создаётся WebGL-контекстstyle — ссылка на стиль карты (векторный тайлсет и
визуальное оформление)center — начальные координаты
[longitude, latitude]zoom — масштаб отображенияКоординаты в системе Mapbox всегда задаются в порядке долгота → широта, что критично для корректного позиционирования.
В основе позиционирования лежит проекция Web Mercator. Она преобразует сферические координаты в плоскую карту, что позволяет использовать стандартные пиксельные вычисления для рендеринга слоёв.
Основные особенности:
[-180, 180] и
[-85.0511, 85.0511]Преобразование координат происходит автоматически, однако при работе с пиксельными позициями используется метод:
const point = map.project([69.2401, 41.2995]);
Он возвращает экранные координаты относительно контейнера карты.
Обратное преобразование:
const lngLat = map.unproject([x, y]);
Центр карты определяет географическую точку, находящуюся в середине экрана. Управление центром является базовым механизмом позиционирования.
map.setCenter([69.2401, 41.2995]);
Также используется плавное перемещение:
map.flyTo({
center: [69.2401, 41.2995],
zoom: 12,
speed: 1.2,
curve: 1.4
});
Методы перемещения:
setCenter — мгновенное смещениеpanTo — анимация смещения без изменения масштабаflyTo — динамическая анимация с изменением
траекторииeaseTo — плавный переход с контролируемой
интерполяциейZoom в Mapbox GL JS представляет собой логарифмическую шкалу детализации.
map.setZoom(8);
Особенности:
Изменение масштаба влияет на:
Комбинированное управление:
map.setZoom(14);
map.setCenter([69.2401, 41.2995]);
Mapbox поддерживает пространственное позиционирование камеры:
map.setBearing(30);
map.setPitch(45);
Параметры:
bearing — поворот карты по часовой стрелке (в
градусах)pitch — наклон камеры относительно поверхностиЭти параметры влияют на восприятие глубины и особенно важны для 3D-слоёв.
Комбинация камеры:
map.jumpTo({
center: [69.2401, 41.2995],
zoom: 13,
bearing: 60,
pitch: 50
});
Отдельные элементы карты (маркер, попап, HTML-оверлей) привязываются к географическим координатам.
const marker = new mapboxgl.Marker()
.setLngLat([69.2401, 41.2995])
.addTo(map);
Принцип позиционирования:
Параметры маркера:
offset — смещение относительно точкиanchor — точка привязки (top, bottom, center и
др.)new mapboxgl.Marker({ offset: [0, -10] })
new mapboxgl.Popup({ offset: 25 })
.setLngLat([69.2401, 41.2995])
.setHTML('<div>Точка интереса</div>')
.addTo(map);
Попап автоматически рассчитывает позицию так, чтобы оставаться видимым в пределах viewport. При нехватке пространства происходит автоматическое смещение.
Для сложного UI и кастомных слоёв используется ручное
позиционирование через project.
const coords = [69.2401, 41.2995];
const pixel = map.project(coords);
const x = pixel.x;
const y = pixel.y;
Используется в сценариях:
Обратное преобразование:
const lngLat = map.unproject({ x: 200, y: 300 });
Для позиционирования карты по набору точек используется
fitBounds.
map.fitBounds([
[69.0, 41.0],
[70.0, 42.0]
]);
Принцип:
Дополнительные параметры:
map.fitBounds(bounds, {
padding: 40,
maxZoom: 14
});
Mapbox требует корректного уведомления об изменении размеров контейнера:
map.resize();
Без вызова:
Resize обязателен при:
Каждый слой имеет свою геометрическую привязку.
map.addSource('points', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: []
}
});
map.addLayer({
id: 'points-layer',
type: 'circle',
source: 'points',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
Позиционирование слоёв определяется:
layout и paintПорядок слоёв критичен: верхние слои перекрывают нижние.
Для UI-элементов используется система anchor-точек:
centertopbottomleftrighttop-left, top-right,
bottom-left, bottom-rightПример:
new mapboxgl.Marker({ anchor: 'bottom' })
Anchor определяет точку привязки DOM-элемента к координате, что влияет на визуальное выравнивание.
При изменении камеры все привязанные объекты пересчитываются в реальном времени.
map.on('move', () => {
const center = map.getCenter();
});
События, влияющие на позиционирование:
movezoomrotatepitchКаждое изменение камеры запускает перерасчёт матрицы трансформации WebGL.
DOM-оверлеи требуют синхронизации с WebGL-картой:
const overlay = document.createElement('div');
overlay.style.position = 'absolute';
function update() {
const pos = map.project([69.2401, 41.2995]);
overlay.style.transform = `translate(${pos.x}px, ${pos.y}px)`;
}
Ключевой принцип:
map.setMaxBounds([
[68.0, 40.0],
[72.0, 43.0]
]);
Эффект:
Используется для:
Частые операции позиционирования напрямую связаны с производительностью WebGL:
Оптимизация достигается через:
setData вместо пересоздания sourcemoveВсе объекты карты подчиняются единой системе координат:
Переход между уровнями происходит через цепочку преобразований:
Эта модель обеспечивает согласованное позиционирование всех элементов независимо от масштаба и угла камеры.