Векторная отрисовка символов и пиктограмм в MapLibre GL JS опирается на концепцию Signed Distance Field (SDF), позволяющую превращать растровые изображения иконок в масштабируемые и стилизуемые графические примитивы без потери резкости. Это фундаментальный механизм символического слоя (symbol layer), обеспечивающий единообразное отображение значков при любом масштабе карты.
SDF представляет собой способ кодирования изображения, при котором каждый пиксель хранит не цвет, а расстояние до ближайшей границы фигуры. Значение интерпретируется следующим образом:
Такое представление позволяет выполнять аппаратную интерполяцию при масштабировании без появления ступенчатых артефактов.
В контексте иконок это означает, что пиктограмма перестаёт быть фиксированным растровым изображением и превращается в математически интерполируемую форму.
В MapLibre GL JS SDF применяется через свойство iconSDF
в описании слоя symbol. При включении этого режима движок
интерпретирует альфа-канал изображения как поле расстояний.
Пример базовой конфигурации слоя:
map.addLayer({
id: "poi-icons",
type: "symbol",
source: "points",
layout: {
"icon-image": "marker-15",
"icon-size": 1.2,
"icon-sdf": true
},
paint: {
"icon-color": "#2E86AB",
"icon-halo-color": "#ffffff",
"icon-halo-width": 1
}
});
В этом режиме цвет пиктограммы перестаёт быть зашитым в изображение и становится управляемым через стили слоя.
Иконки в MapLibre GL JS обычно хранятся в sprite atlas — наборе изображений и JSON-индексе. Для SDF-режима требуется специальная подготовка:
sdf: trueПример фрагмента sprite JSON:
{
"airport-15": {
"width": 20,
"height": 20,
"x": 0,
"y": 0,
"pixelRatio": 1,
"sdf": true
}
}
При отсутствии флага sdf движок будет трактовать
изображение как обычную текстуру, и свойства icon-color
перестанут работать корректно.
Ключевое отличие SDF-иконок заключается в том, что цвет задаётся динамически на GPU.
Основные параметры стилизации:
icon-color — основной цвет заливкиicon-halo-color — цвет обводкиicon-halo-width — толщина обводкиicon-opacity — прозрачностьПример:
paint: {
"icon-color": [
"match",
["get", "type"],
"airport", "#ffcc00",
"hospital", "#ff4d4d",
"#666666"
],
"icon-halo-color": "#000000",
"icon-halo-width": 2
}
SDF позволяет применять цветовые выражения без необходимости хранить отдельные версии иконок для каждого состояния.
Обычные растровые иконки при увеличении масштаба становятся размытыми. SDF решает эту проблему за счёт интерпретации границ как функции расстояния.
При увеличении:
Это особенно важно при работе с динамическим зумом, где символы могут изменять размер в диапазоне от 0.5× до 4× и выше.
SDF-иконки обрабатываются на уровне шейдеров WebGL. Это переносит значительную часть вычислений на GPU:
Однако есть и ограничения:
SDF-иконки сохраняют корректное отображение при:
icon-rotate)zoom interpolation)Пример вращения:
layout: {
"icon-image": "arrow-15",
"icon-rotate": ["get", "bearing"],
"icon-rotation-alignment": "map",
"icon-sdf": true
}
Несмотря на гибкость, SDF имеет ряд ограничений:
SDF подходит исключительно для символических иконок, логотипов и пиктограмм.
SDF-иконки интегрируются с системой выражений MapLibre GL JS, что позволяет динамически изменять их внешний вид:
"icon-color": [
"case",
["boolean", ["feature-state", "selected"], false],
"#ff0000",
"#333333"
]
Такой подход позволяет реализовывать интерактивные состояния:
SDF-иконки широко применяются в слоях:
Пример тематического слоя:
map.addLayer({
id: "transport",
type: "symbol",
source: "transport-data",
layout: {
"icon-image": ["get", "icon"],
"icon-sdf": true,
"icon-size": [
"interpolate",
["linear"],
["zoom"],
5, 0.6,
12, 1.2
]
},
paint: {
"icon-color": "#1f78b4"
}
});
Symbol layer часто комбинирует иконки и текст. SDF влияет на визуальную согласованность между ними:
icon-text-fitПример:
layout: {
"icon-image": "label-bg",
"icon-sdf": true,
"text-field": ["get", "name"],
"text-size": 12,
"icon-text-fit": "both"
}
Ключевые требования к исходным изображениям:
Неправильная подготовка приводит к:
При работе с крупными наборами SDF-иконок используются следующие подходы:
Эти меры уменьшают время загрузки и ускоряют первичную отрисовку карты.
Внутри WebGL-конвейера SDF-иконки проходят следующие стадии:
Такой pipeline обеспечивает стабильную производительность даже при тысячах одновременно отображаемых символов.