Mapbox GL JS представляет собой библиотеку для рендеринга интерактивных карт на WebGL, где ключевой функцией выступает создание экземпляра карты и управление его состоянием через конфигурационный объект.
Основная точка входа — создание объекта карты:
mapboxgl.accessToken = 'YOUR_ACCESS_TOKEN';
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [69.2401, 53.2144],
zoom: 10
});
Ключевые параметры и их назначение:
[lng, lat]Именно этот объект становится центральной точкой управления всей логикой отображения.
Система стилей является фундаментальной частью архитектуры Mapbox GL JS. Стиль определяет визуальное представление слоёв, источников данных и фильтров.
Изменение стиля выполняется динамически:
map.setStyle('mapbox://styles/mapbox/dark-v11');
После смены стиля необходимо учитывать событие загрузки:
map.on('style.load', () => {
// повторное добавление слоёв и источников
});
Основные особенности системы стилей:
Источники определяют, откуда берутся данные для отображения на карте.
Типы источников:
Пример добавления GeoJSON-источника:
map.addSource('points', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [69.2401, 53.2144]
}
}
]
}
});
Особенности:
Слои отвечают за визуализацию данных из источников.
Добавление слоя:
map.addLayer({
id: 'points-layer',
type: 'circle',
source: 'points',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
Основные типы слоёв:
Слои обрабатываются снизу вверх, что влияет на порядок отображения.
Mapbox GL JS поддерживает обновление данных без перезагрузки карты:
const source = map.getSource('points');
source.setData({
type: 'FeatureCollection',
features: []
});
Это позволяет:
Одной из мощнейших возможностей является система выражений (expressions), позволяющая задавать поведение слоёв на основе данных.
Пример фильтра:
map.setFilter('points-layer', ['==', ['get', 'type'], 'city']);
Условное окрашивание:
paint: {
'circle-color': [
'match',
['get', 'category'],
'A', '#ff0000',
'B', '#00ff00',
'#0000ff'
]
}
Возможности выражений:
Система событий позволяет реагировать на действия пользователя и изменения карты.
Основные события:
map.on('load', () => {});
map.on('click', (e) => {});
map.on('move', () => {});
map.on('zoom', () => {});
Обработка клика по слою:
map.on('click', 'points-layer', (e) => {
console.log(e.features[0]);
});
События позволяют реализовать:
Для пользовательских объектов используются маркеры:
const marker = new mapboxgl.Marker()
.setLngLat([69.2401, 53.2144])
.addTo(map);
Попапы:
const popup = new mapboxgl.Popup()
.setLngLat([69.2401, 53.2144])
.setHTML('<h3>Точка</h3>')
.addTo(map);
Возможности:
Карта в Mapbox GL JS рассматривается как камера, которую можно перемещать и анимировать.
Методы управления:
map.flyTo({
center: [69.2401, 53.2144],
zoom: 12,
speed: 1.2
});
Другие методы:
panTo() — плавное перемещениеzoomTo() — изменение масштабаrotateTo() — вращениеeaseTo() — анимация с настройкамиКарта поддерживает различные режимы взаимодействия:
Отключение взаимодействий:
map.scrollZoom.disable();
map.dragRotate.disable();
Это важно для интеграции в сложные интерфейсы.
Добавление кастомной иконки:
map.loadImage('icon.png', (error, image) => {
map.addImage('custom-icon', image);
});
Использование в слоях:
layout: {
'icon-image': 'custom-icon'
}
Функциональность:
Mapbox GL JS построена на WebGL, что обеспечивает аппаратное ускорение, но требует правильной оптимизации:
Ключевые принципы:
setData только при необходимостиПример кластеризации:
map.addSource('points', {
type: 'geojson',
data: geojsonData,
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
Карта проходит несколько стадий:
loadidlestyledatarendererrorПример контроля:
map.on('idle', () => {
console.log('карта полностью загружена');
});
Это важно для:
Mapbox предоставляет инфраструктуру API, которая часто используется вместе с Mapbox GL JS:
Типичный сценарий:
Поддержка 3D реализуется через:
fill-extrusionПример:
map.addLayer({
id: 'buildings',
type: 'fill-extrusion',
source: 'composite',
'source-layer': 'building',
paint: {
'fill-extrusion-height': ['get', 'height'],
'fill-extrusion-color': '#aaa'
}
});
Это позволяет строить:
Встроенные контролы:
map.addControl(new mapboxgl.NavigationControl());
map.addControl(new mapboxgl.ScaleControl());
map.addControl(new mapboxgl.FullscreenControl());
Назначение:
Работа с координатами — основа взаимодействия с картой.
Пример конвертации:
const lngLat = map.unproject([100, 100]);
const point = map.project([69.2401, 53.2144]);
Используется для: