Векторный источник в MapLibre GL JS представляет собой механизм подключения и отображения данных в формате векторных тайлов (vector tiles), которые передаются в бинарном формате PBF и интерпретируются на стороне клиента для динамической отрисовки слоёв карты. Такой подход позволяет работать с большими объёмами геоданных, сохраняя высокую производительность и гибкость стилизации.
Векторные тайлы основаны на разбиении географических данных на квадратную сетку по уровням масштабирования. Каждый тайл содержит геометрические объекты и их атрибуты, но не включает готовую графическую отрисовку. Отрисовка выполняется клиентом через WebGL.
Ключевые особенности:
.pbf);{z}/{x}/{y};Такой подход отличается от растровых тайлов, где сервер возвращает уже готовое изображение.
В MapLibre GL JS векторный источник задаётся через
map.addSource с типом vector.
Основная структура:
map.addSource('streets', {
type: 'vector',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.pbf'
],
minzoom: 0,
maxzoom: 14
});
Параметр tiles определяет шаблон URL для получения
векторных тайлов.
tiles: [
'https://tiles.server.com/roads/{z}/{x}/{y}.pbf'
]
Каждый тайл загружается по координатной сетке:
{z} — уровень масштабирования;{x} — координата по оси X;{y} — координата по оси Y.Допускается использование нескольких URL для балансировки нагрузки:
tiles: [
'https://a.tiles.com/{z}/{x}/{y}.pbf',
'https://b.tiles.com/{z}/{x}/{y}.pbf'
]
Эти параметры задают диапазон масштабов, на которых источник активен.
minzoom: 0,
maxzoom: 16
Если пользователь выходит за пределы диапазона, MapLibre либо не запрашивает тайлы, либо интерполирует данные.
Ограничивает географическую область доступности источника.
bounds: [-180, -85.0511, 180, 85.0511]
Формат: [west, south, east, north].
Использование bounds уменьшает количество запросов и повышает производительность.
Определяет схему нумерации тайлов:
scheme: 'xyz'
или
scheme: 'tms'
xyz — стандартная схема (верхний левый угол);tms — инвертированная ось Y.Юридическая атрибуция источника данных:
attribution: '© OpenStreetMap contributors'
Отображается в углу карты и обязателен для публичных данных.
Векторный источник сам по себе не отображается. Он используется
слоями (layer), которые извлекают конкретные данные из
тайлов.
Пример подключения слоя линий:
map.addLayer({
id: 'road-layer',
type: 'line',
source: 'streets',
'source-layer': 'roads',
paint: {
'line-color': '#ff0000',
'line-width': 2
}
});
Векторные тайлы могут содержать несколько логических слоёв внутри одного файла. Например:
Параметр source-layer указывает, какой именно слой
использовать.
'source-layer': 'buildings'
MapLibre GL JS позволяет фильтровать объекты на основе их атрибутов.
filter: ['==', 'class', 'primary']
Пример слоя дорог только для магистралей:
map.addLayer({
id: 'highways',
type: 'line',
source: 'streets',
'source-layer': 'roads',
filter: ['==', 'type', 'highway'],
paint: {
'line-color': '#000',
'line-width': 3
}
});
Фильтры поддерживают логические операции:
==, !=>, <, >=,
<=in, !inall, any, noneИсточник можно обновлять без пересоздания карты.
map.getSource('streets').setTiles([
'https://new-tiles.server.com/{z}/{x}/{y}.pbf'
]);
Также возможно обновление параметров через setData
только для GeoJSON, но для vector tiles используется замена URL.
Vector source активно использует кеширование на нескольких уровнях:
{z}/{x}/{y};Оптимизация достигается за счёт:
maxzoom;Vector source отличается от raster следующим образом:
Raster source:
map.addSource('satellite', {
type: 'raster',
tiles: [
'https://tiles.server.com/{z}/{x}/{y}.png'
],
tileSize: 256
});
Vector source:
map.addSource('vector', {
type: 'vector',
tiles: [
'https://tiles.server.com/{z}/{x}/{y}.pbf'
]
});
Векторный тайл содержит слои, каждый из которых включает:
Типичная структура:
Tile
├── Layer: roads
│ ├── Feature
│ ├── Feature
├── Layer: buildings
│ ├── Feature
MapLibre декодирует PBF и преобразует данные в WebGL буферы.
Помимо прямого массива tiles, часто используется
TileJSON:
map.addSource('streets', {
type: 'vector',
url: 'https://example.com/tiles.json'
});
TileJSON содержит метаданные:
Пример структуры TileJSON:
{
"tilejson": "2.2.0",
"tiles": ["https://example.com/{z}/{x}/{y}.pbf"],
"minzoom": 0,
"maxzoom": 14,
"bounds": [-180, -85, 180, 85],
"vector_layers": [
{
"id": "roads",
"fields": {
"type": "String"
}
}
]
}
MapLibre GL JS позволяет комбинировать несколько vector source в одной карте.
map.addSource('roads', {
type: 'vector',
tiles: ['https://tiles.com/roads/{z}/{x}/{y}.pbf']
});
map.addSource('buildings', {
type: 'vector',
tiles: ['https://tiles.com/buildings/{z}/{x}/{y}.pbf']
});
Далее каждый источник используется в своих слоях, что позволяет разделять ответственность данных.
Vector source может обслуживаться:
При самостоятельной генерации важно учитывать:
Помимо HTTP URL, возможно использование:
Некоторые реализации поддерживают форматы типа PMTiles, где весь набор тайлов хранится в одном файле и запрашивается по диапазону байтов, что снижает количество HTTP-запросов.
При работе с vector source часто возникают типичные проблемы:
source-layer;tms/xyz;Для диагностики используются:
map.on('error', (e) => {
console.log(e.error);
});
Также полезно отслеживать загрузку тайлов:
map.on('data', (e) => {
if (e.dataType === 'source') {
console.log('Source updated');
}
});
Векторный источник раскрывает доступ к атрибутам объектов, что позволяет строить сложные правила отображения:
paint: {
'fill-color': [
'match',
['get', 'landuse'],
'park', '#00ff00',
'residential', '#cccccc',
'#999999'
]
}
Это делает vector source основой для динамических тематических карт, где визуализация полностью определяется данными, а не статическими изображениями.
Vector source особенно эффективен в системах с высокой нагрузкой:
При серверной генерации используется pipeline:
Ключевые методы взаимодействия:
map.addSource()
map.getSource()
map.removeSource()
map.isSourceLoaded()
Работа с источником обычно сопровождается управлением слоями:
map.addLayer()
map.moveLayer()
map.removeLayer()
Источник и слой связаны только через имя источника, что позволяет переиспользовать один vector source в разных визуальных представлениях одновременно.