Строковые функции

Внутри системы стилей Mapbox используется выраженийная модель, где строки обрабатываются через набор функций выражений. Эти функции применяются в слоях, фильтрах, свойствах layout и paint, обеспечивая динамическую генерацию текста, условную логику и преобразование данных без необходимости внешней обработки.

Строковые операции в выражениях не являются функциями JavaScript — они выполняются внутри движка стилей и имеют собственный синтаксис, строго типизированную модель и ограничения по контексту применения.


Общие принципы строковых выражений

Строки в выражениях Mapbox GL JS рассматриваются как неизменяемые значения. Любая операция возвращает новый результат без модификации исходного значения.

Ключевые особенности:

  • все функции выражений принимают строго типизированные аргументы
  • типизация проверяется на этапе применения стиля
  • строковые операции часто комбинируются с логическими и числовыми выражениями
  • результат всегда детерминирован для каждого фич-атрибута

Пример базового выражения:

"text-field": ["get", "name"]

Здесь значение берётся напрямую из свойства объекта данных.


Приведение типов к строке

Перед использованием строковых функций часто требуется явное приведение типов:

["to-string", ["get", "id"]]

Это необходимо, когда данные приходят в числовом или булевом виде, но используются в текстовых полях.

Типичные случаи:

  • идентификаторы объектов
  • числовые коды
  • логические флаги

Конкатенация строк

Функция concat объединяет несколько строк в одну.

["concat", ["get", "city"], ", ", ["get", "country"]]

Результат формируется последовательно, без разделителей по умолчанию.

Особенности:

  • принимает любое количество аргументов
  • автоматически приводит значения к строкам
  • не добавляет пробелы автоматически

Пример формирования подписи:

"text-field": [
  "concat",
  ["get", "name"],
  " — ",
  ["get", "type"]
]

Преобразование регистра

Приведение к верхнему регистру

["upcase", ["get", "name"]]

Используется для:

  • заголовков
  • акцентирования объектов на карте
  • унификации данных

Приведение к нижнему регистру

["downcase", ["get", "ISO_CODE"]]

Применяется для:

  • нормализации данных
  • сравнений в условиях match
  • унификации фильтров

Длина строки

Функция length возвращает количество символов:

["length", ["get", "name"]]

Используется для:

  • ограничения отображаемого текста
  • условной стилизации
  • проверки заполненности атрибутов

Пример условного окрашивания:

"circle-color": [
  "case",
  [">", ["length", ["get", "name"]], 10],
  "#ff0000",
  "#00ff00"
]

Извлечение подстрок

Функция slice позволяет извлекать часть строки.

["slice", ["get", "code"], 0, 3]

Параметры:

  • исходная строка
  • начальный индекс
  • конечный индекс (не включается)

Применение:

  • сокращение кодов стран
  • отображение префиксов
  • форматирование идентификаторов

Пример:

"text-field": [
  "concat",
  ["slice", ["get", "postcode"], 0, 2],
  "-"
]

Поиск и сопоставление строк

Хотя полноценного indexOf как в JavaScript нет, логика поиска реализуется через выражения match, in, ==.

Пример проверки значения:

["==", ["get", "type"], "restaurant"]

Пример условного сопоставления:

[
  "match",
  ["get", "category"],
  "park", "#00ff00",
  "water", "#0000ff",
  "#cccccc"
]

Форматирование текста через format expression

Более современный способ построения строк — выражение format, позволяющее задавать стили для отдельных частей текста.

"text-field": [
  "format",
  ["get", "name"],
  {},
  "\n",
  ["get", "description"],
  { "font-scale": 0.8, "text-color": "#888" }
]

Возможности:

  • разный стиль для частей строки
  • переносы строк
  • смешивание динамических и статических частей

Это основной инструмент для сложных подписей на карте.


Комбинирование строковых функций

Строковые функции часто используются совместно:

"text-field": [
  "concat",
  ["upcase", ["slice", ["get", "code"], 0, 2]],
  " - ",
  ["downcase", ["get", "name"]]
]

Такие конструкции позволяют:

  • нормализовать данные
  • создавать компактные метки
  • объединять несколько источников данных

Использование в фильтрах слоёв

Строковые функции применяются не только в отображении, но и в фильтрации:

"filter": [
  "==",
  ["downcase", ["get", "type"]],
  "hospital"
]

Или более сложный вариант:

"filter": [
  "in",
  "city",
  ["downcase", ["get", "region"]]
]

Ограничения строковых функций

Строковая система выражений имеет ряд ограничений:

  • отсутствует полноценная регулярная обработка
  • нет пользовательских функций
  • нет мутаций строк
  • строгая типизация без неявных преобразований в большинстве случаев
  • ограниченная работа с Unicode-спецификой в некоторых окружениях

Производственные паттерны

Нормализация данных

["downcase", ["to-string", ["get", "status"]]]

Используется для унификации входящих данных перед сравнением.


Безопасное отображение

[
  "coalesce",
  ["get", "name"],
  "Unknown"
]

Применяется для защиты от пустых значений.


Сокращённые подписи

[
  "concat",
  ["slice", ["get", "name"], 0, 12],
  "..."
]

Типичные ошибки при работе со строками

  • передача чисел без to-string в concat
  • попытка использовать JavaScript-методы (.toUpperCase(), .slice()) внутри выражений
  • отсутствие проверки на null в данных
  • некорректный порядок аргументов в slice
  • избыточная вложенность выражений, ухудшающая читаемость стиля

Оптимизация строковых выражений

При большом количестве объектов на карте важны:

  • минимизация вложенности выражений
  • избегание повторных вычислений одних и тех же преобразований
  • использование предобработанных атрибутов в источнике данных
  • предпочтение простых выражений вместо цепочек функций

Контекст использования в стилях

Строковые функции активно применяются в:

  • подписях (text-field)
  • условной стилизации (case, match)
  • фильтрации слоёв
  • генерации динамических идентификаторов
  • визуализации метаданных объектов

Именно строковые операции формируют основу текстовой логики в стилях картографической визуализации, обеспечивая гибкую работу с атрибутивными данными без внешней обработки.