В Mapbox GL JS отображение текста реализуется через слой типа
symbol, в котором текстовые подписи являются частью единой
системы символов вместе с иконками. Текст не рендерится как
DOM-элементы, а компилируется в GPU-оптимизированные SDF-глифы,
поступающие из стилевого источника через glyphs.
Источником текста служат свойства объектов GeoJSON или векторных
тайлов. Значения полей извлекаются через выражение
text-field, которое формирует строку для отображения.
{
"id": "cities",
"type": "symbol",
"source": "places",
"layout": {
"text-field": ["get", "name"]
}
}
Поле text-field принимает строковые значения и
выражения, что позволяет собирать динамические подписи из нескольких
атрибутов и литералов.
Текст в Mapbox GL JS требует загрузки глифов через параметр
glyphs в стиле карты:
glyphs: "mapbox://fonts/mapbox/{fontstack}/{range}.pbf"
Каждый стиль определяет набор шрифтов (fontstack),
которые используются при рендеринге текста. При отсутствии необходимых
глифов отображение символов становится невозможным, что приводит к
пропускам или замене символов.
Поддерживаются шрифтовые стеки, например:
layout: {
"text-font": ["DIN Offc Pro Medium", "Arial Unicode MS Regular"]
}
Порядок в массиве определяет приоритет выбора гарнитуры.
Mapbox GL JS использует expression system, позволяющую собирать строки без внешней логики.
"text-field": ["concat", ["get", "city"], ", ", ["get", "country"]]
"text-field": [
"case",
["has", "name"],
["get", "name"],
"Unnamed"
]
"text-field": ["coalesce", ["get", "name"], ["get", "id"]]
"text-field": [
"format",
["get", "name"],
{ "font-scale": 1.2 },
"\n",
{},
["get", "population"],
{ "font-scale": 0.8, "text-color": "#999" }
]
Expression format позволяет смешивать стили внутри одной
подписи, задавая различные визуальные параметры для частей текста.
"text-size": 14
Допускаются также масштабируемые выражения:
"text-size": ["interpolate", ["linear"], ["zoom"], 5, 10, 10, 18]
Размер текста часто связывается с уровнем зума для повышения читаемости.
"text-offset": [0, 1.5]
Смещение задаётся в единицах em относительно положения геометрии. Первый компонент отвечает за горизонтальное смещение, второй — за вертикальное.
"text-anchor": "top"
Доступные значения: center, top,
bottom, left, right, а также их
комбинации (top-left, bottom-right и
т.д.).
Дополнительно управляется выравнивание текста:
"text-justify": "center"
"text-rotate": 45
Поддерживается как фиксированное значение, так и выражения на основе данных:
"text-rotate": ["get", "bearing"]
Одной из ключевых систем является collision detection, предотвращающая наложение текста.
"text-allow-overlap": false
"text-ignore-placement": false
"text-optional": false
text-allow-overlap разрешает перекрытие текстаtext-ignore-placement игнорирует ограничения
размещенияtext-optional делает текст второстепенным по отношению
к другим символамДополнительно используется:
"text-keep-upright": true
для предотвращения переворачивания текста при вращении карты.
"text-max-width": 8
Задаёт максимальную ширину строки в em. При превышении происходит автоматический перенос.
Также используется:
"text-line-height": 1.2
для управления межстрочным интервалом.
При работе с различными языками применяется стратегия fallback через
text-font и coalesce:
"text-field": [
"coalesce",
["get", "name:ru"],
["get", "name:en"],
["get", "name"]
]
Подобный подход обеспечивает корректное отображение локализованных подписей.
Поддержка Unicode реализуется через соответствующие glyph sets. При использовании арабских или ивритских текстов требуется корректная обработка направления письма, которая выполняется автоматически движком рендеринга.
Особенности:
Слой symbol объединяет текст и изображения. Иконки
задаются через icon-image, а текст — через
text-field.
{
"type": "symbol",
"layout": {
"icon-image": "marker",
"text-field": ["get", "name"],
"text-offset": [0, 1.2],
"text-anchor": "top"
}
}
Порядок отрисовки управляется параметрами:
"icon-text-fit": "none"
или комбинированными режимами размещения.
Mapbox GL JS позволяет изменять визуальные свойства текста в зависимости от данных.
"text-color": [
"case",
[">", ["get", "population"], 1000000],
"#ff0000",
"#333333"
]
"text-opacity": [
"interpolate",
["linear"],
["zoom"],
5, 0.5,
10, 1
]
"text-halo-color": "#ffffff",
"text-halo-width": 2
Контур повышает читаемость текста на сложных подложках.
Рендеринг текста оптимизируется через SDF (Signed Distance Fields), что позволяет масштабировать шрифты без потери качества.
Ключевые аспекты производительности:
text-optional для второстепенных
подписейtext-max-widthminzoom и
maxzoom"minzoom": 5,
"maxzoom": 14
Mapbox GL JS использует систему приоритетов:
"symbol-sort-key": ["get", "rank"]
Чем выше значение сортировки, тем раньше размещается текст при конфликте с другими символами.
Разделение строк осуществляется через \n или expression
format:
"text-field": ["concat", ["get", "name"], "\n", ["get", "type"]]
или
"text-field": [
"format",
["get", "name"],
{},
"\n",
{},
["get", "type"]
]
Отображение текста контролируется через фильтры слоя:
"filter": ["has", "name"]
или через zoom-условия:
"layout": {
"visibility": "visible"
}
В сочетании с minzoom и maxzoom формируется
система масштабного появления подписей.
Визуальная иерархия достигается комбинацией:
Пример многоуровневой схемы:
"text-size": [
"interpolate",
["linear"],
["zoom"],
5, 10,
10, 16,
15, 22
],
"text-halo-width": 1.5,
"text-halo-color": "#ffffff"
При большом количестве объектов применяется стратегия упрощения:
cluster в GeoJSON sourcesource: {
type: "geojson",
cluster: true,
clusterMaxZoom: 10,
clusterRadius: 50
}
Параметры привязки к геометрии:
"text-pitch-alignment": "auto"
"text-rotation-alignment": "map"
map фиксирует текст относительно картыviewport фиксирует относительно экранаauto выбирает поведение автоматическиЭти настройки особенно важны при наклоне карты.
При использовании наклона и вращения карты текст адаптируется к перспективе. Используются дополнительные параметры:
"text-keep-upright": true,
"text-ignore-placement": false
Система предотвращает переворачивание текста и сохраняет читаемость в изометрических сценах.
В symbol layer существует приоритет между icon и text:
"layout": {
"text-optional": false,
"icon-optional": true
}
Если ресурсы размещения ограничены, система отдает предпочтение обязательным элементам.
Сложные подписи формируются через комбинацию данных, стилей и логики:
"text-field": [
"format",
["get", "name"],
{ "font-scale": 1.3, "text-color": "#000" },
"\n",
{},
["concat", "Pop: ", ["to-string", ["get", "population"]]],
{ "font-scale": 0.9, "text-color": "#666" }
]
Такой подход позволяет создавать многоуровневые информационные подписи внутри одного символа.
Зависимость текста от масштаба карты реализуется через:
"layout": {
"visibility": "visible",
"text-size": ["step", ["zoom"], 10, 5, 14, 10, 18]
}
Пороговая система step обеспечивает дискретное изменение
параметров при переходе между уровнями масштаба.