В Mapbox GL JS текстовые элементы являются частью слоя типа
symbol, где отображение подписей, меток и аннотаций
полностью зависит от шрифтов, описанных в стиле карты. В отличие от
DOM-ориентированных библиотек, где текст управляется через HTML/CSS,
здесь используется векторная модель с предварительно сгенерированными
глифами и их подгрузкой через специализированный endpoint.
Ключевой принцип: текст не рендерится браузером напрямую — он компонуется из набора глифов (glyphs), которые заранее запрашиваются и кэшируются движком рендеринга.
Система шрифтов состоит из нескольких уровней:
1. Font Stack (стек шрифтов) Определяет приоритетный список гарнитур, например:
"text-font": ["Roboto Regular", "Noto Sans Regular"]
Если первый шрифт недоступен для конкретного символа, используется следующий.
2. Glyph Atlas (атлас глифов) Глифы запрашиваются как PBF-тайлы и представляют собой упакованные векторные данные символов.
3. Glyphs Endpoint В стиле указывается источник:
"glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf"
Текст задаётся через свойство layout.text-field:
map.addLayer({
id: "city-labels",
type: "symbol",
source: "cities",
layout: {
"text-field": "{name}",
"text-font": ["Open Sans Regular"],
"text-size": 14
}
});
Font stack в Mapbox GL JS — это не просто список шрифтов, а система приоритетов для рендеринга глифов.
Пример:
"text-font": [
"DIN Offc Pro Medium",
"Arial Unicode MS Regular"
]
Поведение:
Mapbox GL JS не загружает TTF/OTF напрямую в браузере. Используются подготовленные наборы глифов.
При использовании стилей Mapbox Studio шрифты автоматически доступны через:
mapbox://fonts/{username}/{fontstack}/{range}.pbf
При self-hosted стиле необходимо указать:
"glyphs": "https://example.com/fonts/{fontstack}/{range}.pbf"
Сервер обязан отдавать:
В Mapbox GL JS отсутствует поддержка:
Причина — необходимость предгенерации глифов для WebGL-рендеринга.
Поддержка языков реализуется через комбинирование font stack и корректных glyph ranges.
Один шрифт редко покрывает все Unicode диапазоны.
Использование комбинированных стеков:
"text-font": [
"Noto Sans Regular",
"Noto Sans Arabic Regular",
"Noto Sans CJK JP Regular"
]
Mapbox GL JS использует SDF (Signed Distance Field) шрифты.
layout: {
"text-field": "{title}",
"text-font": ["Open Sans Bold"],
"text-size": 16,
"text-transform": "uppercase",
"text-allow-overlap": false
}
text-anchor — привязка (center, top, bottom)text-offset — смещениеtext-rotate — поворотtext-max-width — перенос строкtext-justify — выравниваниеMapbox GL JS поддерживает expression syntax:
"text-field": ["concat", ["get", "name"], " ", ["get", "type"]]
Возможности:
Производительность зависит от:
Чем меньше диапазон — тем быстрее загрузка.
Glyph tiles кешируются браузером и WebGL контекстом.
Каждый дополнительный шрифт увеличивает количество запросов.
Использование text-max-width и фильтрации текста
уменьшает нагрузку.
Если glyph отсутствует:
Некоторые западные шрифты не содержат кириллицу, что приводит к частичному fallback.
При большом количестве уникальных символов возможно увеличение числа запросов к glyph server.
Text rendering тесно связан с icon rendering:
layout: {
"icon-image": "marker",
"text-field": "{label}",
"text-font": ["Roboto Regular"],
"text-offset": [0, 1.2]
}
Комбинация:
Для автоматического выбора языка используется:
"text-field": ["get", "name:en"]
или fallback:
"text-field": ["coalesce", ["get", "name:en"], ["get", "name"]]
Размер текста может зависеть от масштаба:
"text-size": [
"interpolate",
["linear"],
["zoom"],
5, 10,
10, 16,
15, 22
]
Это позволяет:
В продакшн-архитектурах часто используется собственный glyph server:
Это позволяет: