В Mapbox GL JS отображение объектов строится вокруг строгого разделения между данными (source) и их визуальными ролями (layers). Роль объекта на карте не задаётся явно внутри геометрии, а определяется через слой, который интерпретирует свойства объекта.
Каждый слой выполняет одну из визуальных ролей:
Именно слой символов (symbol layer) отвечает за
labels, где текст и иконки становятся частью
картографической сцены.
В Mapbox GL JS подписи реализуются через слой типа:
type: "symbol"Этот тип слоя объединяет две независимые, но часто используемые вместе сущности:
text — текстовые подписи (labels)icon — графические пиктограммыРоль слоя символов заключается не просто в отрисовке текста, а в управлении позиционированием, приоритетами и конфликтами отображения.
Ключевой момент: label не является отдельным объектом данных — это визуальная интерпретация свойства feature.
Текстовая часть символического слоя определяется через
layout параметры:
text-fieldtext-sizetext-fonttext-transformtext-letter-spacingtext-max-width= f(properties, expressions)
text-field определяет, какое свойство объекта становится
подписью.
Примеры ролей:
properties.nameproperties.type"${name_ru} / ${name_en}"Mapbox поддерживает выражения, что позволяет формировать label как функцию от данных:
Labels редко существуют изолированно. Они подчиняются иерархии слоёв:
Каждый уровень задаётся отдельным слоем symbol, где роль определяется:
layer order)minzoom, maxzoom)Одной из ключевых задач Mapbox GL JS является предотвращение наложения подписей.
Механизм работает через:
text-allow-overlaptext-ignore-placementsymbol-sort-keyРоль label в этом контексте становится не только визуальной, но и системной — каждый текстовый элемент участвует в алгоритме размещения.
Пример приоритетной логики:
symbol-sort-keyMapbox GL JS поддерживает expression-based стилизацию, что позволяет задавать роль label динамически.
Типичные конструкции:
["get", "name"]["concat", ["get", "city"], ", ", ["get", "country"]]["case", condition, value_if_true, value_if_false]Это превращает label в вычисляемое представление данных.
Роль перестаёт быть фиксированной и становится контекстной:
Symbol layer может совмещать:
text (подпись)icon (символ)Роли могут быть независимыми или взаимосвязанными:
Ключевые свойства:
icon-imageicon-sizeicon-allow-overlaptext-offsetКомбинация позволяет формировать мультимодальные labels, где визуальная роль распределяется между текстом и графикой.
Каждый label имеет точку привязки:
text-anchoricon-anchorВозможные позиции:
= f(anchor, offset, geometry)
Роль anchor определяет, где относительно геометрии будет размещён текст.
Пример:
Labels тесно связаны с масштабом карты.
Параметры:
minzoommaxzoomtext-size с интерполяциейРоль одного и того же label меняется в зависимости от zoom level:
Интерполяция позволяет плавно изменять визуальную роль текста:
Mapbox GL JS поддерживает мультиязычные labels через:
Типичная структура:
name_enname_runame_localРоль определяется приоритетом:
= (name_{ru}, name_{en}, name_{local})
Это позволяет адаптировать карту под контекст пользователя без изменения источника данных.
Mapbox GL JS поддерживает состояние объектов:
Через feature-state label может менять поведение:
Пример логики:
Роль label становится реактивной и зависит от UI-событий.
Слои labels часто используют filter для разделения
ролей:
Фильтрация задаёт, какие features участвуют в конкретной label-роли.
Пример логики:
Каждый слой имеет собственный набор правил отображения текста.
Рендеринг labels — одна из самых дорогих операций в Mapbox GL JS.
Критические факторы:
Оптимизация достигается через:
symbol-placementПараметр symbol-placement определяет геометрическую роль
label:
point — точечные подписиline — подписи вдоль линийline-center — центр линии
Это влияет на восприятие данных:
Хотя Mapbox GL JS не навязывает строгую семантику, роль label часто выводится из структуры данных:
Таким образом, роль label — это проекция бизнес-логики данных в визуальный слой.
В продвинутых стилях один объект может участвовать сразу в нескольких label-ролях:
Это реализуется через несколько symbol layers с разными фильтрами и стилями.
Каждый слой формирует свою роль:
Стиль карты в Mapbox GL JS можно рассматривать как систему, где роли labels формируются поэтапно: