Строковые операции

Строковые операции в MapLibre GL JS реализуются через систему выражений (expressions), основанную на спецификации стилей Mapbox Style Specification. В отличие от классического JavaScript, обработка строк происходит декларативно внутри стиля карты и выполняется на стороне рендеринга, что обеспечивает предсказуемость и высокую производительность при работе с большими наборами геоданных.

Основное назначение строковых операций — формирование подписей объектов, динамическое создание текстовых меток, условное отображение текстов, а также преобразование атрибутов свойств объектов (feature properties) в человекочитаемый формат.

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

Любое строковое значение в выражениях может быть:

  • литералом "text"
  • значением свойства объекта через ["get", "property"]
  • результатом строковой функции (например, concat, upcase)

Ключевая особенность — отсутствие побочных эффектов и строгая типизация внутри expression runtime.

Извлечение строковых данных из feature properties

Основной источник строковых данных — свойства геообъектов:

{
  "type": "symbol",
  "source": "cities",
  "layout": {
    "text-field": ["get", "name"]
  }
}

Здесь name извлекается из properties каждого feature. Если значение отсутствует, результатом будет пустая строка или fallback-логика через coalesce.

Использование to-string обеспечивает приведение типов:

"text-field": ["to-string", ["get", "population"]]

Это важно при работе с числовыми или смешанными типами данных.

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

Операция объединения строк выполняется через concat, которая принимает произвольное количество аргументов.

"text-field": [
  "concat",
  ["get", "city"],
  ", ",
  ["get", "country"]
]

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

Типичные сценарии:

  • формирование адресов
  • объединение названий и категорий
  • динамические подписи объектов

Пример расширенного форматирования:

"text-field": [
  "concat",
  ["get", "name"],
  "\n",
  ["to-string", ["get", "population"]],
  " жителей"
]

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

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

MapLibre GL JS поддерживает функции изменения регистра строк:

  • upcase — перевод в верхний регистр
  • downcase — перевод в нижний регистр

Пример:

"text-field": ["upcase", ["get", "code"]]

Комбинирование с другими выражениями:

"text-field": [
  "concat",
  ["upcase", ["get", "region"]],
  " - ",
  ["get", "name"]
]

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

Условная логика и строковые ветвления

Для работы с условиями применяется case, позволяющий возвращать разные строковые значения в зависимости от условий.

"text-field": [
  "case",
  ["==", ["get", "type"], "capital"],
  "Столица",
  ["==", ["get", "type"], "city"],
  "Город",
  "Населённый пункт"
]

Такой подход заменяет традиционные условные конструкции и полностью выполняется внутри style engine.

Дополнительно используется match для сопоставления строк:

"text-field": [
  "match",
  ["get", "class"],
  "primary", "Основная дорога",
  "secondary", "Второстепенная дорога",
  "Дорога"
]

match особенно эффективен при классификации объектов по строковым категориям.

Работа с отсутствующими значениями

Строковые поля часто содержат пропуски. Для обработки используется coalesce, возвращающий первое непустое значение:

"text-field": [
  "coalesce",
  ["get", "name"],
  ["get", "alt_name"],
  "Без названия"
]

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

Форматирование чисел как строк

Хотя числа не являются строками, они часто включаются в текстовые выражения.

"text-field": [
  "concat",
  ["get", "name"],
  " (",
  ["to-string", ["get", "rank"]],
  ")"
]

В сложных случаях используется предварительная обработка:

  • округление значений через round
  • преобразование в строку через to-string

Шаблоны текстовых подписей

На практике строковые операции используются для создания шаблонов меток.

Однострочные подписи

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

Многострочные подписи

"text-field": [
  "concat",
  ["get", "name"],
  "\n",
  ["get", "description"]
]

Подписи с числовыми параметрами

"text-field": [
  "concat",
  ["get", "name"],
  "\nПлощадь: ",
  ["to-string", ["get", "area"]],
  " км²"
]

Локализация строковых значений

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

Подход заключается в хранении нескольких языковых полей:

{
  "name_en": "Almaty",
  "name_ru": "Алматы"
}

Выбор значения:

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

Или динамический выбор через условие:

"text-field": [
  "case",
  ["==", ["get", "lang"], "en"],
  ["get", "name_en"],
  ["get", "name_ru"]
]

Сравнение строк и фильтрация

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

"filter": ["==", ["get", "category"], "park"]

Частичные совпадения реализуются через match:

"filter": [
  "match",
  ["get", "type"],
  ["forest", "park", "garden"],
  true,
  false
]

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

Сложные выражения часто объединяют несколько операций:

"text-field": [
  "upcase",
  [
    "concat",
    ["get", "city"],
    ", ",
    ["coalesce", ["get", "country"], "UNKNOWN"]
  ]
]

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

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

Строковые выражения в MapLibre GL JS имеют ряд ограничений:

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

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

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

В прикладных сценариях строковые операции чаще всего применяются для:

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

Типичная архитектура стиля предполагает перенос всей логики форматирования строк в expression-слой, исключая необходимость постобработки данных перед передачей в карту.