Режим редактирования

Режим редактирования в Kepler.gl представляет собой совокупность механизмов управления слоями, данными и интерактивными объектами карты, позволяющих изменять визуализацию в реальном времени без пересборки приложения. Основная идея заключается в том, что карта рассматривается как состояние (state), управляемое через Redux-подобную модель, где каждое действие пользователя или программный вызов приводит к предсказуемому обновлению конфигурации.


В основе Kepler.gl лежит связка React + Redux + deck.gl. Режим редактирования реализуется через изменение нескольких ключевых частей состояния:

  • datasets — исходные данные
  • layers — визуальные слои
  • filters — фильтры данных
  • interactionConfig — поведение взаимодействий
  • mapState — положение и параметры карты
  • uiState — состояние интерфейса

Редактирование не является отдельным режимом в классическом смысле, а представляет собой набор активированных возможностей, доступных через UI или dispatch-действия.

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


Управление слоями в режиме редактирования

Слои являются центральной сущностью визуализации. В режиме редактирования происходит:

  • создание новых слоёв
  • изменение параметров существующих слоёв
  • удаление слоёв
  • переупорядочивание слоёв

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

Основные типы слоёв

  • PointLayer — отображение точек
  • LineLayer — линии и маршруты
  • PolygonLayer — полигоны и геозоны
  • ArcLayer — дуговые соединения
  • HeatmapLayer — тепловые карты
  • HexagonLayer — гексагональная агрегация

Редактирование слоя включает изменение:

  • поля данных (dataField)
  • цвета (color)
  • радиуса/толщины (size, stroke)
  • прозрачности (opacity)
  • фильтрации внутри слоя

Каждое изменение диспатчится через action:

import {updateLayer} from 'kepler.gl/actions';

dispatch(updateLayer({
  layerId: 'points-layer',
  config: {
    color: [255, 0, 0],
    opacity: 0.8
  }
}));

Интерактивное редактирование геометрии

Одной из ключевых функций является редактирование геометрических объектов. Оно применяется в слоях PolygonLayer и PointLayer при включённых инструментах рисования.

Режимы геометрического редактирования

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

Каждое действие изменяет геометрический массив координат, который хранится в GeoJSON-подобной структуре.

Редактирование происходит через события deck.gl picking API, где координаты курсора преобразуются в географические значения.


Инструменты рисования (Draw Tools)

Режим редактирования включает инструменты создания новых объектов поверх карты.

Поддерживаемые инструменты

  • Point Tool — создание точек
  • Line Tool — рисование линий
  • Polygon Tool — построение полигонов
  • Rectangle Tool — прямоугольные области

При активном инструменте состояние uiState переключается в режим drawing, и события кликов начинают интерпретироваться как вершины геометрии.

Пример включения инструмента:

import {setMapMode} from 'kepler.gl/actions';

dispatch(setMapMode('drawPolygon'));

Редактирование данных (Datasets)

Редактирование данных в Kepler.gl происходит не через прямое изменение массива, а через замену dataset целиком.

Структура dataset включает:

  • data — массив объектов
  • fields — метаданные колонок
  • info — описание набора данных

В режиме редактирования допускается:

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

При обновлении данных автоматически пересчитываются слои и фильтры.

import {addDataToMap} from 'kepler.gl/actions';

dispatch(addDataToMap({
  datasets: {
    info: {id: 'new-data'},
    data: parsedData
  }
}));

Редактирование фильтров

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

Типы фильтров

  • временные (time filter)
  • числовые диапазоны
  • категориальные фильтры

В режиме редактирования фильтры могут:

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

Каждый фильтр связан с конкретным полем dataset.

import {setFilter} from 'kepler.gl/actions';

dispatch(setFilter('filter-id', {
  value: [10, 100]
}));

Фильтрация выполняется на уровне GPU через deck.gl, что позволяет сохранять высокую производительность даже при больших объёмах данных.


InteractionConfig и поведение событий

interactionConfig управляет тем, как карта реагирует на действия пользователя.

Основные параметры

  • tooltip — отображение подсказок
  • brush — выделение области
  • geocoder — поиск
  • drag-to-rotate — вращение карты
  • zoom — поведение масштабирования

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

import {toggleInteraction} from 'kepler.gl/actions';

dispatch(toggleInteraction({
  id: 'tooltip',
  enabled: true
}));

Режим выделения объектов

В процессе редактирования доступен режим выделения объектов, который позволяет:

  • выбирать отдельные элементы слоя
  • выделять группы объектов
  • применять к выделению фильтры
  • экспортировать выбранные данные

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


Работа с состоянием mapState

mapState определяет географическую позицию и параметры камеры.

В режиме редактирования доступны изменения:

  • координаты центра (latitude, longitude)
  • уровень масштабирования (zoom)
  • наклон (pitch)
  • поворот (bearing)
import {updateMap} from 'kepler.gl/actions';

dispatch(updateMap({
  latitude: 53.9,
  longitude: 27.5667,
  zoom: 10,
  pitch: 45
}));

Любое изменение приводит к плавной анимации перехода камеры.


Синхронизация UI состояния

uiState отвечает за визуальные элементы редактора:

  • панели слоёв
  • панели фильтров
  • всплывающие окна
  • состояние выбранных инструментов

В режиме редактирования uiState становится центральным элементом управления пользовательским опытом, определяя, какие элементы интерфейса активны.


История изменений и отмена действий

Редактирование поддерживает механизм undo/redo через хранение истории состояний.

Каждое действие пользователя сохраняется как отдельный snapshot или diff, позволяющий:

  • откатить последнее изменение
  • повторить отменённое действие
  • восстановить состояние карты

Это реализуется через middleware Redux, перехватывающий actions и сохраняющий их в стек истории.


Связь с deck.gl и WebGL слоем

Редактирование визуальных элементов напрямую связано с deck.gl слоями. Kepler.gl не рендерит графику самостоятельно, а передаёт конфигурации в deck.gl.

Каждое изменение слоя приводит к:

  • пересозданию props слоя
  • перерасчёту геометрии
  • обновлению WebGL буферов

Это обеспечивает высокую производительность при интерактивном редактировании даже сложных сцен с миллионами объектов.


Ограничения режима редактирования

При всей гибкости существуют ограничения архитектуры:

  • изменение dataset всегда атомарное
  • геометрия должна соответствовать GeoJSON структуре
  • сложные кастомные слои требуют расширения deck.gl
  • производительность зависит от количества активных фильтров и слоёв

Редактирование оптимизировано под потоковые изменения, а не массовые структурные миграции данных.


Паттерны программного расширения редактора

Расширение режима редактирования обычно происходит через:

  • кастомные Redux actions
  • middleware для перехвата изменений
  • создание пользовательских слоёв deck.gl
  • интеграцию внешних источников данных

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


Событийная модель редактирования

Каждое изменение в редакторе является событием, проходящим цепочку:

  1. пользовательское действие
  2. dispatch action
  3. reducer обновляет state
  4. deck.gl получает новые props
  5. WebGL перерисовывает сцену

Эта модель обеспечивает детерминированность и воспроизводимость состояния карты при любых сценариях редактирования.