Символьный слой (Symbol layer) в Mapbox GL JS предназначен для отображения точечных и линейных объектов в виде иконок и подписей. Это один из наиболее сложных и функционально насыщенных типов слоёв, так как он объединяет визуализацию текста, растровых и векторных иконок, а также систему предотвращения наложений (collision detection), которая критически влияет на читаемость карты.
Основная особенность символов заключается в том, что они всегда зависят от набора данных источника (source), но их визуальное поведение определяется одновременно через layout- и paint-свойства. Layout отвечает за геометрию и правила размещения, а paint — за визуальные параметры отрисовки.
Символьный слой объявляется через тип symbol и работает
с любым векторным источником данных (vector source,
geojson source).
Ключевые поля:
source — источник данныхsource-layer — слой внутри векторного тайлаtype: "symbol"Пример конфигурации:
map.addLayer({
id: "cities",
type: "symbol",
source: "places",
layout: {
"icon-image": "marker-15",
"text-field": ["get", "name"],
"text-size": 14
}
});
Символьный слой всегда строится вокруг двух основных сущностей:
Иконки в Mapbox GL JS не загружаются напрямую как URL в каждом слое. Вместо этого используется sprite atlas — единый набор изображений, загружаемый через стиль карты.
icon-image — имя иконки из spriteicon-size — масштабирование иконкиicon-rotate — вращениеicon-offset — смещение относительно точкиicon-anchor — точка привязки (center, top, bottom и
т.д.)layout: {
"icon-image": "airport-15",
"icon-size": 1.2,
"icon-rotate": 45
}
SDF (Signed Distance Field) иконки позволяют:
icon-colorpaint: {
"icon-color": "#ff0000"
}
Текст формируется через text-field. Это не просто
строка, а expression-система Mapbox.
"text-field": ["get", "name"]
"text-field": ["concat", "Город: ", ["get", "name"]]
Mapbox поддерживает форматированные строки:
"text-field": [
"format",
["get", "name"],
{ "font-scale": 1.2, "text-color": "#000" }
]
"text-field": [
"case",
["==", ["get", "type"], "capital"],
"Столица",
["get", "name"]
]
Одной из ключевых задач symbol-слоя является предотвращение наложения подписей и иконок.
text-allow-overlapicon-allow-overlaptext-ignore-placementicon-ignore-placementlayout: {
"text-allow-overlap": false,
"icon-allow-overlap": false
}
Можно управлять приоритетом:
"text-priority": ["get", "rank"]
Чем выше значение — тем выше шанс отображения.
Определяет, как символы располагаются относительно геометрии.
point — только точкиline — вдоль линииline-center — по центру линииlayout: {
"symbol-placement": "line"
}
Используется для дорог, рек, маршрутов:
layout: {
"symbol-placement": "line",
"text-field": "Route",
"text-rotation-alignment": "map"
}
map — текст следует ориентации картыviewport — всегда ориентирован вверхlayout: {
"text-rotation-alignment": "viewport",
"icon-rotation-alignment": "map"
}
Символьные слои поддерживают интерполяцию по zoom.
"text-size": [
"interpolate",
["linear"],
["zoom"],
10, 12,
15, 18
]
"icon-size": [
"interpolate",
["linear"],
["zoom"],
8, 0.5,
16, 1.5
]
Это позволяет адаптировать карту под разные уровни детализации.
Символьные слои активно используют свойства данных.
"text-color": [
"match",
["get", "category"],
"park", "#2ecc71",
"water", "#3498db",
"#333333"
]
"text-size": [
"interpolate",
["linear"],
["get", "population"],
1000, 10,
1000000, 24
]
"icon-anchor": "bottom"
"text-offset": [0, 1.5]
Позволяет позиционировать подпись относительно иконки.
Часто используется комбинация:
layout: {
"icon-image": "marker",
"text-field": ["get", "name"],
"text-offset": [0, 1.2],
"text-anchor": "top"
}
Это создаёт стандартные маркеры с подписями.
Символьные слои — одни из самых дорогих по вычислениям, поскольку включают:
minzoom и maxzoom"minzoom": 10,
"maxzoom": 18
Text rendering зависит от glyph atlas.
В стиле задаётся:
"glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf"
Шрифты подгружаются по диапазонам символов, что снижает нагрузку и ускоряет рендеринг.
Фильтры применяются для ограничения отображаемых объектов:
"filter": ["==", ["get", "type"], "city"]
Сложные фильтры позволяют строить многоуровневые системы подписей (например, показывать города только на определённых зумах).
Для маршрутов и трасс используется автоматическая ориентация:
layout: {
"symbol-placement": "line",
"text-rotation-alignment": "map",
"text-field": ["get", "name"]
}
Это обеспечивает чтение текста вдоль геометрии линии.
Поддерживаются составные конструкции:
"text-field": [
"concat",
["get", "name"],
"\n",
["get", "country"]
]
Можно строить многострочные подписи.
Символьные слои участвуют в интерактивности карты:
map.on("click", "cities", (e) => {
const feature = e.features[0];
});
Также доступны:
mouseentermouseleavemousemoveЧерез paint:
"icon-opacity": 0.8,
"text-opacity": 1
И через zoom:
"text-opacity": [
"interpolate",
["linear"],
["zoom"],
10, 0,
12, 1
]
Символьные слои обычно используются в связке:
Иерархия строится через:
Распространённые проблемы:
Эти ошибки приводят к визуальному шуму и падению производительности рендеринга.
Symbol layer адаптируется к:
"icon-pitch-alignment": "auto",
"text-pitch-alignment": "auto"
Это позволяет сохранять читаемость при 3D-визуализации.