В Kepler.gl система фильтрации построена вокруг декларативного
состояния visState, где каждый фильтр является независимым
объектом, но при этом участвует в общей логике отбора данных.
Комбинирование фильтров — ключевой механизм, позволяющий строить сложные
аналитические запросы к геоданным без изменения исходного датасета.
Каждый фильтр в Kepler.gl существует как элемент массива:
visState: {
filters: [
{ ...filterA },
{ ...filterB }
]
}
Комбинирование происходит не через ручные SQL-подобные выражения, а через систему пересечения условий, где итоговый набор данных формируется как результат последовательного применения всех активных фильтров.
По умолчанию используется логика:
FILTER_A ∩ FILTER_B ∩ FILTER_C
То есть данные должны удовлетворять всем условиям одновременно.
Фильтры в Kepler.gl делятся на несколько категорий:
Используются для числовых значений: температура, скорость, высота, стоимость.
{
name: "speed",
type: "range",
value: [10, 80]
}
При комбинировании нескольких range-фильтров происходит пересечение диапазонов по разным полям:
Позволяют ограничивать данные по временной шкале.
{
name: "timestamp",
type: "timeRange",
value: [1609459200000, 1640995200000]
}
При комбинации с другими фильтрами временной фильтр работает как дополнительное ограничение, не влияя на структуру других условий.
Используются для строковых значений: тип объекта, регион, статус.
{
name: "country",
type: "multiSelect",
value: ["KZ", "RU", "CN"]
}
Комбинация с числовыми фильтрами позволяет формировать гибридные условия:
Внутренне Kepler.gl применяет фильтры последовательно:
Это важно: порядок фильтров обычно не влияет на результат, но может влиять на производительность при больших данных.
Полный пример состояния:
const visState = {
filters: [
{
name: "speed",
type: "range",
value: [10, 100],
enabled: true
},
{
name: "timestamp",
type: "timeRange",
value: [1620000000000, 1630000000000],
enabled: true
},
{
name: "country",
type: "multiSelect",
value: ["KZ", "US"],
enabled: true
}
]
}
Итоговая выборка будет удовлетворять одновременно всем трём условиям.
Каждый фильтр имеет флаг:
enabled: true | false
Отключённые фильтры:
Это позволяет динамически переключать сценарии анализа без потери контекста.
Фильтры в Kepler.gl действуют глобально на dataset, но их эффект проявляется через слои.
Оба слоя используют один dataset, но:
Сильная сторона Kepler.gl — возможность объединять фильтры разных типов без дополнительных преобразований.
Пример логики:
Результат:
(vehicleType ∈ {truck, drone})
AND (altitude ∈ [200, 2000])
AND (timestamp ∈ [t1, t2])
Если комбинация фильтров приводит к пустому результату, Kepler.gl:
Это важно для интерактивного анализа, где пользователь может «пережать» условия.
При увеличении числа фильтров возрастает нагрузка на:
Оптимизации включают:
Фильтры можно динамически изменять через Redux action:
dispatch(
updateFilter({
id: 'speed-filter',
value: [20, 90]
})
);
Или добавлять новые:
dispatch(
addFilter({
name: 'temperature',
type: 'range',
value: [0, 30]
})
);
Комбинация формируется автоматически системой состояния.
UI Kepler.gl отображает фильтры как независимые панели, но все они
связаны с единым visState.
Особенности поведения:
Хотя Kepler.gl не использует явные вложенные логические выражения, их можно эмулировать:
Все фильтры активны:
A AND B AND C
Создаются разные слои с разными фильтрами:
И оба отображаются одновременно.
Временные фильтры могут работать в режиме step:
При комбинировании с range-фильтрами получается аналитика вида:
Конфликты возникают при:
Система обработки:
Абстрактно весь процесс можно представить так:
D_final = F1(D) ∩ F2(D) ∩ F3(D) ... ∩ Fn(D)
где:
При больших наборах данных (миллионы точек):
Это позволяет сохранять интерактивность даже при сложных комбинациях условий.
Каждое изменение:
триггерит перерасчёт pipeline:
updateFilter → recomputeVisState → updateLayers → rerender
Комбинация фильтров при этом всегда пересчитывается целиком, но с оптимизациями мемоизации.