setFilter — одно из ключевых действий (actions) в
подсистеме visState библиотеки Kepler.gl. Оно отвечает за
создание, обновление и синхронизацию фильтров, применяемых к слоям
данных.
Фильтры в Kepler.gl являются частью состояния Redux-подобной
архитектуры и влияют на отображение данных без изменения исходных
датасетов. setFilter работает как декларативный механизм:
вместо ручной манипуляции массивами данных задаётся конфигурация
фильтра, которую движок визуализации интерпретирует при рендеринге.
В типичной реализации действия из vis-state-actions
функция setFilter имеет следующую форму:
setFilter(filter)
или в более расширенном виде (внутри внутренних механизмов):
setFilter({
dataId,
id,
name,
type,
value,
domain,
step,
view,
speed,
enabled,
animationWindow
})
Фактически действие принимает объект фильтра и либо добавляет его в
список фильтров, либо обновляет существующий по id.
Фильтр в Kepler.gl представляет собой объект со строго определёнными полями, влияющими на поведение UI и вычисление подмножества данных.
dataId
string | string[]id
name
type
Тип фильтра:
range — числовой диапазонtimeRange — временной диапазонselect — выбор одного значенияmultiSelect — множественный выборФильтрация всегда опирается на две ключевые структуры:
domain
value
Пример:
domain: [0, 100],
value: [20, 80]
dispatch(
setFilter({
id: 'speed-filter',
dataId: 'trips',
name: 'Speed',
type: 'range',
value: [10, 50],
domain: [0, 120]
})
)
Такой фильтр ограничивает отображаемые объекты по числовому параметру, например скорости или высоте.
dispatch(
setFilter({
id: 'time-filter',
dataId: 'events',
name: 'Timestamp',
type: 'timeRange',
value: [1622505600000, 1625097600000],
domain: [1622505600000, 1630454400000]
})
)
Здесь значения задаются в формате Unix timestamp в миллисекундах. Такой фильтр активно используется при работе с потоками событий и маршрутами.
dispatch(
setFilter({
id: 'category-filter',
dataId: 'sales',
name: 'Category',
type: 'multiSelect',
value: ['electronics', 'furniture'],
domain: ['electronics', 'furniture', 'clothing', 'food']
})
)
Фильтр пропускает только выбранные категории, исключая остальные.
setFilter не только создаёт фильтр, но и обновляет уже
существующий при совпадении id.
Механизм работы:
visState.filtersКаждый фильтр может быть связан с одним или несколькими датасетами
через dataId.
dataId: ['dataset_1', 'dataset_2']
Это означает, что один и тот же фильтр применяется ко всем указанным источникам данных.
При рендеринге Kepler.gl:
Kepler.gl поддерживает стек фильтров. Несколько фильтров применяются последовательно:
Пример конфигурации:
[
{
id: 'filter-1',
type: 'range',
value: [0, 100]
},
{
id: 'filter-2',
type: 'multiSelect',
value: ['A', 'B']
}
]
Фильтры временного типа могут поддерживать анимацию через поле
animationWindow.
animationWindow: 'incremental'
или
animationWindow: 'continuous'
Поведение:
incremental — шаговое движение по временной шкалеcontinuous — плавное скольжение окна фильтраЭто используется для визуализации потоков данных и динамики событий.
При работе с setFilter в больших датасетах ключевым
фактором является стоимость пересчёта фильтров.
Особенности:
setFilter могут приводить к
перерасчёту всех слоёвРекомендуемые подходы:
value в реальном
времениstep)step определяет шаг изменения значения фильтра:
step: 1
Используется для:
dispatch(setFilter({
id: 'complex-filter',
dataId: 'shipments',
type: 'timeRange',
value: [start, end],
domain: [minTime, maxTime],
step: 3600000
}))
dispatch(setFilter({
id: 'speed-filter',
dataId: 'shipments',
type: 'range',
value: [5, 40],
domain: [0, 100]
}))
Такая комбинация позволяет одновременно ограничивать данные по времени и метрикам.
Часто используется в UI-логике:
function updateRange(min, max) {
dispatch(setFilter({
id: 'dynamic-filter',
dataId: 'points',
type: 'range',
value: [min, max]
}))
}
При каждом вызове фильтр пересчитывает отображаемые точки.
Если dataId не соответствует существующему датасету,
фильтр будет создан, но не окажет влияния на визуализацию.
range требует массив из двух чиселmultiSelect требует массив значенийselect требует одиночное значениеНесоответствие приводит к игнорированию фильтра или ошибкам вычисления.
Повторное создание фильтра с другим id вместо обновления
существующего приводит к накоплению дубликатов и увеличению нагрузки на
рендер.
На уровне исполнения:
setFilter диспатчит action в storevisState.filterssetFilter является центральным элементом интерактивной
фильтрации данных. Через него реализуются: