Временные шкалы

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

Внутри движка данные рассматриваются как набор объектов, где временные значения преобразуются в числовое представление (timestamp). Это обеспечивает унифицированную работу с различными источниками: CSV, GeoJSON, JSON, API-выгрузками.

Ключевой принцип обработки времени:

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

Форматы временных полей и их нормализация

Kepler.gl поддерживает несколько типов временных входных данных, однако все они в итоге приводятся к числовому виду.

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

  • ISO 8601: 2024-01-01T12:30:00Z
  • локальные даты: 2024-01-01 12:30:00
  • Unix timestamp: 1704112200
  • миллисекунды: 1704112200000

Процесс нормализации включает:

  1. Определение типа поля
  2. Парсинг через Date.parse или специализированные парсеры
  3. Приведение к миллисекундам
  4. Кэширование результата для ускорения рендера

Пример подготовки данных:

const data = [
  { lat: 50.45, lng: 30.52, time: '2024-01-01T10:00:00Z' },
  { lat: 50.46, lng: 30.53, time: '2024-01-01T11:00:00Z' }
];

После обработки:

time -> 1704103200000

Конфигурация временного фильтра (Time Filter)

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

Он задаётся через состояние слоя или глобальный фильтр:

const config = {
  filters: [
    {
      dataId: 'dataset',
      name: 'time',
      type: 'timeRange',
      value: [1704100000000, 1704200000000],
      animationWindow: 'free'
    }
  ]
};

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

  • value — диапазон времени
  • animationWindow — режим смещения окна
  • speed — скорость воспроизведения
  • step — дискретность шага

Типы окон анимации:

  • free — свободное движение окна
  • point — фиксированная точка времени
  • interval — фиксированный интервал

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


Временная анимация и playback-модель

Временная анимация реализует модель последовательного изменения глобального временного состояния.

Базовая логика:

  1. Устанавливается стартовое время
  2. Определяется шаг инкремента
  3. Обновляется состояние фильтра
  4. Пересчитывается видимость объектов

Псевдологика цикла:

function tick(state) {
  const nextTime = state.time + state.step;
  return {
    ...state,
    time: nextTime
  };
}

Анимация может быть:

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

Визуально объекты могут:

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

Временные слои и зависимость от времени

Каждый слой может использовать временное поле независимо, но чаще применяется общий временной фильтр.

Типы временных слоёв:

  • точечные данные с временной меткой
  • траектории (LineString с временными узлами)
  • агрегированные сетки с временной динамикой
  • heatmap с временным decay

Для траекторий используется интерполяция между точками:

A(t) = A0 + (A1 - A0) * α

где α зависит от текущего времени относительно сегмента.


Темпоральная агрегация данных

При работе с большими массивами данных применяется агрегация по временным бинам.

Основные методы:

  • фиксированные интервалы (1 минута, 1 час, 1 день)
  • динамическое биннинг-окно
  • скользящее среднее

Пример разбиения:

function bucket(time, interval) {
  return Math.floor(time / interval) * interval;
}

Это позволяет:

  • уменьшить количество отрисовываемых объектов
  • стабилизировать визуализацию при больших потоках данных
  • поддерживать интерактивность при миллионах точек

Работа с несколькими временными полями

Один датасет может содержать несколько временных измерений:

  • время создания
  • время обновления
  • время события
  • время завершения

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

Конфликты разрешаются через приоритет:

  1. активный фильтр слоя
  2. глобальный фильтр
  3. дефолтное поле датасета

Синхронизация временного состояния между слоями

Все временные слои синхронизируются через единое состояние приложения. Изменение времени в одном компоненте приводит к обновлению всех зависимых слоёв.

Модель состояния:

state = {
  animationConfig: {
    currentTime: 1704100000000,
    speed: 1,
    isAnimating: true
  }
};

Изменение currentTime триггерит перерасчёт фильтров и обновление GPU-буферов.


Производительность временной визуализации

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

1. Предобработка

  • конвертация дат при загрузке
  • кэширование timestamp

2. Фильтрация

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

3. Рендеринг

  • батчинг объектов
  • использование WebGL через deck.gl

4. Анимация

  • throttling обновлений
  • requestAnimationFrame вместо setInterval

Интерполяция и сглаживание временных переходов

Для повышения визуальной плавности используется интерполяция между состояниями.

Линейная интерполяция:

function lerp(a, b, t) {
  return a + (b - a) * t;
}

Применение:

  • плавное движение точек по траекториям
  • сглаживание heatmap-интенсивности
  • переходы между временными бинами

Временные окна и скользящие фильтры

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

Модель:

window = [t - Δ, t]

Где:

  • t — текущее время
  • Δ — ширина окна

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

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

Связь временной шкалы с геопространственными слоями

Временная шкала тесно интегрирована с геометрией:

  • изменение времени меняет видимые координаты траекторий
  • точки могут перемещаться по карте в зависимости от timestamp
  • плотность heatmap пересчитывается по временным срезам

Модель связывания:

(time, lat, lng) -> visual state

Это создаёт трёхмерное пространство анализа: широта, долгота, время.