В основе работы Mapbox GL JS лежит модель слоёв и источников данных. Все визуализируемые объекты привязываются к источникам, а источники определяют способ хранения, доставки и обновления пространственных данных. Архитектура разделяет данные и стиль, что позволяет динамически менять отображение без изменения самих данных.
Основные типы источников:
Каждый тип решает отдельный класс задач хранения и доставки данных.
GeoJSON является наиболее универсальным форматом для хранения геоданных на стороне клиента. Он используется как основной способ передачи динамических объектов, особенно в сценариях, где данные часто изменяются.
Добавление GeoJSON-источника:
map.on('load', () => {
map.addSource('points', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [37.6173, 55.7558]
},
properties: {
title: 'Москва'
}
}
]
}
});
});
GeoJSON хранится в памяти клиента и может быть обновлён без перезагрузки карты.
Обновление данных:
const source = map.getSource('points');
source.setData({
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [30.3141, 59.9386]
},
properties: {
title: 'Санкт-Петербург'
}
}
]
});
Метод setData является ключевым механизмом управления
состоянием GeoJSON-источника.
Vector Tile Source используется для работы с большими наборами данных, которые разбиваются на тайлы и подгружаются по мере необходимости. Такой подход снижает нагрузку на клиент и позволяет работать с миллионами объектов.
Пример подключения векторного источника:
map.addSource('cities', {
type: 'vector',
url: 'mapbox://mapbox.660ui7x6'
});
или через шаблон:
map.addSource('custom-tiles', {
type: 'vector',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.pbf'
],
minzoom: 0,
maxzoom: 14
});
Хранение данных в этом случае происходит на стороне сервера или в tile storage, а клиент выполняет лишь выборочную загрузку.
Raster Tile Source применяется для подложек, спутниковых снимков и любых растровых изображений, разбитых на тайлы.
map.addSource('satellite', {
type: 'raster',
tiles: [
'https://server.com/tiles/{z}/{x}/{y}.png'
],
tileSize: 256
});
Такие источники активно используют браузерное кэширование, что позволяет повторно использовать загруженные изображения без дополнительных запросов.
Image Source используется для привязки одного изображения к координатам на карте. Это эффективный способ хранения небольших визуальных данных.
map.addSource('overlay', {
type: 'image',
url: 'https://example.com/image.png',
coordinates: [
[30.0, 60.0],
[32.0, 60.0],
[32.0, 58.0],
[30.0, 58.0]
]
});
Данные изображения не разбиваются на тайлы и полностью загружаются в память.
Video Source позволяет использовать видеопотоки как геопривязанные данные.
map.addSource('drone-video', {
type: 'video',
urls: [
'https://example.com/video.mp4'
],
coordinates: [
[30.0, 60.0],
[32.0, 60.0],
[32.0, 58.0],
[30.0, 58.0]
]
});
Такой подход применяется в системах мониторинга и анализа движения.
Источники данных не отображаются напрямую. Для визуализации используются слои (layers), которые ссылаются на источник и определяют способ отрисовки.
Пример связи:
map.addLayer({
id: 'city-points',
type: 'circle',
source: 'points',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
Слой получает данные из источника и интерпретирует их согласно стилю.
Mapbox GL JS использует WebGL и worker-потоки для обработки данных. После загрузки источники преобразуются в оптимизированные структуры:
Основная цель — минимизация использования основной нити браузера.
GeoJSON-источники поддерживают реактивное обновление без пересоздания
слоя. При вызове setData происходит:
Это делает возможным построение динамических систем визуализации, включая трекинг объектов в реальном времени.
Vector и Raster источники используют многоуровневое кэширование:
Тайлы повторно используются при панорамировании и зуме, что снижает количество сетевых запросов и ускоряет рендеринг.
В офлайн-сценариях данные могут храниться в предварительно загруженных пакетах тайлов. Такой подход позволяет работать без подключения к сети, используя локальный tile store.
Структура хранения включает:
Mapbox GL JS может работать с такими данными через заранее подготовленные офлайн-источники.
Выбор способа хранения данных напрямую влияет на производительность:
Ключевым ограничением остаётся объём памяти браузера и стоимость декодирования геометрии в WebGL-пайплайн.