Работа со спрайтами в MapLibre GL JS является ключевым элементом построения производительных картографических интерфейсов, поскольку именно через спрайты реализуется единый механизм хранения и отрисовки множества иконок, пиктограмм и символов, используемых в слоях стиля.
Спрайт в контексте MapLibre GL JS представляет собой набор изображений, упакованных в один графический файл (обычно PNG) и сопровождаемый JSON-описанием, содержащим координаты и размеры каждого элемента. Такой подход минимизирует количество HTTP-запросов и ускоряет рендеринг.
Типичная структура спрайта состоит из двух файлов:
sprite.png — атлас изображенийsprite.json — метаданные размещенияФрагмент JSON-структуры:
{
"airport": {
"x": 0,
"y": 0,
"width": 32,
"height": 32,
"pixelRatio": 1
},
"rail": {
"x": 32,
"y": 0,
"width": 32,
"height": 32,
"pixelRatio": 1
}
}
Каждый ключ соответствует имени иконки, используемой в стиле карты
через свойство icon-image.
Спрайт определяется на уровне стиля через параметр
sprite. Это базовый URL без расширения, так как MapLibre
автоматически запрашивает .png и .json.
{
"version": 8,
"sprite": "https://example.com/sprites/sprite",
"sources": {},
"layers": []
}
При этом библиотека выполняет два запроса:
https://example.com/sprites/sprite.jsonhttps://example.com/sprites/sprite.pngПосле загрузки спрайта его элементы становятся доступны через
icon-image:
{
"id": "poi-layer",
"type": "symbol",
"source": "points",
"layout": {
"icon-image": "airport",
"icon-size": 1
}
}
Имя "airport" должно совпадать с ключом в
sprite.json.
Для устройств с высокой плотностью пикселей используются спрайты с
коэффициентом @2x или pixelRatio: 2. MapLibre
автоматически выбирает нужную версию в зависимости от
devicePixelRatio.
Пример структуры:
sprite.pngsprite@2x.pngsprite.jsonsprite@2x.jsonВ JSON каждая запись может содержать:
"airport": {
"x": 0,
"y": 0,
"width": 32,
"height": 32,
"pixelRatio": 2
}
Спрайты обычно создаются сборщиками, которые объединяют набор SVG или PNG файлов в единый атлас.
Логика генерации включает:
Важно учитывать, что порядок упаковки влияет на итоговый размер файла.
Помимо статического sprite.json, MapLibre GL JS позволяет добавлять изображения динамически через API:
map.on('load', () => {
map.addImage('custom-marker', imageBitmap, {
pixelRatio: 2
});
});
После добавления изображение становится доступным как
icon-image.
Удаление:
map.removeImage('custom-marker');
Проверка наличия:
map.hasImage('custom-marker');
Спрайт и addImage решают разные задачи:
addImage — динамическая регистрация изображений в
рантаймеСпрайт лучше подходит для:
addImage используется для:
Signed Distance Field (SDF) позволяет изменять цвет иконки через стиль без пересоздания изображения.
Пример:
{
"layout": {
"icon-image": "airport",
"icon-sdf": true
},
"paint": {
"icon-color": "#ff0000",
"icon-halo-color": "#000000",
"icon-halo-width": 2
}
}
SDF особенно эффективен для унифицированных иконок, требующих стилизации через CSS-подобные параметры.
Спрайты являются критически важным элементом оптимизации:
При использовании CDN рекомендуется задавать долгий cache-control, так как изменение спрайта требует обновления хэша или версии URL.
Работа со спрайтами имеет ряд технических ограничений:
Хотя прямое обновление sprite URL возможно, оно требует переинициализации стиля:
map.setStyle({
...map.getStyle(),
sprite: "https://example.com/new-sprite"
});
Это приводит к повторной загрузке ресурсов и пересборке слоёв.
Система именования элементов спрайта влияет на читаемость стилей:
poi_hospitalpoi_schooltransport_bustransport_trainИерархическая структура помогает группировать иконки логически, особенно в больших проектах.
В сложных картах спрайты используются совместно с выражениями:
{
"icon-image": [
"match",
["get", "type"],
"hospital", "poi_hospital",
"school", "poi_school",
"default_marker"
]
}
Такой подход позволяет управлять отображением без изменения кода приложения.
Практические подходы:
Чрезмерно большие спрайты увеличивают время парсинга JSON и загрузки текстуры.
MapLibre GL JS следует спецификации Mapbox Style Specification, где sprite является стандартным полем стиля. Это обеспечивает совместимость с большинством инструментов генерации картографических стилей и библиотек визуализации.
Спрайты остаются фундаментальным механизмом визуализации символов, обеспечивая баланс между гибкостью дизайна и производительностью рендеринга WebGL-карты.