Работа с текстом в картографических стилях Mapbox GL JS строится
вокруг слоя типа symbol, где текстовые подписи являются
частью единого механизма рендеринга символов вместе с иконками. Подход
основан на декларативной модели: внешний вид текста задаётся через
layout и paint свойства слоя, а содержимое
формируется из данных источника и выражений стиля.
Mapbox GL JS использует SDF-рендеринг и систему размещения символов с учётом коллизий, что делает текст не просто визуальным элементом, а частью оптимизированного процесса укладки карты.
Текст в символическом слое задаётся через свойство
text-field. Оно принимает строку или выражение, формирующее
содержимое подписи.
{
id: "cities",
type: "symbol",
source: "places",
layout: {
"text-field": "{name}",
"text-size": 14
}
}
Ключевой принцип заключается в том, что текст не «рисуется вручную», а извлекается из данных источника через плейсхолдеры или expression API.
Основные источники текста:
properties)Пример использования нескольких полей:
"text-field": "{name_en}, {country}"
Наиболее гибкий способ управления текстом — выражение
["format", ...]. Оно позволяет комбинировать части текста с
разным стилем внутри одной подписи.
"text-field": [
"format",
["get", "name"],
{ "font-scale": 1.2 },
"\n",
{},
["get", "capital"],
{ "font-scale": 0.9, "text-color": "#666" }
]
Возможности format:
Это особенно важно для многоуровневых подписей (например, город + страна + административный статус).
Mapbox GL JS поддерживает набор строковых выражений, позволяющих формировать текст на лету.
["upcase", ["get", "name"]]
["downcase", ["get", "name"]]
["concat", ["get", "city"], ", ", ["get", "country"]]
["coalesce", ["get", "name_en"], ["get", "name"]]
coalesce особенно важен при работе с мультиязычными
данными, где часть полей может отсутствовать.
Форматирование текста в Mapbox GL JS не ограничивается содержимым. Визуальное поведение задаётся через набор layout-параметров.
"text-size": 14
Также поддерживается интерполяция:
"text-size": [
"interpolate",
["linear"],
["zoom"],
5, 10,
10, 16
]
Это позволяет увеличивать читаемость подписей при приближении карты.
"text-font": ["Open Sans Regular", "Arial Unicode MS Regular"]
Font stack обеспечивает:
При работе с кириллицей и азиатскими языками критически важно включать Unicode-совместимые шрифты.
"text-anchor": "top-left"
"text-offset": [0, 0.5]
Anchor определяет точку привязки текста:
centertopbottomleftrighttop-left,
bottom-right)Offset позволяет сдвигать текст относительно геометрии объекта.
"text-rotate": 45
"text-transform": "uppercase"
text-transform полезен для унификации отображения
данных:
noneuppercaselowercaseПри работе с плотной картой важно управлять поведением длинных подписей.
"text-max-width": 8
"text-word-wrap": true
Mapbox автоматически переносит текст по словам, если превышена ширина.
"text-overlap": false
"text-allow-overlap": false
Эти параметры влияют на систему collision detection.
Для повышения читаемости текста используется обводка (halo).
"text-halo-color": "#ffffff"
"text-halo-width": 2
Halo особенно важен:
Mapbox GL JS поддерживает базовые типографические параметры:
"text-letter-spacing": 0.05
"text-line-height": 1.2
Эти параметры влияют на восприятие плотных текстовых блоков и многострочных подписей.
Система выражений позволяет адаптировать текст в зависимости от масштаба и свойств данных.
"text-field": [
"step",
["zoom"],
"",
5, ["get", "name"],
10, ["get", "name_en"]
]
На низком масштабе показывается минимальная информация, на высоком — более подробная.
"text-color": [
"match",
["get", "type"],
"capital", "#ff0000",
"city", "#0000ff",
"#333333"
]
Это позволяет визуально кодировать категории объектов прямо в тексте.
Форматирование текста тесно связано с локализацией. Типичный подход — хранение нескольких языковых полей:
"text-field": [
"coalesce",
["get", "name_ru"],
["get", "name_en"]
]
Для более сложных сценариев используется выбор языка пользователя через глобальные переменные стиля:
"text-field": ["get", ["get", "preferred_language"]]
Символические слои часто комбинируют текст и иконки.
{
type: "symbol",
layout: {
"icon-image": "marker",
"text-field": "{name}",
"text-offset": [0, 1.2],
"text-anchor": "top"
}
}
Особенности взаимодействия:
text-optional и
icon-optionalСистема размещения текста в Mapbox GL JS основана на grid-based collision detection.
"text-allow-overlap": false
"text-ignore-placement": false
Алгоритм учитывает:
symbol-sort-key)"symbol-sort-key": ["get", "importance"]
Это позволяет управлять тем, какие подписи остаются видимыми при конфликте размещения.
При работе с арабским и ивритом автоматически активируется поддержка RTL-скриптов. Однако важно учитывать:
Сложные подписи часто строятся через комбинацию выражений:
"text-field": [
"format",
["upcase", ["get", "city"]],
{ "font-scale": 1.1 },
"\n",
{},
["concat", "Population: ", ["to-string", ["get", "population"]]],
{ "font-scale": 0.8, "text-color": "#888" }
]
Такой подход позволяет строить иерархические подписи без использования сторонних инструментов.
Mapbox GL JS оптимизирует рендеринг текста через:
Это делает возможным отображение тысяч подписей без существенной деградации производительности.
Mapbox предоставляет инфраструктуру для генерации тайлов, стилей и шрифтов, что напрямую влияет на возможности форматирования текста в карте.