MapLibre GL JS поддерживает несколько типов источников данных
(sources), среди которых выделяется canvas-источник —
механизм подключения произвольного HTML5 Canvas как растрового слоя
внутри карты. Этот тип источника позволяет интегрировать динамически
рисуемую графику непосредственно в систему рендеринга карты и
синхронизировать её с географическими координатами.
Canvas-источник функционирует как промежуточный слой между процедурной графикой браузера и WebGL-пайплайном карты. В отличие от тайловых источников (vector/raster tiles), он не разбивает данные на тайлы, а использует единое изображение, обновляемое в реальном времени.
В MapLibre GL JS источники данных делятся на несколько категорий:
Canvas-источник занимает особое положение, поскольку:
Основная идея заключается в том, что Canvas выступает как «генератор текстуры», которая затем проецируется на карту с привязкой к географическому прямоугольнику.
Canvas-источник задаётся через метод addSource, где
указывается тип canvas и параметры привязки:
map.addSource('dynamic-canvas', {
type: 'canvas',
canvas: 'myCanvas',
animate: true,
coordinates: [
[-80.425, 37.78],
[-71.516, 37.78],
[-71.516, 30.89],
[-80.425, 30.89]
]
});
Ключевые параметры:
Canvas может передаваться как строковый ID DOM-элемента или как
объект HTMLCanvasElement.
Canvas-источник всегда отображается как накладываемая текстура, привязанная к четырём координатам:
coordinates: [
[west, north],
[east, north],
[east, south],
[west, south]
]
Эта структура задаёт:
Таким образом формируется произвольный четырёхугольник в географическом пространстве, на который проецируется изображение canvas.
Параметр animate: true активирует постоянное обновление
источника. В этом режиме MapLibre GL JS регулярно перерисовывает canvas
и обновляет текстуру в GPU.
Типичный сценарий:
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = 'rgba(255, 0, 0, 0.5)';
ctx.beginPath();
ctx.arc(Math.random() * canvas.width, Math.random() * canvas.height, 20, 0, Math.PI * 2);
ctx.fill();
requestAnimationFrame(draw);
}
draw();
При включённом animate MapLibre автоматически
синхронизирует обновления canvas с рендерингом карты, без необходимости
вручную вызывать обновление источника.
Canvas-источник не работает как статическая текстура. Его жизненный цикл связан с DOM и состоянием карты.
При изменении содержимого canvas возможны два режима:
map.getSource().load() или
пересоздание источникаconst source = map.getSource('dynamic-canvas');
source.play(); // в зависимости от реализации может активировать цикл обновления
(в большинстве случаев достаточно включённой анимации и requestAnimationFrame внутри canvas-логики)
Canvas-источник применяется для генерации визуальных данных на лету:
В отличие от WebGL-слоёв, логика остаётся в JavaScript Canvas API, что упрощает реализацию алгоритмов.
Canvas-источник имеет ряд особенностей, влияющих на производительность:
requestAnimationFrameCanvas-источник может использоваться в комбинации с другими слоями:
Слои MapLibre GL JS рендерятся поверх canvas-источника в зависимости от порядка добавления и z-index.
Canvas можно перемещать по карте путём обновления координат источника:
map.getSource('dynamic-canvas').setCoordinates([
[lng1, lat1],
[lng2, lat2],
[lng3, lat3],
[lng4, lat4]
]);
Это позволяет:
Внутренняя схема работы canvas-источника:
Canvas-источник часто используется для:
Canvas-источник не конфликтует с WebGL-рендерингом MapLibre GL JS, однако:
При высокой нагрузке возможна деградация FPS карты, поскольку CPU и GPU делят ресурсы между картой и canvas-логикой.
Canvas-слой:
Это делает его эквивалентом геопривязанной текстуры с перспективной трансформацией.