Symbol-слой в MapLibre GL JS предназначен для отображения подписей, иконок и комбинированных маркеров на карте. Он является одним из наиболее функциональных и одновременно сложных типов слоёв, поскольку объединяет визуализацию растровых ресурсов (иконок) и текстового рендеринга с системой коллизий и приоритизации отображения.
Основная задача Symbol-слоя — представить точечные или линейные объекты в виде:
Symbol-слой работает с любым поддерживаемым источником данных MapLibre GL JS:
Каждый объект, поступающий в слой, интерпретируется как feature, содержащий геометрию и свойства (properties), которые могут использоваться для стилизации.
Пример логической структуры данных:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [37.6173, 55.7558]
},
"properties": {
"name": "Москва",
"population": 12000000
}
}
Symbol-слой отличается от других типов слоёв тем, что он работает не только с геометрией, но и с системой:
Каждый символ проходит этапы:
Layout отвечает за поведение символов, их форму и правила размещения.
Определяет текст подписи. Поддерживает выражения на основе свойств объекта:
"text-field": ["get", "name"]
Также возможно комбинирование строк:
"text-field": ["concat", ["get", "name"], " ", ["get", "type"]]
Определяет изображение иконки из sprite-атласа.
"icon-image": "airport-15"
Поддерживаются выражения:
"icon-image": ["get", "icon"]
Задаёт шрифт из загруженного набора glyphs.
"text-font": ["Open Sans Regular", "Arial Unicode MS Regular"]
Управляют масштабом текста и иконок.
"text-size": 14,
"icon-size": 1.2
Возможна интерполяция:
"text-size": ["interpolate", ["linear"], ["zoom"], 10, 12, 15, 18]
Определяет способ размещения символов:
point — в точке;line — вдоль линии;line-center — центр линии."symbol-placement": "point"
При размещении вдоль линий учитывается направление сегментов и кривизна геометрии.
Одной из ключевых особенностей Symbol-слоя является система предотвращения наложений.
Разрешают перекрытие символов:
"text-allow-overlap": false,
"icon-allow-overlap": false
При включении значений true символы игнорируют коллизии
и могут перекрывать друг друга.
Позволяют игнорировать уже размещённые элементы других слоёв:
"text-ignore-placement": true
Определяют приоритет отображения. При нехватке места менее важные символы могут скрываться.
Определяет точку привязки текста относительно геометрии:
centertopbottomleftrighttop-left)"text-anchor": "top"
Сдвигают символ относительно исходной точки:
"text-offset": [0, 1.5]
Ось X — горизонталь, Y — вертикаль (в единицах высоты текста).
Поворот символов:
"text-rotate": 45
При использовании symbol-placement: "line" текст
распределяется вдоль геометрии линии.
Ключевые параметры:
text-rotation-alignment — выравнивание относительно
линии;symbol-spacing — расстояние между повторяющимися
символами;text-pitch-alignment — поведение при наклоне
карты."text-rotation-alignment": "map",
"symbol-spacing": 250
Symbol-слой активно использует масштабирование карты.
Ограничивают видимость слоя:
"minzoom": 5,
"maxzoom": 18
Позволяют менять свойства в зависимости от масштаба:
"text-size": [
"interpolate",
["linear"],
["zoom"],
5, 10,
10, 14,
15, 20
]
Иконки в Symbol-слое не загружаются напрямую как изображения. Вместо этого используется sprite atlas.
Sprite содержит:
Пример добавления изображения:
map.addImage("custom-marker", image);
Использование:
"icon-image": "custom-marker"
Текст в Symbol-слое не отрисовывается стандартными шрифтами браузера. Вместо этого используются glyph ranges, загружаемые с сервера.
Параметр:
"glyphs": "https://fonts.example.com/{fontstack}/{range}.pbf"
Глифы позволяют:
Symbol-слой активно использует expression system.
"text-color": [
"case",
[">", ["get", "population"], 1000000],
"#ff0000",
"#000000"
]
"icon-image": [
"match",
["get", "type"],
"airport", "airport-icon",
"hospital", "hospital-icon",
"default-icon"
]
Symbol-слой является одним из наиболее ресурсоёмких.
Факторы влияния:
Оптимизационные подходы:
Symbol-слой поддерживает фильтрацию features:
"filter": ["==", ["get", "type"], "city"]
Фильтрация выполняется до стадии layout, что снижает нагрузку на рендеринг.
Частый сценарий — одновременное отображение иконки и подписи:
{
"type": "symbol",
"layout": {
"icon-image": "marker",
"text-field": ["get", "name"],
"text-offset": [0, 1.2],
"text-anchor": "top"
}
}
Такой подход используется для:
MapLibre GL JS использует систему приоритетов:
text-field длина;Символы в верхних слоях могут перекрывать нижние даже при конфликте коллизий.
Symbol-слой адаптируется к:
Параметры:
"text-pitch-alignment": "viewport",
"text-rotation-alignment": "map"
Symbol-слой формирует семантический уровень карты, отвечающий за читаемость и интерпретацию пространства. Он связывает географические данные с человеческим восприятием, превращая координаты в именованные и визуально различимые объекты.