В библиотеке Mapbox GL JS текстовые подписи отображаются при помощи
слоёв типа symbol. Внешний вид, содержимое и форматирование
текста задаются через свойства блока layout, среди которых
центральную роль играют:
text-field — определяет текст подписи;text-font — определяет используемый шрифт.Именно эти свойства позволяют отображать названия городов, улиц, объектов инфраструктуры, пользовательские метки и любую другую текстовую информацию на карте.
text-fieldСвойство text-field отвечает за содержимое текстовой
подписи.
Простейший пример:
map.addLayer({
id: 'cities',
type: 'symbol',
source: 'cities',
layout: {
'text-field': 'Город'
}
});
В данном случае каждая метка будет содержать одинаковый текст.
Чаще всего текст берётся из атрибутов объекта.
Предположим, GeoJSON содержит данные:
{
"type": "Feature",
"properties": {
"name": "Москва"
}
}
Тогда подпись можно вывести следующим образом:
layout: {
'text-field': ['get', 'name']
}
Полный пример:
map.addLayer({
id: 'city-labels',
type: 'symbol',
source: 'cities',
layout: {
'text-field': ['get', 'name']
}
});
Для каждого объекта будет отображаться значение свойства
name.
Ранее использовалась запись через фигурные скобки:
'text-field': '{name}'
Современный стиль основан на выражениях Mapbox Expressions:
'text-field': ['get', 'name']
Использование выражений считается предпочтительным, поскольку предоставляет гораздо больше возможностей по обработке данных.
Текст можно формировать из нескольких свойств объекта.
Исходные данные:
{
"name": "Москва",
"population": 13000000
}
Формирование подписи:
'text-field': [
'concat',
['get', 'name'],
' (',
['to-string', ['get', 'population']],
')'
]
Результат:
Москва (13000000)
Выражения позволяют динамически изменять подписи.
Например:
'text-field': [
'case',
['>', ['get', 'population'], 1000000],
'Мегаполис',
'Город'
]
Результат зависит от значения поля population.
Текст может содержать переносы строк.
Пример:
'text-field': [
'concat',
['get', 'name'],
'\n',
['get', 'country']
]
Отображение:
Москва
Россия
Многострочные подписи активно применяются при отображении:
formatОбычный текст отображается единым стилем. Для создания сложных
подписей используется выражение format.
Пример:
'text-field': [
'format',
['get', 'name'],
{
'font-scale': 1.3
},
'\n',
{},
['get', 'country'],
{
'font-scale': 0.8
}
]
Результат:
Через format можно задавать различные цвета внутри одной
подписи.
'text-field': [
'format',
'Температура: ',
{},
['get', 'temp'],
{
'text-color': '#ff0000'
}
]
Часть текста будет отображаться красным цветом.
text-fieldРазмер отдельных элементов регулируется параметром
font-scale.
Пример:
'text-field': [
'format',
'A',
{
'font-scale': 2
},
'BC',
{
'font-scale': 1
}
]
Буква A будет заметно крупнее остальных символов.
Перед выводом числовые значения рекомендуется преобразовывать в строки.
Пример:
'text-field': [
'to-string',
['get', 'population']
]
Без преобразования некоторые выражения могут работать некорректно.
Даты часто хранятся как строки.
Исходные данные:
{
"date": "2025-07-01"
}
Вывод:
'text-field': ['get', 'date']
Для более сложного форматирования обычно выполняют предварительную обработку данных на стороне приложения.
Если свойство может отсутствовать, используется оператор
coalesce.
'text-field': [
'coalesce',
['get', 'name'],
'Без названия'
]
Если поле name отсутствует, появится текст:
Без названия
Для многоязычных карт можно выбирать поле динамически.
Например:
'text-field': [
'get',
'name_ru'
]
или
'text-field': [
'get',
'name_en'
]
Также возможно переключение языка через программную логику приложения.
text-fontСвойство text-font определяет набор шрифтов для
отображения текста.
Простейший пример:
layout: {
'text-font': ['Open Sans Regular']
}
Даже если указывается один шрифт, значение записывается в виде массива.
'text-font': ['Open Sans Regular']
Это связано с механизмом резервных шрифтов.
Можно перечислить несколько вариантов:
'text-font': [
'Open Sans Regular',
'Arial Unicode MS Regular'
]
Если первый шрифт не содержит нужных символов, будет использован следующий.
Такой подход особенно важен для:
Наиболее распространённые варианты в стилях Mapbox:
'Open Sans Regular'
'Open Sans Bold'
'Open Sans Semibold'
'Arial Unicode MS Regular'
Пример:
'text-font': [
'Open Sans Bold',
'Arial Unicode MS Regular'
]
Создание слоя с жирным шрифтом:
map.addLayer({
id: 'capital-labels',
type: 'symbol',
source: 'capitals',
layout: {
'text-field': ['get', 'name'],
'text-font': [
'Open Sans Bold'
]
}
});
Все подписи слоя будут отображаться жирным начертанием.
Шрифт можно выбирать на основе атрибутов объекта.
Пример:
'text-font': [
'match',
['get', 'type'],
'capital',
['literal', ['Open Sans Bold']],
['literal', ['Open Sans Regular']]
]
Столицы будут выделяться более жирным шрифтом.
literalПри возврате массива внутри выражения применяется оператор
literal.
Пример:
[
'literal',
['Open Sans Bold']
]
Без него Mapbox попытается интерпретировать массив как выражение.
Шрифт должен присутствовать в наборе glyphs используемого стиля.
Если стиль не содержит необходимые ресурсы, текст может:
Поэтому выбор шрифтов всегда связан с настройками стиля карты.
Каждый дополнительный набор символов требует загрузки glyph-данных.
При большом количестве различных шрифтов:
Практикой считается использование ограниченного набора гарнитур.
text-field и text-fontЧаще всего оба свойства используются совместно.
Пример:
map.addLayer({
id: 'places',
type: 'symbol',
source: 'places',
layout: {
'text-field': [
'concat',
['get', 'name'],
'\n',
['get', 'category']
],
'text-font': [
'Open Sans Semibold',
'Arial Unicode MS Regular'
]
}
});
Результат:
GeoJSON:
{
"type": "Feature",
"properties": {
"name": "Bella Italia",
"rating": 4.8
}
}
Слой:
map.addLayer({
id: 'restaurants',
type: 'symbol',
source: 'restaurants',
layout: {
'text-field': [
'concat',
['get', 'name'],
'\n★ ',
['to-string', ['get', 'rating']]
],
'text-font': [
'Open Sans Bold',
'Arial Unicode MS Regular'
]
}
});
На карте появится:
Bella Italia
★ 4.8
map.addLayer({
id: 'cities',
type: 'symbol',
source: 'cities',
layout: {
'text-field': ['get', 'name'],
'text-font': [
'match',
['get', 'capital'],
true,
['literal', ['Open Sans Bold']],
['literal', ['Open Sans Regular']]
]
}
});
Столицы визуально отличаются от остальных населённых пунктов.
text-fontНеверно:
'text-font': 'Open Sans Regular'
Правильно:
'text-font': ['Open Sans Regular']
text-fieldНеверно:
'text-field': ['get', 'title']
Если поле отсутствует, подпись не появится.
Лучше использовать:
'text-field': [
'coalesce',
['get', 'title'],
'Нет данных'
]
Неверно:
'text-font': ['MyCustomFont']
Если шрифт отсутствует в glyph-ресурсах стиля, текст может отображаться некорректно.
Нежелательно:
'text-font': ['Open Sans Regular']
Предпочтительно:
'text-font': [
'Open Sans Regular',
'Arial Unicode MS Regular'
]
Это обеспечивает корректную работу с различными языками и наборами символов.
coalesce для защиты от отсутствующих
данных.format для сложных многоуровневых
подписей.to-string.text-field максимально близко к
структуре исходных данных, избегая чрезмерно сложных выражений.