Векторный источник в Mapbox GL JS представляет собой тип источника данных, который загружает тайлы в формате векторных тайлов и предоставляет доступ к геометрии и атрибутам объектов для последующей отрисовки на карте. В отличие от растровых тайлов, где изображение уже «запечено», векторные источники содержат структурированные данные, позволяя выполнять динамическую стилизацию на стороне клиента.
Векторный источник в Mapbox GL JS работает на основе концепции векторных тайлов — фрагментированных наборов геометрических данных, разбитых по координатной сетке и уровням масштабирования. Каждый тайл содержит набор слоёв данных (source layers), которые соответствуют логическим группам объектов.
Основные особенности:
Платформа Mapbox использует векторные тайлы как базовый формат для масштабируемой и производительной работы с геоданными.
Векторный источник задаётся в стиле карты через секцию
sources:
map.addSource('cities', {
type: 'vector',
tiles: [
'https://example.com/tiles/cities/{z}/{x}/{y}.pbf'
],
minzoom: 0,
maxzoom: 14
});
Ключевые параметры:
type
"vector"tiles
{z}, {x},
{y}minzoom / maxzoom
Векторный источник не содержит единого слоя. Вместо этого он включает набор именованных source layers, определённых на этапе генерации тайлов.
Пример использования:
map.addLayer({
id: 'cities-fill',
type: 'fill',
source: 'cities',
'source-layer': 'urban_areas',
paint: {
'fill-color': '#3b82f6',
'fill-opacity': 0.5
}
});
Параметр:
source-layer
Векторные источники предоставляют доступ к свойствам объектов, что позволяет строить стили на основе данных.
Пример фильтрации по атрибуту:
map.addLayer({
id: 'cities-large',
type: 'circle',
source: 'cities',
'source-layer': 'urban_areas',
filter: ['>', 'population', 1000000],
paint: {
'circle-radius': 6,
'circle-color': '#ef4444'
}
});
Поддерживаются выражения:
>, <,
==)all, any,
!)get)Использование vector sources даёт значительные преимущества по сравнению с растровыми:
Один и тот же источник может отображаться в разных стилях без перегенерации тайлов.
Векторные тайлы обычно компактнее растровых изображений.
Геометрия остаётся резкой при любом масштабе.
Можно отображать только нужные объекты на клиенте.
Для повышения производительности применяются следующие подходы:
Границы источника (bounds) Позволяют ограничить область данных:
map.addSource('roads', {
type: 'vector',
tiles: ['https://example.com/roads/{z}/{x}/{y}.pbf'],
bounds: [-180, -85, 180, 85]
});
Схема тайлов (scheme) Определяет способ разбиения карты:
xyz — стандартная схемаtms — обратная схема Y-координатыМинимизация source-layer использования Чем меньше source layers запрашивается, тем быстрее рендеринг.
Один vector source может использоваться множеством визуальных слоёв:
map.addLayer({
id: 'roads-line',
type: 'line',
source: 'roads',
'source-layer': 'transportation',
paint: {
'line-color': '#111827',
'line-width': 2
}
});
map.addLayer({
id: 'roads-highlight',
type: 'line',
source: 'roads',
'source-layer': 'transportation',
filter: ['==', 'class', 'primary'],
paint: {
'line-color': '#f59e0b',
'line-width': 3
}
});
Такая модель позволяет строить многослойную визуализацию без дублирования данных.
Векторные источники могут обновляться без перезагрузки карты:
map.getSource('cities').setTiles([
'https://example.com/tiles/v2/{z}/{x}/{y}.pbf'
]);
Также возможно комбинирование с runtime-обновлением стилей:
Несмотря на гибкость, vector sources имеют ограничения:
Хотя feature-state не является частью самого источника, он тесно связан с vector sources:
map.setFeatureState(
{ source: 'cities', sourceLayer: 'urban_areas', id: 123 },
{ selected: true }
);
В стилях:
'circle-color': [
'case',
['boolean', ['feature-state', 'selected'], false],
'#22c55e',
'#3b82f6'
]
Это позволяет изменять отображение отдельных объектов без пересборки источника.
Vector sources являются частью более широкой архитектуры тайлового рендеринга, где:
Такая модель обеспечивает масштабируемость до миллионов объектов без потери интерактивности.