Визуализация карты в Mapbox GL JS строится вокруг источников данных
(sources) — объектов, которые определяют, откуда и в каком виде
загружается геопространственная информация. Каждый источник описывает
набор данных, их структуру, способ доставки и правила отображения.
Источники регистрируются через map.addSource() и далее
используются слоями (layers) для рендеринга.
Векторные источники представляют данные в виде тайлов, содержащих геометрию и атрибуты объектов в бинарном формате (Mapbox Vector Tiles, MVT). Это основной формат для высокопроизводительных карт.
Конфигурация векторного источника:
map.addSource('streets', {
type: 'vector',
url: 'mapbox://mapbox.mapbox-streets-v8'
});
или через шаблон URL:
map.addSource('streets', {
type: 'vector',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.pbf'
],
minzoom: 0,
maxzoom: 14
});
Особенности:
Ключевые параметры:
url — идентификатор tileset или Mapbox URLtiles — массив URL-шаблоновminzoom, maxzoom — диапазон загрузки
тайловbounds — ограничение географической областиРастровые источники используют готовые изображения тайлов (PNG, JPG). Данные уже визуализированы на сервере и не требуют клиентской стилизации геометрии.
map.addSource('satellite', {
type: 'raster',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.png'
],
tileSize: 256
});
Характерные свойства:
Используется для спутниковых снимков, сканов, картинок и фотореалистичных подложек.
GeoJSON — один из наиболее гибких типов источников, позволяющий работать с динамическими данными напрямую в браузере.
map.addSource('points', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [69.5901, 42.3417]
},
properties: {
name: 'Object A'
}
}
]
}
});
Обновление данных выполняется через:
const source = map.getSource('points');
source.setData(newGeojson);
Возможности:
Кластеризация:
map.addSource('earthquakes', {
type: 'geojson',
data: '/data/earthquakes.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
ImageSource позволяет накладывать одиночное изображение на географическую область.
map.addSource('overlay', {
type: 'image',
url: '/images/overlay.png',
coordinates: [
[69.0, 42.5],
[70.0, 42.5],
[70.0, 41.5],
[69.0, 41.5]
]
});
Особенности:
VideoSource позволяет отображать видеопоток в пределах географической области.
map.addSource('drone', {
type: 'video',
urls: [
'https://example.com/video.mp4'
],
coordinates: [
[69.0, 42.5],
[70.0, 42.5],
[70.0, 41.5],
[69.0, 41.5]
]
});
Используется для:
Рельефный источник использует высотные данные в формате raster-dem.
map.addSource('terrain', {
type: 'raster-dem',
url: 'mapbox://mapbox.terrain-rgb',
tileSize: 512,
maxzoom: 14
});
Применение:
Используется вместе с:
map.setTerrain({ source: 'terrain', exaggeration: 1.5 });
Многие источники используют шаблоны {z}/{x}/{y} для
подстановки координат тайлов:
https://example.com/tiles/{z}/{x}/{y}.pbf
Параметры:
z — уровень масштабаx, y — координаты тайлаТакже поддерживаются поддомены:
https://{a-d}.tiles.example.com/{z}/{x}/{y}.pbf
Это позволяет распределять нагрузку между серверами.
Mapbox использует собственный формат идентификаторов:
mapbox://username.tileset-id
Он автоматически разрешается в набор векторных или растровых тайлов через инфраструктуру Mapbox CDN.
Преимущества:
Источники могут быть ограничены географически:
map.addSource('restricted', {
type: 'vector',
url: 'mapbox://mapbox.mapbox-streets-v8',
bounds: [68.0, 41.0, 71.0, 43.0]
});
Используется для:
GeoJSON-источники поддерживают динамическое обновление через API:
setData() — полная замена данныхВекторные и растровые источники обновляются через:
Mapbox GL JS предоставляет события жизненного цикла:
Пример:
map.on('sourcedata', (e) => {
if (e.isSourceLoaded) {
console.log('Source loaded');
}
});
Источники данных тесно связаны с системой тайлового кеширования:
Оптимизация достигается через:
minzoom и maxzoomboundsВ расширенных сценариях могут использоваться пользовательские источники через протоколы или кастомные реализации.
Примеры:
mapbox://Такие источники подчиняются стандарту TileJSON или совместимым схемам описания.
Источник сам по себе не отображается. Он становится видимым только через слой:
source определяет данныеlayer определяет визуализациюПример:
map.addLayer({
id: 'points-layer',
type: 'circle',
source: 'points'
});
Разделение данных и визуализации позволяет: