Фильтры по нескольким полям

Kepler.gl использует систему фильтров как один из центральных механизмов интерактивного анализа данных. Фильтрация реализуется на уровне набора данных и может одновременно затрагивать несколько полей, что позволяет строить сложные многомерные условия отбора без предварительной агрегации данных.

Фильтры в Kepler.gl представляют собой массив объектов, каждый из которых описывает отдельное условие отбора. Базовая структура фильтра включает:

  • идентификатор набора данных (dataId)
  • имя поля (name)
  • тип фильтра (type)
  • диапазон или множество значений (value, domain)
  • режим интерпретации данных (числовой, временной, категориальный)

Каждый фильтр привязан к конкретному полю, но система допускает одновременное использование нескольких фильтров для одного и того же датасета, что и формирует основу многополевой фильтрации.

Одновременная работа нескольких фильтров

При добавлении нескольких фильтров к одному источнику данных применяется логика пересечения условий. Это означает, что результирующий набор включает только те записи, которые удовлетворяют всем активным фильтрам одновременно.

Пример структуры с несколькими фильтрами:

const filters = [
  {
    dataId: ['dataset_1'],
    name: 'temperature',
    type: 'range',
    value: [10, 30],
    enabled: true
  },
  {
    dataId: ['dataset_1'],
    name: 'humidity',
    type: 'range',
    value: [40, 80],
    enabled: true
  }
];

В данном случае каждая строка данных должна соответствовать обоим условиям одновременно.

Фильтрация по разным полям одного набора данных

При работе с многомерными данными часто требуется комбинировать фильтры по различным атрибутам: времени, числовым значениям и категориям.

Типичный сценарий включает:

  • временной фильтр (например, по дате события)
  • числовой диапазон (например, скорость или интенсивность)
  • категориальный фильтр (например, тип объекта)

Пример комбинирования:

const filters = [
  {
    dataId: ['trips'],
    name: 'timestamp',
    type: 'timeRange',
    value: [1609459200000, 1640995200000],
    enabled: true
  },
  {
    dataId: ['trips'],
    name: 'distance',
    type: 'range',
    value: [1000, 10000],
    enabled: true
  },
  {
    dataId: ['trips'],
    name: 'vehicleType',
    type: 'multiSelect',
    value: ['car', 'bus'],
    domain: ['car', 'bus', 'bike'],
    enabled: true
  }
];

Здесь формируется пересечение трёх разных измерений данных: времени, числового диапазона и категорий.

Типы фильтров и их взаимодействие

Диапазонные фильтры (range)

Используются для числовых значений. Определяют минимальную и максимальную границу включения.

Особенности:

  • поддерживают непрерывные значения
  • оптимизированы для больших наборов данных
  • применяются к координатам, метрикам, измерениям

Временные фильтры (timeRange)

Специализированный вариант диапазонного фильтра для временных меток.

Особенности:

  • работа с UNIX timestamp
  • поддержка анимации по времени
  • синхронизация с временной шкалой интерфейса

Категориальные фильтры (multiSelect)

Позволяют выбирать множество значений из дискретного набора.

Особенности:

  • работают с текстовыми и числовыми категориями
  • поддерживают динамическое обновление домена
  • позволяют исключать или включать группы значений

Логика пересечения условий

Фильтрация в Kepler.gl строится на принципе логического AND между фильтрами одного слоя или датасета. Это означает, что:

  • каждый фильтр уменьшает область выборки
  • добавление нового фильтра не расширяет, а сужает результат
  • порядок фильтров не влияет на итоговый результат

При этом внутри одного фильтра типа multiSelect используется логика OR: запись проходит фильтр, если значение совпадает хотя бы с одним выбранным элементом.

Применение фильтров к нескольким слоям

Фильтры могут быть связаны с конкретными слоями визуализации. Один и тот же датасет может использоваться в разных слоях с разными условиями отбора.

Пример:

const config = {
  datasets: {
    trips: {
      filters: [
        {
          name: 'speed',
          type: 'range',
          value: [20, 80]
        }
      ]
    }
  },
  layers: [
    {
      id: 'layer_fast',
      dataId: 'trips',
      filter: {
        name: 'speed',
        value: [50, 80]
      }
    },
    {
      id: 'layer_slow',
      dataId: 'trips',
      filter: {
        name: 'speed',
        value: [20, 50]
      }
    }
  ]
};

Такой подход позволяет визуально разделять данные на несколько категорий без дублирования источников.

Комбинирование фильтров на уровне нескольких датасетов

Kepler.gl поддерживает сценарии, где фильтры применяются одновременно к разным наборам данных. В этом случае каждый датасет имеет собственный набор фильтров, но визуализация может объединять их на карте.

const config = {
  datasets: {
    cities: {
      filters: [
        {
          name: 'population',
          type: 'range',
          value: [100000, 1000000]
        }
      ]
    },
    routes: {
      filters: [
        {
          name: 'traffic',
          type: 'range',
          value: [200, 1000]
        }
      ]
    }
  }
};

Такая модель позволяет строить сложные многослойные карты, где каждый слой подчиняется собственной системе ограничений.

Производительность при множественных фильтрах

При увеличении числа активных фильтров возрастает стоимость пересчёта данных. Основные факторы влияния:

  • количество строк в датасете
  • число одновременно активных фильтров
  • тип фильтра (range быстрее категориального в больших массивах)
  • наличие временной анимации

Оптимизация обычно достигается за счёт:

  • предварительной агрегации данных
  • ограничения числа активных фильтров
  • использования индексации по ключевым полям

Порядок применения и внутренний pipeline

Внутри Kepler.gl обработка фильтров происходит в несколько этапов:

  1. загрузка исходного датасета
  2. применение фильтров по каждому полю
  3. пересечение результатов всех фильтров
  4. передача отфильтрованных данных в слой визуализации

Каждый слой получает уже отфильтрованный набор, что снижает нагрузку на рендеринг WebGL.

Особенности работы с динамическими фильтрами

Фильтры могут изменяться в реальном времени, например через UI или внешнее состояние приложения. В этом случае система пересчитывает только затронутые части данных, сохраняя остальные результаты кэшированными.

При изменении одного фильтра:

  • пересчитывается только соответствующий домен
  • остальные фильтры применяются повторно без изменений
  • визуализация обновляется инкрементально

Связь фильтров с состоянием приложения

Фильтры являются частью глобального состояния конфигурации Kepler.gl. Это позволяет:

  • сохранять состояние карты
  • сериализовать фильтры в JSON
  • восстанавливать сессию с теми же условиями анализа

Формат конфигурации обычно включает массив фильтров, который может быть сохранён и повторно использован без потери логики отбора данных.