В Mapbox GL JS архитектура отображения карты строится вокруг концепции источников данных (sources) и слоёв (layers). Источник определяет, откуда поступают географические данные, а слой отвечает за их визуализацию. Разделение этих сущностей обеспечивает гибкость, масштабируемость и возможность динамического обновления карты без перерисовки всей сцены.
Основные типы источников:
Каждый тип источника оптимизирован под конкретные сценарии визуализации и производительности.
Добавление источника выполняется через метод карты:
map.addSource('cities', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: []
}
});
Ключевые параметры:
type — тип источникаdata — данные (для GeoJSON)url — ссылка на удалённый ресурс (например, tileset или
GeoJSON-файл)tiles — массив URL-шаблонов тайлов (для vector/raster
sources)cluster — включение кластеризации (GeoJSON)Источники добавляются в глобальный реестр карты и становятся доступны всем слоям.
GeoJSON используется для интерактивных и часто обновляемых данных: маркеры, события, пользовательские объекты, аналитические слои.
Структура GeoJSON:
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [30.5, 50.5]
},
properties: {
name: "Object A"
}
}
Обновление данных выполняется через:
map.getSource('cities').setData(newData);
Особенности:
Vector tiles обеспечивают высокую производительность при работе с большими датасетами. Данные разбиваются на квадраты (тайлы), загружаемые по мере необходимости.
Пример подключения:
map.addSource('roads', {
type: 'vector',
url: 'mapbox://examples.road-tiles'
});
Использование:
map.addLayer({
id: 'road-lines',
type: 'line',
source: 'roads',
'source-layer': 'transportation',
paint: {
'line-color': '#888',
'line-width': 2
}
});
Ключевое свойство source-layer определяет слой внутри
тайлсета.
Raster sources применяются для отображения изображений, спутниковых снимков и тепловых карт.
map.addSource('satellite', {
type: 'raster',
tiles: [
'https://tiles.example.com/{z}/{x}/{y}.png'
],
tileSize: 256
});
Параметр tileSize влияет на масштабирование и
производительность.
Обновление данных является ключевым механизмом интерактивных приложений. GeoJSON-источники позволяют изменять содержимое без пересоздания слоя.
const source = map.getSource('cities');
source.setData({
type: 'FeatureCollection',
features: updatedFeatures
});
При обновлении:
GeoJSON поддерживает встроенную кластеризацию, оптимизирующую отображение больших наборов точек.
map.addSource('points', {
type: 'geojson',
data: pointsData,
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
Параметры:
clusterMaxZoom — максимальный зум для группировкиclusterRadius — радиус кластеризации в пикселяхОтдельные слои используются для кластеров и единичных точек:
map.addLayer({
id: 'clusters',
type: 'circle',
source: 'points',
filter: ['has', 'point_count']
});
Фильтры позволяют ограничивать отображаемые объекты без изменения исходного источника.
map.addLayer({
id: 'cities-layer',
type: 'circle',
source: 'cities',
filter: ['>', ['get', 'population'], 1000000]
});
Поддерживаются логические операции:
['==', key, value]['!=', key, value]['>', value1, value2]['all', ...]['any', ...]Фильтрация выполняется на GPU-ориентированном этапе подготовки данных.
Expressions позволяют динамически изменять стиль в зависимости от свойств данных.
paint: {
'circle-radius': [
'interpolate',
['linear'],
['get', 'mag'],
1, 5,
10, 20
],
'circle-color': [
'case',
['>', ['get', 'mag'], 5],
'#f00',
'#0f0'
]
}
Ключевые категории выражений:
+, -, *,
/)case, match)interpolate)get, has)Mapbox GL JS позволяет изменять только геометрию или свойства объектов:
const data = map.getSource('cities');
data.setData({
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [10, 10]
},
properties: {
id: 1
}
}
]
});
При частых обновлениях предпочтительно минимизировать размер передаваемых данных, так как полная замена коллекции приводит к пересборке внутреннего индекса.
Источники могут ссылаться на удалённые GeoJSON-файлы:
map.addSource('earthquakes', {
type: 'geojson',
data: 'https://example.com/earthquakes.geojson'
});
При загрузке:
При работе с тысячами и миллионами объектов важны следующие оптимизации:
GeoJSON остаётся удобным, но не масштабируется так же эффективно, как тайловые источники.
Каждый слой привязан к источнику через идентификатор:
map.addLayer({
id: 'layer-id',
type: 'fill',
source: 'source-id'
});
Один источник может использоваться несколькими слоями одновременно. Это позволяет:
Некоторые параметры источника могут изменяться после создания:
map.getSource('tiles').setTiles([
'https://new-url/{z}/{x}/{y}.pbf'
]);
Для GeoJSON аналогом является setData, который заменяет
содержимое полностью.
Canvas source:
map.addSource('custom-canvas', {
type: 'canvas',
canvas: 'canvas-id',
coordinates: [
[0, 0],
[10, 0],
[10, 10],
[0, 10]
]
});
Image source:
map.addSource('overlay', {
type: 'image',
url: 'overlay.png',
coordinates: [
[-10, 10],
[10, 10],
[10, -10],
[-10, -10]
]
});
Такие источники применяются для тепловых карт, спутниковых слоёв и кастомных визуализаций.
Mapbox GL JS предоставляет события для отслеживания состояния источников:
sourcedatadatadataloadingПример обработки загрузки:
map.on('data', (e) => {
if (e.sourceId === 'cities') {
// обработка обновления данных
}
});
События позволяют синхронизировать внешние системы с состоянием карты.