В Mapbox GL JS визуальная структура карты формируется через стиль
(style specification), где каждый слой определяет отдельный уровень
отображения данных. Текстовые элементы, включая подписи объектов,
дороги, POI и административные области, реализуются через
symbol layer, в котором ключевую роль играет параметр
text-field.
Основная концепция организации подписей заключается в том, что карта представляет собой многослойную композицию, где порядок слоёв напрямую влияет на визуальную иерархию «заголовков» карты — от крупных региональных подписей до локальных объектов.
Ключевые элементы этой системы:
Именно комбинация этих компонентов формирует структуру заголовков на карте.
Каждый слой в стиле Mapbox GL JS располагается в строго определённом порядке. Слои, добавленные позже, визуально перекрывают предыдущие. Это создаёт естественную иерархию:
Пример добавления слоя с подписью:
map.addLayer({
id: 'city-labels',
type: 'symbol',
source: 'composite',
'source-layer': 'place_label',
layout: {
'text-field': ['get', 'name_en'],
'text-size': 16
},
paint: {
'text-color': '#333'
}
});
Иерархия формируется не только порядком слоёв, но и параметрами масштаба и фильтрации.
Параметр text-field определяет содержимое подписи и
является центральным элементом всей системы текстовой иерархии.
Он поддерживает выражения Mapbox Expression Syntax:
'text-field': ['concat', ['get', 'name'], ' ', ['get', 'name_en']]
Основные способы формирования:
['get', 'name'])concat)case, match)Иерархия внутри одной подписи создаётся за счёт комбинирования нескольких атрибутов:
Пример:
'text-field': [
'format',
['get', 'name'],
{},
'\n',
{},
['get', 'country'],
{ 'font-scale': 0.8 }
]
Такой подход создаёт визуальную структуру внутри одного label, фактически формируя «внутренний заголовок».
Один из ключевых механизмов иерархии — изменение текста в зависимости от масштаба карты.
'text-size': [
'interpolate',
['linear'],
['zoom'],
5, 10,
10, 16,
15, 22
]
Это создаёт логическую структуру:
Таким образом, «заголовки» карты динамически перестраиваются.
Mapbox GL JS использует систему collision detection для предотвращения наложения текстов.
Основные параметры:
text-allow-overlaptext-ignore-placementtext-optionalsymbol-sort-key'symbol-sort-key': ['get', 'rank']
Чем выше значение rank, тем выше приоритет
отображения.
Пример логики:
Структура заголовков зависит не только от порядка слоёв, но и от ориентации текста относительно карты.
text-rotation-alignmenttext-keep-uprighttext-transformtext-anchorПример:
'text-rotation-alignment': 'map',
'text-keep-upright': true
Это делает подписи согласованными с направлением карты, что особенно
важно при изменении bearing.
Параметр bearing определяет поворот карты, что влияет на
восприятие заголовков.
map.setBearing(45);
Изменение heading приводит к:
В сочетании с:
text-keep-uprighticon-rotation-alignmentформируется стабильная или динамическая структура подписей.
Иерархия может быть явно задана через фильтрацию данных.
filter: ['==', ['get', 'type'], 'city']
или более сложные условия:
filter: [
'all',
['>=', ['get', 'population'], 100000],
['==', ['get', 'class'], 'urban']
]
Таким образом создаются отдельные уровни:
Каждый уровень соответствует своей «категории заголовков».
Mapbox GL JS позволяет формировать сложные текстовые композиции, имитирующие иерархические заголовки.
'text-field': [
'format',
['get', 'name'],
{ 'font-scale': 1.2, 'text-font': ['literal', ['DIN Bold']] },
'\n',
{},
['get', 'region'],
{ 'font-scale': 0.9 }
]
В результате создаётся структура:
Плотность текстовых элементов регулируется через:
minzoom / maxzoomtext-max-widthtext-paddingtext-allow-overlapПример ограничения:
minzoom: 8,
maxzoom: 14
Это позволяет разделить уровни отображения:
Структура заголовков зависит от источника данных
(source-layer), который определяет тип географических
объектов.
Типичная структура:
place_label → города, страныroad_label → дорогиpoi_label → точки интереса'source-layer': 'place_label'
Каждый слой имеет собственную внутреннюю иерархию, которая накладывается на глобальный порядок слоёв карты.
При изменении параметров карты:
Mapbox GL JS пересчитывает размещение подписей в реальном времени.
Особенно важны:
pitch-alignmentrotation-alignmenttext-translateПример:
'text-pitch-alignment': 'map',
'text-rotation-alignment': 'viewport'
Это влияет на то, как «заголовки» ведут себя в 3D-представлении карты.
Полная структура заголовков формируется одновременно на трёх уровнях:
Именно пересечение этих уровней создаёт итоговую структуру текстовой карты, где каждый заголовок занимает строго определённое место в общей композиции.