Фильтры в Kepler.gl являются частью состояния приложения и позволяют динамически ограничивать отображаемые данные на карте без изменения исходного датасета. Механизм построен поверх Redux-состояния и тесно связан с конфигурацией слоёв, интерактивной панелью и системой временных шкал.
Каждый фильтр описывает правило отбора строк из таблицы данных на основе значений одного или нескольких полей. Фильтрация выполняется на уровне вычисляемых данных слоя, что обеспечивает синхронное обновление визуализации.
Фильтры хранятся в разделе visState.filters:
visState: {
filters: [
{
id: 'filter_1',
dataId: ['dataset_1'],
name: 'speed',
type: 'range',
value: [10, 100],
animationWindow: 'free',
enabled: true
}
]
}
Каждый объект фильтра содержит набор обязательных и опциональных полей:
Kepler.gl поддерживает несколько базовых типов фильтрации данных.
Используется для числовых значений, ограничивая данные по минимальному и максимальному диапазону.
{
id: 'speed_filter',
dataId: ['trips'],
name: 'speed',
type: 'range',
value: [20, 80],
min: 0,
max: 120
}
Диапазонный фильтр активно применяется для:
Позволяет выбирать набор допустимых значений из дискретного множества.
{
id: 'category_filter',
dataId: ['points'],
name: 'type',
type: 'multiSelect',
value: ['bus', 'train']
}
Применяется для:
Специальный тип фильтра, работающий с временными данными. Поддерживает анимацию и интервал времени.
{
id: 'time_filter',
dataId: ['events'],
name: 'timestamp',
type: 'timeRange',
value: [1609459200000, 1612137600000],
timeConfig: {
mode: 'interval',
speed: 1
}
}
Особенности:
Фильтр не действует глобально, а применяется к конкретным датасетам
через dataId. Один фильтр может одновременно воздействовать
на несколько источников данных.
dataId: ['dataset_a', 'dataset_b']
При вычислении слоя Kepler.gl пересчитывает только те строки, которые принадлежат указанным наборам данных.
Фильтрация выполняется в несколько этапов:
visStateЛогика предикатов зависит от типа фильтра:
min <= value <= maxdispatch(addFilter({
dataId: 'trips',
name: 'speed',
type: 'range'
}));
Создаётся новый фильтр с дефолтными значениями, определёнными типом поля.
dispatch(updateFilter({
id: 'filter_1',
value: [30, 90]
}));
Обновление может затрагивать:
dispatch(removeFilter('filter_1'));
Удаление полностью исключает фильтр из состояния и пересчитывает связанные слои.
Kepler.gl способен автоматически генерировать фильтры при загрузке датасета. Алгоритм анализирует типы полей:
Пример структуры автофильтра:
{
name: 'timestamp',
type: 'timeRange',
domain: [start, end],
value: [start, end]
}
Фильтры отображаются в панели управления и синхронизируются с интерактивными элементами:
Изменения UI немедленно диспатчат соответствующие Redux actions, обновляя состояние визуализации.
Фильтры могут применяться как глобально, так и на уровне конкретных слоёв.
Слой может:
Пример логики:
layer.config.filterByLayer = true
layer.config.filterList = ['speed_filter']
Временные фильтры тесно связаны с системой анимации Kepler.gl.
Ключевые параметры:
Режимы окна:
point — одиночная временная точкаinterval — интервал времениcontinuous — непрерывное движение окнаФильтрация оптимизирована через:
При больших датасетах ключевым фактором становится количество активных фильтров и их тип.
При наличии нескольких фильтров применяется логическое пересечение условий.
Формально:
result = filter1 AND filter2 AND filter3
Каждый дополнительный фильтр уменьшает пространство отображаемых данных, что влияет на плотность визуализации и производительность рендера.
При создании Kepler.gl instance фильтры могут быть переданы через initial state:
const initialState = {
visState: {
filters: [
{
name: 'speed',
type: 'range',
value: [0, 50]
}
]
}
};
Это позволяет заранее подготовить сцену визуализации с заданными ограничениями данных.
Фильтры могут быть расширены через кастомные плагины:
Кастомный фильтр реализует интерфейс:
filterType: {
name: 'customFilter',
getValue: (data, field) => {},
apply: (rows, value) => {}
}