Работа с временными данными в Kepler.gl строится вокруг концепции временного измерения в датасете и системы фильтров, которые интерпретируют числовые или временные поля как шкалу для отсечения и анимации объектов на карте. Временной диапазон влияет не только на визуальную фильтрацию, но и на поведение слоёв, синхронизацию анимации и вычисление агрегированных значений.
Ключевой момент заключается в том, что временное поле должно быть
корректно распознано библиотекой как timestamp или числовой
диапазон, иначе управление диапазоном становится недоступным на уровне
UI и конфигурации.
Kepler.gl не выполняет сложный парсинг дат по умолчанию, поэтому корректная подготовка данных определяет точность всей временной визуализации.
Поддерживаются два основных формата:
Пример структуры записи:
const data = [
{
id: 1,
lat: 40.7128,
lng: -74.0060,
timestamp: 1697040000000
},
{
id: 2,
lat: 40.7138,
lng: -74.0010,
timestamp: 1697043600000
}
];
При работе с CSV или GeoJSON важно обеспечить единообразие временного поля, иначе фильтрация будет работать некорректно или частично.
После загрузки данных Kepler.gl необходимо явно указать, какое поле будет использоваться как временное. Это происходит через конфигурацию слоя или автоматически через UI, но в программной настройке предпочтителен явный подход.
Пример слоя:
const layer = {
id: 'points',
type: 'point',
config: {
dataId: 'my_dataset',
columns: {
lat: 'lat',
lng: 'lng',
altitude: null
}
}
};
Временное поле не указывается напрямую в слое, оно определяется через фильтры, что является ключевым архитектурным решением Kepler.gl.
Временной диапазон реализуется через объект filters
внутри состояния Kepler.gl. Каждый фильтр описывает диапазон значений,
тип интерполяции и привязку к конкретному полю данных.
Основная структура временного фильтра:
const filter = {
id: 'time_filter',
dataId: ['my_dataset'],
name: 'timestamp',
type: 'timeRange',
value: [1697040000000, 1697047200000],
enlarged: true,
plotType: 'histogram',
animationWindow: 'free'
};
timeRange)Kepler.gl построен на Redux-архитектуре, поэтому изменение временного диапазона выполняется через dispatch действий.
Наиболее важное действие:
import { addFilter, setFilter } from 'kepler.gl/actions';
Добавление временного фильтра:
dispatch(addFilter({
dataId: 'my_dataset',
name: 'timestamp',
type: 'timeRange',
value: [1697040000000, 1697047200000]
}));
Изменение диапазона:
dispatch(setFilter('time_filter', {
value: [1697043600000, 1697049000000]
}));
Обновление фильтра напрямую влияет на все слои, привязанные к соответствующему dataset.
Kepler.gl поддерживает временную анимацию через механизм “playback”, который последовательно сдвигает окно фильтра по шкале времени.
Основные параметры анимации:
full или free)Пример конфигурации:
const filter = {
id: 'time_filter',
type: 'timeRange',
name: 'timestamp',
value: [1697040000000, 1697040000000 + 3600000],
animationWindow: 'incremental',
speed: 1
};
animationWindow: 'incremental' — окно движется вместе с
временемanimationWindow: 'full' — фиксированный диапазон,
меняется только позиция указателяКаждый слой Kepler.gl пересчитывается при изменении фильтра. Это означает, что временной диапазон фактически влияет на геометрическое состояние слоя.
Особенно это заметно в слоях:
При изменении времени происходит:
Kepler.gl поддерживает несколько фильтров одновременно, включая разные временные оси для одного или нескольких датасетов.
Пример:
const filters = [
{
id: 'time_filter_1',
dataId: ['dataset_1'],
name: 'timestamp',
type: 'timeRange',
value: [1697040000000, 1697043600000]
},
{
id: 'time_filter_2',
dataId: ['dataset_2'],
name: 'event_time',
type: 'timeRange',
value: [1697030000000, 1697050000000]
}
];
Такой подход позволяет синхронизировать разные источники данных по независимым временным шкалам.
Некорректная работа временной фильтрации чаще всего связана с:
Особенно критична ошибка, когда timestamp передаётся в секундах, тогда как Kepler.gl ожидает миллисекунды, что приводит к визуально «пустой» карте.
Изменение временного диапазона является триггером полной переработки слоя, поэтому при больших датасетах важно учитывать нагрузку.
Основные факторы влияния:
Оптимизация достигается через:
Kepler.gl можно интегрировать с внешним UI или приложением, где временной диапазон управляется отдельно от карты.
Типичный сценарий:
function updateTimeRange(start, end) {
dispatch(setFilter('time_filter', {
value: [start, end]
}));
}
Это позволяет связывать карту с таймлайнами, слайдерами или аналитическими панелями, сохраняя единый источник времени для всей системы визуализации.