Weight выражения

В MapLibre GL JS весовые выражения применяются в тех частях стиля, где требуется преобразовать числовые или категориальные данные в относительную значимость, влияющую на визуальное отображение объектов. Наиболее характерный случай — управление интенсивностью тепловых карт и влиянием отдельных точек на результирующий визуальный слой.

Вес (weight) в контексте MapLibre GL JS — это коэффициент, который усиливает или ослабляет вклад конкретного объекта в итоговое визуальное представление. В отличие от прямого отображения свойств (цвет, размер, прозрачность), вес не является визуальным параметром сам по себе. Он выступает промежуточным числом, влияющим на вычисление итоговой визуальной функции слоя.

В выражениях стиля вес задаётся через систему expression, где данные из источника преобразуются в число, обычно в диапазоне от 0 до 1 или с последующей нормализацией внутри слоя.

Heatmap-weight как основная форма весовых выражений

Наиболее распространённое использование веса реализовано в тепловых слоях через свойство heatmap-weight. Оно определяет, насколько сильно каждая точка данных влияет на окружающее пространство тепловой карты.

Типичное определение:

map.addLayer({
  id: 'heatmap-layer',
  type: 'heatmap',
  source: 'points',
  paint: {
    'heatmap-weight': [
      'interpolate',
      ['linear'],
      ['get', 'intensity'],
      0, 0,
      6, 1
    ]
  }
});

Здесь значение свойства intensity из данных преобразуется в нормализованный вес. При значении 0 вклад точки минимален, при 6 и выше — максимален.

Логика интерполяции веса

Выражение interpolate задаёт плавное преобразование исходного значения:

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

Фактически это функция:

weight = f(attribute_value)

где f — кусочно-линейное преобразование.

Использование step-выражений для дискретного веса

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

'heatmap-weight': [
  'step',
  ['get', 'mag'],
  0,
  3, 0.3,
  5, 0.7,
  8, 1
]

В этом случае вес меняется скачкообразно:

  • значения ниже 3 почти не влияют;
  • средние значения дают умеренный вклад;
  • высокие значения формируют пик интенсивности.

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

Влияние веса на итоговую визуализацию

В тепловых слоях вес напрямую участвует в вычислении плотности поля. Алгоритм агрегирует влияние всех точек, после чего формируется непрерывное распределение интенсивности.

Упрощённо процесс можно описать так:

  1. Каждая точка получает weight.
  2. Вес умножается на функцию расстояния до пикселя.
  3. Все вклады суммируются.
  4. Результат нормализуется и отображается через gradient.

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

Data-driven веса через свойства GeoJSON

Весовые выражения часто строятся на основе атрибутов объектов:

'heatmap-weight': [
  '*',
  ['get', 'count'],
  0.1
]

Здесь используется арифметическое выражение:

  • count задаёт исходную величину;
  • коэффициент масштабирует влияние.

Такая форма удобна для работы с агрегированными данными, где каждое значение уже отражает частоту событий.

Комбинирование веса с zoom-зависимостью

Вес может изменяться в зависимости от масштаба карты. Это позволяет усиливать или ослаблять влияние объектов при увеличении или уменьшении масштаба.

'heatmap-weight': [
  'interpolate',
  ['linear'],
  ['zoom'],
  0, 0.2,
  10, 0.6,
  15, 1
]

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

Взаимодействие веса с другими параметрами heatmap

Вес в тепловых слоях не работает изолированно. Он взаимодействует с:

  • heatmap-intensity — общий коэффициент усиления слоя;
  • heatmap-radius — радиус распространения влияния;
  • heatmap-color — интерпретация итоговой плотности;
  • heatmap-opacity — финальная визуальная прозрачность.

Фактически вес формирует базовое поле, которое затем масштабируется и окрашивается.

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

На практике часто встречаются некорректные конфигурации:

  1. Отсутствие нормализации данных Сырые значения (например, от 0 до 10000) без приведения к диапазону приводят к доминированию отдельных точек.

  2. Линейная модель для нелинейных данных В случаях экспоненциального распределения событий линейная интерполяция даёт искажённую картину.

  3. Игнорирование масштаба карты Постоянный вес без зависимости от zoom создаёт перегрузку на одних уровнях и пустоту на других.

  4. Смешение категориальных и числовых весов Использование строковых значений без явного преобразования в число приводит к некорректной оценке влияния.

Композиция выражений веса

Весовые выражения часто становятся частью более сложных логических конструкций:

'heatmap-weight': [
  'case',
  ['==', ['get', 'type'], 'event'], 1,
  ['==', ['get', 'type'], 'noise'], 0.3,
  0.1
]

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

Роль веса в производительности рендеринга

Хотя weight выражения не являются вычислительно тяжёлыми сами по себе, их влияние проявляется через итоговую плотность данных. Чем выше средний вес объектов, тем более насыщенным становится поле, что увеличивает нагрузку на:

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

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

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

Корректная шкала веса должна удовлетворять нескольким условиям:

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

Чаще всего используется нормализация к диапазону 0–1 или 0–10 с последующим масштабированием внутри выражения.

Взаимосвязь веса и плотности данных

Вес не заменяет плотность, но модифицирует её. Две области с одинаковым количеством точек могут выглядеть по-разному, если распределение веса отличается:

  • высокая плотность + низкий вес → слабая визуализация;
  • низкая плотность + высокий вес → выраженный пик.

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