В рендеринге карт Mapbox GL JS используется подход Signed Distance Field (SDF) для представления иконок как масштабируемых, легко перекрашиваемых объектов. Вместо хранения пиксельного изображения каждый пиксель хранит информацию о расстоянии до ближайшего края фигуры. Это позволяет динамически изменять визуальные свойства иконок без потери качества при масштабировании.
Ключевая особенность SDF-иконок заключается в том, что они перестают быть «картинками» в классическом смысле и становятся математически интерпретируемыми масками, на которые можно накладывать цвет, прозрачность и эффекты через стиль.
Signed Distance Field — это функция, которая для каждой точки пространства возвращает расстояние до ближайшей границы формы:
В растровом представлении это кодируется в градациях серого. Ближе к краю значение стремится к среднему уровню, а внутри и снаружи плавно изменяется.
Благодаря этому иконка становится не фиксированным изображением, а «шаблоном», который можно интерпретировать шейдером.
Использование SDF в системе стилей карт даёт несколько фундаментальных преимуществ:
Векторный рендеринг и GPU-шейдеры делают SDF естественным форматом для иконок в Mapbox GL JS.
Иконка может быть загружена в стиль через addImage с
параметром sdf: true.
map.loadImage('marker.png', (error, image) => {
if (error) throw error;
map.addImage('custom-marker', image, {
sdf: true
});
});
После этого изображение перестаёт восприниматься как обычная текстура и становится SDF-слоем.
SDF-иконки применяются через symbol layer.
map.addLayer({
id: 'points',
type: 'symbol',
source: 'points-data',
layout: {
'icon-image': 'custom-marker',
'icon-size': 1.2
},
paint: {
'icon-color': '#ff0000',
'icon-opacity': 0.9
}
});
Важный момент: свойство icon-color начинает работать
только при использовании SDF-иконки.
Обычные растровые иконки не позволяют менять цвет без замены изображения. SDF решает эту проблему.
Основные параметры:
icon-color — перекрашивает формуicon-halo-color — добавляет обводкуicon-halo-width — ширина обводкиicon-opacity — прозрачностьПример динамического изменения:
'icon-color': [
'match',
['get', 'type'],
'restaurant', '#e74c3c',
'hotel', '#3498db',
'#2ecc71'
]
SDF-иконки сохраняют чёткость при любых значениях
icon-size.
Особенность поведения:
Это критично для карт, где zoom-уровни могут варьироваться от 0 до 22.
Mapbox использует sprite-атласы для оптимизации загрузки иконок.
SDF-иконки также могут быть частью sprite, однако с дополнительной мета-информацией о типе рендеринга.
При сборке спрайта:
Одно из ключевых преимуществ SDF — интеграция с выражениями стиля.
Пример изменения размера по данным:
'icon-size': [
'interpolate',
['linear'],
['zoom'],
5, 0.5,
10, 1,
15, 1.8
]
Пример комбинирования цвета и данных:
'icon-color': [
'case',
['==', ['get', 'priority'], 'high'],
'#ff0000',
['==', ['get', 'priority'], 'medium'],
'#ffa500',
'#2ecc71'
]
SDF-иконки удобно использовать для UI-подобного поведения на карте.
Поддерживаемые состояния:
Пример визуального выделения:
'icon-opacity': [
'case',
['boolean', ['feature-state', 'selected'], false],
1,
0.5
]
Несмотря на универсальность, SDF имеет особенности:
Также важно учитывать, что чрезмерно сложные формы увеличивают шум в distance field.
Для корректного отображения иконок используются следующие принципы:
Типичный pipeline:
addImageSDF-иконки обрабатываются на GPU, что даёт:
Особенно заметно при отрисовке тысяч точек на карте, где каждый символ становится инстансируемым объектом.
SDF-иконки часто комбинируются с текстом:
layout: {
'icon-image': 'marker',
'text-field': ['get', 'name'],
'text-offset': [0, 1.2]
}
Такое сочетание позволяет создавать маркеры с динамическими подписями без дополнительных графических ресурсов.
SDF позволяет реализовать визуальные эффекты, которые обычно требуют шейдеров:
Пример «пульсации» через zoom:
'icon-opacity': [
'interpolate',
['linear'],
['zoom'],
10, 0.5,
14, 1
]
icon-colorКорректная работа требует строгого соответствия формату distance field и стилевым ограничениям рендерера.