Кластеризация и агрегация

Базовые принципы пространственной агрегации

Работа с большими наборами геоданных требует перехода от отображения отдельных точек к их обобщению. При росте плотности объектов визуализация теряет читаемость, а производительность падает. Кластеризация и агрегация решают эту проблему за счёт объединения точек в вычисляемые структуры.

В геовизуализации выделяются два основных подхода:

  • Кластеризация (clustering) — объединение близко расположенных точек в группы по расстоянию или плотности
  • Агрегация (aggregation) — вычисление статистик по пространственным ячейкам (сумма, среднее, количество, максимум)

В Kepler.gl оба подхода реализованы на уровне GPU через deck.gl-слой, что обеспечивает обработку миллионов объектов без деградации интерфейса.


Архитектура агрегации в Kepler.gl

Внутри Kepler.gl агрегация построена на слоях deck.gl:

  • PointLayer — базовый слой точек
  • ClusterLayer — плотностная кластеризация
  • HexagonLayer — гексагональная агрегация (H3)
  • GridLayer — прямоугольная сеточная агрегация

Каждый слой работает поверх WebGL и выполняет вычисления на GPU, минимизируя нагрузку на CPU.

Ключевая особенность: агрегация происходит не на стороне сервера, а в браузере.


Кластеризация точек (ClusterLayer)

Кластеризация объединяет точки на основе расстояния в пикселях или координатах.

Основные параметры:

  • радиус кластеризации
  • минимальное количество точек в кластере
  • стратегия объединения (сумма, среднее, центроид)

Принцип работы:

  1. Все точки проецируются в экранное пространство
  2. Алгоритм группирует точки в пределах заданного радиуса
  3. Для каждой группы вычисляется агрегированное значение

Пример конфигурации слоя:

const clusterLayer = new ClusterLayer({
  id: 'cluster-layer',
  data: dataset,
  radius: 60,
  maxZoom: 16,
  getPosition: d => [d.lng, d.lat],
  aggregation: 'average',
  getWeight: d => d.value
});

Кластеризация полезна при анализе:

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

Гексагональная агрегация (HexagonLayer и H3)

Гексагональная агрегация является одним из ключевых инструментов Kepler.gl. Она основана на системе индексации H3, разработанной для равномерного разбиения поверхности Земли на шестиугольные ячейки.

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

Формально агрегация может быть представлена как:

A_i = _{j H_i} w_j

где:

  • ( H_i ) — множество точек внутри i-й гексагональной ячейки
  • ( w_j ) — вес точки
  • ( A_i ) — агрегированное значение ячейки

Пример использования HexagonLayer:

const hexLayer = new HexagonLayer({
  id: 'hex-layer',
  data,
  radius: 1000,
  elevationScale: 50,
  getPosition: d => [d.lng, d.lat],
  getElevationWeight: d => d.value,
  getColorWeight: d => d.value,
  colorRange: [
    [255, 255, 204],
    [199, 233, 180],
    [127, 205, 187],
    [65, 182, 196],
    [29, 145, 192],
    [34, 94, 168],
    [12, 44, 132]
  ]
});

Гексагональная агрегация используется для:

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

Сеточная агрегация (GridLayer)

GridLayer использует прямоугольную сетку вместо шестиугольников. Пространство делится на равные клетки, каждая из которых агрегирует попавшие в неё точки.

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

  • быстрее в вычислении, чем hex-агрегация
  • менее точная геометрическая модель
  • хорошо подходит для грубого анализа

Пример:

const gridLayer = new GridLayer({
  id: 'grid-layer',
  data,
  cellSize: 500,
  getPosition: d => [d.lng, d.lat],
  getWeight: d => d.value
});

Типы агрегации значений

Kepler.gl поддерживает несколько функций агрегации:

  • sum — сумма значений
  • average — среднее значение
  • min / max — минимальное и максимальное значение
  • count — количество точек

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


GPU-ускорение и производительность

Основное преимущество архитектуры Kepler.gl заключается в использовании GPU-вычислений через deck.gl.

Это даёт следующие свойства:

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

При агрегации:

  1. данные передаются в буферы WebGL
  2. вычисления выполняются вершинными/фрагментными шейдерами
  3. результат визуализируется как слой

Масштабирование агрегации по зуму

Агрегация в Kepler.gl динамически зависит от масштаба карты.

На высоком уровне zoom:

  • видны отдельные точки
  • кластеризация минимальна

На низком уровне zoom:

  • активируется hex/grid агрегация
  • увеличивается размер ячеек
  • уменьшается детализация

Это поведение позволяет сохранять баланс между детализацией и читаемостью.


Взвешенная агрегация

В реальных сценариях каждая точка может иметь вес:

  • количество пользователей
  • интенсивность события
  • финансовые показатели

Взвешенная агрегация вычисляется как:

{x} =

где:

  • ( x_i ) — значение
  • ( w_i ) — вес
  • ( {x} ) — взвешенное среднее

В Kepler.gl это реализуется через getWeight и соответствующие агрегаторы слоя.


Иерархическая агрегация и уровень детализации

Агрегация может строиться как иерархия:

  • глобальный уровень (континенты)
  • региональный уровень (страны)
  • локальный уровень (города)
  • микроуровень (улицы и точки)

H3-система позволяет естественно реализовать такую структуру за счёт разных resolution уровней.


Кластеризация vs Hex-агрегация

Сравнение подходов:

  • Кластеризация

    • зависит от расстояния в пикселях
    • адаптивна к экрану
    • подходит для интерактивных сценариев
  • Hex-агрегация

    • фиксированная пространственная сетка
    • стабильна при масштабировании
    • подходит для аналитики и отчётов

Практические сценарии применения

Кластеризация и агрегация применяются в задачах:

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

Комбинирование слоёв

Kepler.gl позволяет накладывать несколько типов агрегации одновременно:

  • hex-layer для глобального распределения
  • cluster-layer для локальных всплесков
  • point-layer для точечных аномалий

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