В Kepler.gl категориальные фильтры используются для работы с дискретными наборами значений в столбцах данных, где каждое значение представляет собой отдельную категорию без внутренней числовой шкалы. Это могут быть страны, типы объектов, статусы, названия регионов, классы событий или любые строковые метки, которые не поддаются агрегированию как числовые диапазоны.
Категориальная фильтрация в Kepler.gl встроена в систему фильтров
слоя и описывается через конфигурационный объект фильтра, который
применяется к конкретному набору данных (dataId) и полю
таблицы.
Основная задача категориального фильтра — включать или исключать элементы набора данных на основе выбранных значений списка категорий, формируя подмножество данных, передаваемое дальше в визуализационный pipeline deck.gl.
Каждый фильтр в Kepler.gl хранится как объект внутри массива
filters в конфигурации состояния приложения. Для
категориальной фильтрации используется тип categorical.
Типовая структура:
{
dataId: ['dataset_1'],
id: 'filter_1',
name: 'country',
type: 'categorical',
column: {
name: 'country',
fieldIdx: 3
},
value: ['Kazakhstan', 'Russia'],
enlarged: true
}
Ключевые элементы:
Категориальный фильтр выполняет операцию проверки принадлежности значения поля к списку разрешённых значений. На уровне логики это эквивалентно операции:
value ∈ selectedCategories
Если значение строки из датасета содержится в массиве
value, объект проходит фильтрацию и попадает в
результирующий слой визуализации.
В противном случае запись исключается до этапа рендеринга.
Kepler.gl поверхностно опирается на механизм фильтрации deck.gl через
DataFilterExtension. Однако категориальная фильтрация
реализуется на уровне Kepler.gl перед передачей данных в слой.
В отличие от числовых фильтров (range filters), которые используют GPU-ускорение через shader-based filtering, категориальные фильтры чаще применяются как CPU-based предобработка.
Поток обработки выглядит следующим образом:
Категориальные фильтры поддерживают несколько режимов поведения интерфейса, которые отражаются в конфигурации:
Наиболее распространённый режим, при котором пользователь может выбрать несколько категорий одновременно.
value: ['A', 'B', 'C']
Логика:
value IN ['A', 'B', 'C']
Этот режим используется для анализа распределения объектов по группам.
В некоторых конфигурациях фильтр ограничивается одной категорией:
value: ['A']
Используется для жёсткой сегментации данных.
Перед отображением фильтра Kepler.gl формирует список всех возможных категорий, присутствующих в столбце данных. Этот список называется domain.
Пример:
domain: ['Kazakhstan', 'Russia', 'China', 'USA']
Домен используется для:
При изменении датасета domain пересчитывается автоматически.
В интерфейсе Kepler.gl категориальный фильтр представлен как список чекбоксов. Каждое значение domain отображается как отдельный элемент управления.
Поведенческие особенности:
valuevalue может означать отсутствие фильтрации или
исключение всех объектов (в зависимости от конфигурации)UI синхронизирован с глобальным состоянием Redux, где хранится конфигурация всех фильтров.
В архитектуре Kepler.gl фильтры являются частью глобального состояния
visState.
Упрощённая структура:
visState: {
filters: [
{
id: 'filter_1',
type: 'categorical',
value: ['A', 'B']
}
]
}
Изменения фильтра происходят через actions:
addFilterupdateFilterremoveFilterПример обновления:
dispatch(updateFilter({
id: 'filter_1',
value: ['Kazakhstan', 'USA']
}));
После обновления состояния автоматически пересчитываются слои и данные.
Категориальные фильтры работают со строковыми значениями, но требуют нормализации данных.
Проблемные случаи:
USA vs usa)"Kazakhstan " vs
"Kazakhstan")Для стабильной работы обычно выполняется предобработка:
value = String(value).trim().toLowerCase()
И аналогичная нормализация domain и filter values.
Хотя категориальные фильтры не используют GPU-ускорение напрямую, их производительность зависит от:
Основные узкие места:
Оптимизации:
Для ускорения операций Kepler.gl может использовать индекс категорий:
{
'Kazakhstan': [0, 5, 9],
'USA': [1, 2, 7]
}
Тогда фильтрация сводится к объединению индексов выбранных категорий вместо полного перебора данных.
Это особенно эффективно при больших наборах данных с повторяющимися значениями.
Категориальные фильтры применяются ко всем слоям, которые используют
соответствующий dataId.
Это означает:
Примеры слоёв:
Все они получают уже отфильтрованный набор данных.
Категориальные фильтры часто используются совместно с:
Комбинированная логика строится как пересечение множеств:
Result = Categorical ∩ Range ∩ Time
Порядок применения фильтров может влиять на производительность, но не на итоговую семантику результата.
При изменении данных Kepler.gl пересчитывает доступные категории. Это важно при:
Если новые данные содержат дополнительные категории, они автоматически добавляются в domain и становятся доступными в UI без ручной настройки.
Особое внимание требуется обработке null,
undefined и пустых строк.
Типичные стратегии:
UnknownKepler.gl может трактовать пустые значения как отдельный элемент домена, если они присутствуют в данных.
Категориальные фильтры позволяют решать задачи сегментации данных:
Их ценность проявляется в интерактивной работе с картографическими и пространственными наборами данных, где важна не числовая агрегация, а логическое разделение объектов по признакам.