Протокол для источников

В основе работы 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) — определяет формат данных;
  • шаблон URL (tiles) — задаёт способ адресации тайлов;
  • схему загрузки (scheme) — определяет систему координат тайлов;
  • метаданные (minzoom, maxzoom) — управляют диапазоном загрузки.

MapLibre не использует отдельный бинарный сетевой протокол; вместо этого применяется HTTP(S) с договорённостями о структуре URL и форматах данных.


Типы источников и их протоколы

Векторные источники

Векторные тайлы — основной тип данных для современных карт.

map.addSource('vector-source', {
  type: 'vector',
  tiles: [
    'https://example.com/tiles/{z}/{x}/{y}.pbf'
  ]
});

Протокол:

  • Формат данных: MVT (Mapbox Vector Tile) в бинарном виде .pbf;
  • Передача: HTTP GET запросы;
  • Сегментация: тайлы по координатам {z}/{x}/{y};
  • Сжатие: gzip или brotli (на уровне HTTP сервера).

Ключевая особенность — ленивая загрузка. Тайлы запрашиваются только при необходимости отображения в текущем viewport.


Растровые источники

Растровые источники используют готовые изображения тайлов.

map.addSource('raster-source', {
  type: 'raster',
  tiles: [
    'https://example.com/raster/{z}/{x}/{y}.png'
  ],
  tileSize: 256
});

Протокол:

  • Форматы: PNG, JPEG, WEBP;
  • HTTP(S) доставка;
  • Жёсткая привязка к пиксельной сетке;
  • Отсутствие семантики объектов внутри тайла.

Особенность заключается в том, что сервер полностью контролирует визуальное представление, а клиент выполняет только композитинг.


GeoJSON-источники

GeoJSON может передаваться как локальный объект или через URL.

map.addSource('geojson-source', {
  type: 'geojson',
  data: 'https://example.com/data/features.json'
});

Протокол:

  • Формат: JSON;
  • Возможна загрузка по HTTP(S);
  • Поддержка обновления данных через повторные запросы;
  • Клиентская интерпретация геометрии.

В отличие от тайловых источников, GeoJSON не требует координатной сегментации, но при больших объёмах данных может использовать кластеризацию и генерацию тайлов на лету.


Image и video источники

Image source

map.addSource('image-source', {
  type: 'image',
  url: 'https://example.com/image.png',
  coordinates: [...]
});

Протокол:

  • Обычный HTTP(S) запрос;
  • Фиксированное геопривязанное изображение;
  • Отсутствие тайловой структуры.

Video source

map.addSource('video-source', {
  type: 'video',
  urls: [
    'https://example.com/video.mp4'
  ],
  coordinates: [...]
});

Протокол:

  • Потоковая доставка через HTTP(S);
  • Поддержка HLS/MP4;
  • Привязка к географическому прямоугольнику.

Tile URL template protocol

Ключевой механизм взаимодействия с тайловыми серверами — шаблон URL.

Переменные шаблона

  • {z} — уровень масштабирования;
  • {x} — координата по оси X;
  • {y} — координата по оси Y;
  • {quadkey} — альтернативная адресация (редко используется).

Пример:

https://tiles.example.com/{z}/{x}/{y}.pbf

MapLibre заменяет эти переменные на конкретные значения перед отправкой HTTP-запроса.


TileJSON как протокол описания источника

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 выполняет роль:

  • централизованного описания источника;
  • точки конфигурации для CDN;
  • механизма динамической подстановки URL.

Схема координат тайлов (scheme)

Параметр scheme определяет протокол нумерации тайлов.

map.addSource('scheme-source', {
  type: 'vector',
  tiles: [...],
  scheme: 'xyz'
});

XYZ (по умолчанию)

  • Ось Y направлена сверху вниз;
  • Совместим с большинством веб-карт;
  • Используется в Mapbox/MapLibre экосистеме.

TMS

scheme: 'tms'
  • Ось Y инвертирована;
  • Используется в классических GIS-системах;
  • Требует преобразования координат при загрузке.

HTTP как транспортный уровень

Несмотря на наличие «протокола источников», реальная передача данных опирается на HTTP(S):

Основные характеристики:

  • GET-запросы для тайлов
  • Поддержка кэширования через Cache-Control
  • Использование CDN для масштабирования
  • Поддержка HTTP/2 и HTTP/3 для параллельной загрузки

Пример запроса тайла:

GET /tiles/12/654/1582.pbf HTTP/2
Host: example.com
Accept-Encoding: gzip

Кэширование и повторное использование

Протокол источников включает стратегию кэширования:

  • Кэш браузера (HTTP cache);
  • Внутренний кэш MapLibre;
  • Дедупликация запросов тайлов;
  • Приоритизация видимых областей.

Особенность: MapLibre избегает повторной загрузки идентичных тайлов при панорамировании и зуме.


Параллелизм и загрузочный протокол

MapLibre реализует параллельную загрузку тайлов:

  • ограничение количества одновременных HTTP-запросов;
  • приоритет тайлов в центре экрана;
  • отмена запросов вне viewport;
  • предзагрузка соседних тайлов.

Это создаёт поведенческий слой поверх HTTP, фактически формируя «логический протокол загрузки».


Кастомные протоколы и расширения

Хотя базовая модель ограничена HTTP(S), архитектура допускает расширение:

  • пользовательские URL-схемы;
  • прокси-слои для авторизации;
  • генерация тайлов на лету (server-side rendering);
  • интеграция с локальными файловыми системами через middleware.

Пример абстракции:

tiles: [
  'https://api.example.com/tiles/{z}/{x}/{y}?token=ABC'
]

Здесь протокол расширяется параметрами авторизации и динамической генерацией данных.


Взаимодействие с рендерингом

Протокол источников тесно связан с рендерингом:

  • загрузка тайла → декодирование → размещение в буфере;
  • синхронизация с WebGL пайплайном;
  • асинхронная подгрузка при изменении камеры.

Таким образом, протокол определяет не только способ получения данных, но и момент их появления в графическом конвейере.


Ограничения протокольной модели

  • отсутствует единый бинарный транспортный протокол;
  • зависимость от HTTP инфраструктуры;
  • чувствительность к latency при большом количестве тайлов;
  • необходимость внешнего сервера для генерации данных.

Несмотря на это, модель остаётся универсальной благодаря простоте и совместимости с веб-экосистемой.