В MapLibre GL JS паттерны (patterns) и текстуры используются для заполнения геометрии повторяющимися изображениями вместо сплошных цветов. Это ключевой механизм для визуального обогащения картографических слоёв: штриховка территорий, обозначение типов зон, визуальная дифференциация объектов без увеличения палитры цветов.
Паттерны применяются в трёх основных контекстах стиля:
fill-pattern — заполнение полигоновline-pattern — текстура линийbackground-pattern — фон картыКаждый из этих типов работает через систему спрайтов и image-ресурсов, загруженных в стиль карты.
MapLibre GL JS опирается на стиль-ориентированную модель рендеринга. Все изображения, используемые в паттернах, должны быть предварительно зарегистрированы в стиле через API:
Базовый механизм регистрации изображения:
map.on('load', () => {
map.loadImage('/patterns/diagonal-hatch.png', (error, image) => {
if (error) throw error;
if (!map.hasImage('diagonal-hatch')) {
map.addImage('diagonal-hatch', image);
}
});
});
После добавления изображение становится доступным в style-spec как идентификатор ресурса.
Полигональные слои используют свойство fill-pattern. Оно
заменяет fill-color или комбинируется с ним для сложных
эффектов.
map.addLayer({
id: 'landuse-pattern',
type: 'fill',
source: 'landuse',
paint: {
'fill-pattern': 'diagonal-hatch'
}
});
В этом случае изображение автоматически тайлится по поверхности полигона.
Паттерны в MapLibre GL JS работают в пространстве тайлов. Это означает:
Для управления визуальной плотностью используется подход с несколькими версиями изображений:
pattern-smallpattern-mediumpattern-largeДалее применяется data-driven styling:
'fill-pattern': [
'step',
['zoom'],
'pattern-small',
10,
'pattern-medium',
14,
'pattern-large'
]
Линии поддерживают паттерны через свойство line-pattern.
Это используется для:
map.addLayer({
id: 'railway-pattern',
type: 'line',
source: 'railways',
paint: {
'line-pattern': 'rail-dashed-pattern',
'line-width': 6
}
});
Особенность line-pattern заключается в том, что изображение растягивается вдоль линии с учётом её длины и сегментации.
Фон карты может быть задан через background-pattern. Это
позволяет заменить однотонный фон на:
map.setPaintProperty('background', 'background-pattern', 'paper-texture');
Фоновый паттерн применяется до всех слоёв и влияет на визуальную основу карты.
Вместо загрузки отдельных изображений используется sprite atlas — единый набор изображений, оптимизированный для рендеринга.
Структура sprite:
MapLibre автоматически загружает:
map.setSprite('/sprites/sprite');
После этого доступ к паттернам осуществляется через ключи:
forest-patternwater-patternurban-gridИспользование sprite снижает количество HTTP-запросов и ускоряет рендеринг.
Эффективные паттерны подчиняются ряду технических ограничений:
Для сложных картографических паттернов часто используются:
Паттерны могут быть созданы динамически через
<canvas>:
const canvas = document.createElement('canvas');
canvas.width = 64;
canvas.height = 64;
const ctx = canvas.getContext('2d');
ctx.strokeStyle = '#000';
ctx.lineWidth = 2;
ctx.moveTo(0, 0);
ctx.lineTo(64, 64);
ctx.stroke();
map.addImage('dynamic-pattern', canvas);
Этот подход позволяет:
MapLibre GL JS поддерживает data-driven styling, где паттерн выбирается на основе атрибутов GeoJSON или векторных тайлов.
'fill-pattern': [
'match',
['get', 'type'],
'forest', 'forest-pattern',
'water', 'water-pattern',
'urban', 'urban-pattern',
'default-pattern'
]
Это позволяет создавать семантически различимую карту без увеличения цветовой сложности.
Паттерны не исключают использование цвета. Возможны комбинированные стили:
fill-colorfill-patternpaint: {
'fill-color': 'rgba(0, 128, 0, 0.2)',
'fill-pattern': 'forest-texture'
}
Такой подход используется для:
Паттерны напрямую влияют на GPU-рендеринг. Основные оптимизационные принципы:
При высоком zoom увеличивается нагрузка на повторяющийся рендеринг, поэтому предпочтительно использовать адаптивные паттерны.
Существуют архитектурные ограничения:
Для обхода ограничений используются:
В сложных картографических стилях паттерны комбинируются с:
Пример многослойной структуры:
fill-colorfill-patternline-layer для границТакая композиция позволяет создавать визуально насыщенные карты без перегрузки цветовой модели.
Поддерживаемые форматы:
PNG остаётся стандартом из-за поддержки alpha-канала и предсказуемого рендеринга.
Паттерны в MapLibre GL JS фиксируются в экранных координатах (screen space), а не в географических координатах. Это означает:
Такой подход обеспечивает стабильность визуального восприятия при навигации по карте.