В основе работы MapLibre GL JS лежит модель источников данных, где каждый источник описывает способ получения географических данных и протокол их доставки до рендерера. Протокол в данном контексте — это совокупность правил, по которым библиотека интерпретирует URL, тип данных, формат тайлов и стратегию загрузки.
Архитектура источников строится вокруг унифицированного описания
source, где ключевыми являются тип, адреса тайлов, схема
обращения и параметры кэширования. Именно здесь определяется, как
MapLibre получает данные: через HTTP(S), через шаблоны тайлов или через
специализированные форматы вроде TileJSON.
Каждый источник в стиле MapLibre описывается объектом:
map.addSource('example', {
type: 'vector',
tiles: ['https://example.com/tiles/{z}/{x}/{y}.pbf'],
minzoom: 0,
maxzoom: 14
});
Протокол в данном случае реализуется через:
type) — определяет
формат данных;tiles) — задаёт способ
адресации тайлов;scheme) — определяет
систему координат тайлов;minzoom,
maxzoom) — управляют диапазоном загрузки.MapLibre не использует отдельный бинарный сетевой протокол; вместо этого применяется HTTP(S) с договорённостями о структуре URL и форматах данных.
Векторные тайлы — основной тип данных для современных карт.
map.addSource('vector-source', {
type: 'vector',
tiles: [
'https://example.com/tiles/{z}/{x}/{y}.pbf'
]
});
Протокол:
.pbf;{z}/{x}/{y};Ключевая особенность — ленивая загрузка. Тайлы запрашиваются только при необходимости отображения в текущем viewport.
Растровые источники используют готовые изображения тайлов.
map.addSource('raster-source', {
type: 'raster',
tiles: [
'https://example.com/raster/{z}/{x}/{y}.png'
],
tileSize: 256
});
Протокол:
Особенность заключается в том, что сервер полностью контролирует визуальное представление, а клиент выполняет только композитинг.
GeoJSON может передаваться как локальный объект или через URL.
map.addSource('geojson-source', {
type: 'geojson',
data: 'https://example.com/data/features.json'
});
Протокол:
В отличие от тайловых источников, GeoJSON не требует координатной сегментации, но при больших объёмах данных может использовать кластеризацию и генерацию тайлов на лету.
map.addSource('image-source', {
type: 'image',
url: 'https://example.com/image.png',
coordinates: [...]
});
Протокол:
map.addSource('video-source', {
type: 'video',
urls: [
'https://example.com/video.mp4'
],
coordinates: [...]
});
Протокол:
Ключевой механизм взаимодействия с тайловыми серверами — шаблон URL.
{z} — уровень масштабирования;{x} — координата по оси X;{y} — координата по оси Y;{quadkey} — альтернативная адресация (редко
используется).Пример:
https://tiles.example.com/{z}/{x}/{y}.pbf
MapLibre заменяет эти переменные на конкретные значения перед отправкой HTTP-запроса.
TileJSON выступает метапротоколом, описывающим доступ к тайлам.
map.addSource('tilejson-source', {
type: 'vector',
url: 'https://example.com/tiles.json'
});
Пример TileJSON:
{
"tilejson": "2.2.0",
"tiles": [
"https://example.com/tiles/{z}/{x}/{y}.pbf"
],
"minzoom": 0,
"maxzoom": 14
}
TileJSON выполняет роль:
Параметр scheme определяет протокол нумерации
тайлов.
map.addSource('scheme-source', {
type: 'vector',
tiles: [...],
scheme: 'xyz'
});
scheme: 'tms'
Несмотря на наличие «протокола источников», реальная передача данных опирается на HTTP(S):
Cache-ControlGET /tiles/12/654/1582.pbf HTTP/2
Host: example.com
Accept-Encoding: gzip
Протокол источников включает стратегию кэширования:
Особенность: MapLibre избегает повторной загрузки идентичных тайлов при панорамировании и зуме.
MapLibre реализует параллельную загрузку тайлов:
Это создаёт поведенческий слой поверх HTTP, фактически формируя «логический протокол загрузки».
Хотя базовая модель ограничена HTTP(S), архитектура допускает расширение:
Пример абстракции:
tiles: [
'https://api.example.com/tiles/{z}/{x}/{y}?token=ABC'
]
Здесь протокол расширяется параметрами авторизации и динамической генерацией данных.
Протокол источников тесно связан с рендерингом:
Таким образом, протокол определяет не только способ получения данных, но и момент их появления в графическом конвейере.
Несмотря на это, модель остаётся универсальной благодаря простоте и совместимости с веб-экосистемой.