Спрайты изображений в стилях MapLibre GL JS представляют собой централизованный набор иконок и мелких графических элементов, объединённых в единый графический файл и описанных индексом координат. Такой подход используется системой рендеринга стилей для эффективного отображения символов без множества отдельных HTTP-запросов.
В рамках спецификации стилей MapLibre GL GL поддерживается механизм
sprite, который состоит из двух взаимосвязанных
ресурсов:
sprite.png или
sprite@2x.png)sprite.json или
sprite@2x.json)Оба файла работают как единая структура описания набора пиктограмм.
Файл спрайта представляет собой атлас изображений, в котором все иконки размещены в одной плоскости:
@2x для
Retina-дисплеевПреимущество такого подхода заключается в минимизации сетевых запросов и повышении скорости отрисовки.
JSON-файл спрайта описывает координаты каждой иконки внутри атласа:
{
"airport-15": {
"x": 0,
"y": 0,
"width": 32,
"height": 32,
"pixelRatio": 1
},
"rail-11": {
"x": 32,
"y": 0,
"width": 32,
"height": 32,
"pixelRatio": 1
}
}
Каждая запись содержит:
x, y — координаты в пикселях внутри
атласаwidth, height — размеры изображенияpixelRatio — коэффициент плотности (1 или 2 для
HiDPI)В стиле MapLibre GL JS спрайты задаются на уровне объекта
sprite:
{
"version": 8,
"sprite": "https://example.com/sprites/sprite",
"glyphs": "https://example.com/fonts/{fontstack}/{range}.pbf",
"sources": {},
"layers": []
}
Важно, что расширение .png и .json не
указывается — библиотека добавляет их автоматически:
sprite.pngsprite.jsonsprite@2x.pngsprite@2x.jsonСпрайты применяются через свойство icon-image в слоях
типа symbol.
map.addLayer({
id: "airports",
type: "symbol",
source: "places",
layout: {
"icon-image": "airport-15",
"icon-size": 1,
"icon-allow-overlap": true
}
});
Имя "airport-15" должно совпадать с ключом в
sprite.json.
При рендеринге MapLibre GL JS выполняет следующие шаги:
Фактическое извлечение происходит на уровне GPU, что обеспечивает высокую производительность при большом количестве объектов.
Для экранов с высокой плотностью пикселей используются отдельные версии:
sprite.png — базовое разрешениеsprite@2x.png — увеличенное в 2 разаMapLibre автоматически выбирает нужный вариант на основе
devicePixelRatio.
В JSON это отражается полем:
"pixelRatio": 2
Спрайты обычно генерируются автоматически из набора SVG или PNG-иконок.
spritezero)Процесс включает:
Спрайты являются критически кэшируемым ресурсом.
Особенности:
При использовании CDN достигается стабильная производительность даже при больших наборах иконок.
Спрайт является статическим ресурсом. Изменение иконок требует пересборки атласа.
Имена иконок должны быть уникальными:
poi-hospitalСлишком большие спрайты могут негативно влиять на:
Рекомендуется логическая сегментация:
transport-spritefood-spriteui-spriteСпрайты часто применяются совместно с фильтрами слоёв:
map.addLayer({
id: "poi",
type: "symbol",
source: "places",
layout: {
"icon-image": ["get", "icon"],
"icon-size": 1
},
filter: ["has", "icon"]
});
В этом случае значение icon в данных источника
соответствует ключу в sprite.json.
Спрайты тесно связаны с векторными источниками:
Каждый объект может содержать атрибут, указывающий на иконку:
{
"type": "Feature",
"properties": {
"icon": "rail-11"
},
"geometry": {
"type": "Point",
"coordinates": [66.9237, 48.0196]
}
}
MapLibre GL JS позволяет менять спрайт через смену стиля:
map.setStyle("https://example.com/style-with-new-sprite.json");
При этом:
Причины:
.json/.png файлов на
сервереЕсли icon-image не совпадает с ключом в JSON:
Sprite должен быть доступен с корректными заголовками:
Access-Control-Allow-OriginИначе загрузка блокируется браузером.
Практика построения эффективных спрайтов включает:
В системе рендеринга MapLibre GL JS спрайты являются базовым компонентом визуализации символов:
Спрайты являются частью Style Specification и взаимодействуют с:
layers (символические слои)layout propertiespaint propertiesglyphs (шрифтовые атласы)Полный стек визуализации символов строится на комбинации:
Спрайты являются стандартным решением для всех современных WebGL-картографических движков, и MapLibre GL JS реализует этот механизм как прямую часть спецификации стилей, обеспечивая совместимость с индустриальными подходами к рендерингу картографических данных.