Leaflet является клиентской библиотекой для отображения интерактивных карт, тогда как Mapbox предоставляет инфраструктуру для хранения, генерации и доставки картографических данных. В связке эти технологии позволяют создавать современные веб-карты с собственным дизайном, поддержкой векторных тайлов, геокодированием, маршрутизацией и обработкой пространственных данных.
Mapbox может использоваться в Leaflet в качестве источника картографических слоёв. Вместо стандартных тайлов OpenStreetMap карта получает данные с серверов Mapbox через API.
Основные возможности интеграции:
Для работы с сервисами Mapbox необходим токен доступа.
После регистрации в системе создаётся персональный Access Token, который используется при обращении к API.
Пример токена:
const accessToken = 'pk.eyJ1IjoidXNlciIsImEiOiJjbGFiYzEyMyJ9.example';
Токен передаётся в URL тайлов или в настройки специальных плагинов.
Наиболее распространённый способ интеграции — использование слоя тайлов.
Создание карты:
const map = L.map('map').setView([55.751244, 37.618423], 10);
Подключение стиля Mapbox:
L.tileLayer(
'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}',
{
attribution:
'© Mapbox © OpenStreetMap',
tileSize: 512,
zoomOffset: -1,
id: 'mapbox/streets-v12',
accessToken: accessToken
}
).addTo(map);
Здесь:
id — идентификатор стиля;tileSize — размер тайла;zoomOffset — корректировка масштаба;accessToken — ключ доступа.Mapbox предоставляет набор готовых стилей.
Универсальная карта для большинства приложений.
id: 'mapbox/streets-v12'
Особенности:
Карта для туристических проектов.
id: 'mapbox/outdoors-v12'
Содержит:
Светлая минималистичная тема.
id: 'mapbox/light-v11'
Используется для:
Тёмный стиль.
id: 'mapbox/dark-v11'
Подходит для:
Спутниковые снимки.
id: 'mapbox/satellite-v9'
Используется для:
Комбинация спутниковой карты и дорожной сети.
id: 'mapbox/satellite-streets-v12'
Позволяет видеть:
Одним из главных преимуществ Mapbox является редактор стилей.
После создания стиля в Mapbox Studio появляется идентификатор:
mapbox://styles/username/clabcdefgh123456789
Для Leaflet используется сокращённый вариант:
id: 'username/clabcdefgh123456789'
Подключение:
L.tileLayer(
'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}',
{
id: 'username/clabcdefgh123456789',
accessToken: accessToken
}
).addTo(map);
Собственные стили позволяют изменять:
Часто требуется переключение между стилями.
Создание слоёв:
const streets = L.tileLayer(
'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}',
{
id: 'mapbox/streets-v12',
accessToken: accessToken
}
);
const satellite = L.tileLayer(
'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}',
{
id: 'mapbox/satellite-v9',
accessToken: accessToken
}
);
Добавление переключателя:
L.control.layers(
{
"Улицы": streets,
"Спутник": satellite
}
).addTo(map);
Ранее существовал официальный плагин Mapbox.js.
Подключение выглядело следующим образом:
L.mapbox.accessToken = accessToken;
const map = L.mapbox.map(
'map',
'mapbox.streets'
);
Однако в современных проектах предпочтительно использовать
стандартный L.tileLayer() и API Mapbox напрямую.
Mapbox предоставляет базовую карту, а Leaflet отвечает за отображение пользовательских данных.
Пример:
fetch('data.geojson')
.then(response => response.json())
.then(data => {
L.geoJSON(data).addTo(map);
});
Такая схема используется практически во всех ГИС-приложениях.
На карте можно отображать:
Геокодирование позволяет получать координаты по адресу.
Запрос:
const query = 'Москва';
fetch(
`https://api.mapbox.com/geocoding/v5/mapbox.places/${query}.json?access_token=${accessToken}`
)
.then(response => response.json())
.then(data => {
console.log(data);
});
Результат содержит:
{
center: [37.6176, 55.7558]
}
Получение координат:
const coordinates =
data.features[0].center;
Обратное геокодирование выполняет противоположную задачу — получение адреса по координатам.
Пример:
const lng = 37.6176;
const lat = 55.7558;
fetch(
`https://api.mapbox.com/geocoding/v5/mapbox.places/${lng},${lat}.json?access_token=${accessToken}`
)
.then(response => response.json())
.then(data => {
console.log(data.features[0].place_name);
});
Часто используется отдельный элемент поиска.
Пример создания маркера после поиска:
function showPlace(lat, lng) {
map.setView([lat, lng], 14);
L.marker([lat, lng])
.addTo(map);
}
После получения координат из Geocoding API выполняется центрирование карты.
Mapbox предоставляет сервис построения маршрутов.
Пример запроса:
const start = '37.6176,55.7558';
const end = '30.3141,59.9386';
fetch(
`https://api.mapbox.com/directions/v5/mapbox/driving/${start};${end}?geometries=geojson&access_token=${accessToken}`
)
.then(response => response.json())
.then(data => {
console.log(data);
});
Ответ содержит:
Полученные координаты можно преобразовать в линию.
const route =
data.routes[0].geometry.coordinates;
const latlngs = route.map(
point => [point[1], point[0]]
);
L.polyline(latlngs, {
color: 'blue',
weight: 5
}).addTo(map);
Спутниковые снимки особенно востребованы в:
Подключение:
L.tileLayer(
'https://api.mapbox.com/styles/v1/mapbox/satellite-v9/tiles/{z}/{x}/{y}?access_token={accessToken}',
{
tileSize: 512,
zoomOffset: -1,
accessToken: accessToken
}
).addTo(map);
Для некоторых приложений необходимо запретить выход за пределы определённого региона.
const bounds = [
[54.5, 36.5],
[56.5, 39.5]
];
map.setMaxBounds(bounds);
Mapbox при этом продолжает поставлять только необходимые тайлы.
Leaflet автоматически хранит загруженные тайлы в памяти браузера.
Mapbox дополнительно использует HTTP-кэширование.
Преимущества:
При использовании сервиса необходимо учитывать:
Контроль осуществляется через панель управления аккаунтом.
При большом количестве объектов:
const map = L.map('map', {
preferCanvas: true
});
const markers = L.markerClusterGroup();
markers.addLayer(
L.marker([55.75, 37.61])
);
map.addLayer(markers);
Снижается нагрузка на браузер при работе с тысячами точек.
Данные загружаются только после изменения области просмотра:
map.on('moveend', loadData);
Подход широко используется в профессиональных ГИС-системах.
Токен доступа не является секретом уровня серверного пароля, однако требует контроля.
Рекомендуется:
Типичная схема взаимодействия выглядит следующим образом:
Пользователь
│
▼
Leaflet
│
├── Mapbox Tiles API
│
├── Geocoding API
│
├── Directions API
│
└── Пользовательские GeoJSON
Leaflet отвечает за визуализацию и взаимодействие с картой, а Mapbox предоставляет картографическую инфраструктуру, стили, пространственные сервисы и набор API для построения полнофункциональных геоинформационных веб-приложений.