Kepler.gl построена вокруг строго типизированной модели состояния, где константы и перечисления (enum-подобные структуры) формируют единый язык взаимодействия между слоями визуализации, редактором данных и системой управления состоянием на базе Redux. Отсутствие жёстких строковых значений в бизнес-логике компонентов позволяет минимизировать ошибки времени выполнения и стандартизировать расширение функциональности через плагины и кастомные слои.
Константы выступают центральным связующим звеном между различными подсистемами: обработкой данных, визуальными слоями, интерфейсом управления и сериализацией конфигурации карты. Любое действие, происходящее в приложении, выражается через предопределённые идентификаторы, которые затем интерпретируются редьюсерами и middleware.
Ключевая идея заключается в том, что строковые литералы не используются напрямую в логике. Вместо них применяется слой абстракции, который обеспечивает:
Система действий в Kepler.gl построена на Redux-подобной архитектуре, где каждое изменение состояния описывается через action type.
Типичный набор включает:
Пример логической структуры:
const ActionTypes = {
ADD_DATA: 'ADD_DATA',
REMOVE_DATA: 'REMOVE_DATA',
UPDATE_MAP_STATE: 'UPDATE_MAP_STATE',
LAYER_CONFIG_CHANGE: 'LAYER_CONFIG_CHANGE',
SET_FILTER: 'SET_FILTER',
APPLY_FILTER: 'APPLY_FILTER'
};
Такая структура позволяет централизованно управлять всеми изменениями состояния и предотвращает дублирование строковых идентификаторов в кодовой базе.
Слои являются базовой единицей визуализации геоданных. Каждый слой имеет строго определённый тип, который определяет способ рендеринга и набор поддерживаемых атрибутов.
Основные типы слоёв:
Логическая модель:
const LAYER_TYPES = {
POINT: 'point',
ARC: 'arc',
LINE: 'line',
POLYGON: 'polygon',
HEXAGON: 'hexagon',
GEOJSON: 'geojson',
GRID: 'grid'
};
Каждый тип слоя определяет:
Состояние карты включает параметры viewport, стили базовой карты и настройки взаимодействия.
Типовые группы констант:
Viewport описывает текущее положение карты:
const MAP_STATE_KEYS = {
LATITUDE: 'latitude',
LONGITUDE: 'longitude',
ZOOM: 'zoom',
PITCH: 'pitch',
BEARING: 'bearing'
};
Эти ключи используются для сериализации состояния камеры и синхронизации между сессиями.
Базовые стили определяют визуальный фон:
const MAP_STYLES = {
DARK: 'dark',
LIGHT: 'light',
MUTED: 'muted',
SATELLITE: 'satellite',
ROADMAP: 'roadmap'
};
Каждый стиль влияет на восприятие геоданных и контрастность визуальных слоёв.
Фильтры в Kepler.gl представляют собой отдельную подсистему, работающую поверх данных слоёв.
Основные типы фильтров:
Структура enum-подобных значений:
const FILTER_TYPES = {
RANGE: 'range',
TIME: 'time',
SELECT: 'sel ect'
};
Каждый тип фильтра определяет:
Интерактивность карты контролируется через набор предопределённых флагов и режимов.
const INTERACTION_MODES = {
READ_ONLY: 'read_only',
EDIT: 'edit',
DRAW: 'draw',
SELECT: 'sel ect'
};
Эти режимы определяют, доступно ли редактирование слоёв, выделение объектов или добавление новых геометрий.
Работа с временными данными требует унифицированного представления:
const TIME_FORMATS = {
ISO8601: 'iso8601',
UNIX: 'unix',
STRING: 'string'
};
Эти форматы используются при:
Каждый слой поддерживает набор визуальных свойств, стандартизированных через ключи:
const VISUAL_CHANNELS = {
COLOR: 'color',
SIZE: 'size',
HEIGHT: 'height',
STROKE: 'stroke',
OPACITY: 'opacity'
};
Эти каналы определяют, какие аспекты данных могут быть закодированы в визуальные переменные.
Импорт и экспорт данных в Kepler.gl осуществляется через строго определённые форматы.
const FILE_FORMATS = {
CSV: 'csv',
GEOJSON: 'geojson',
JSON: 'json',
SHAPEFILE: 'shapefile',
KML: 'kml'
};
Каждый формат требует отдельного парсера и маппинга в внутреннюю структуру dataset.
Данные внутри Kepler.gl нормализуются в унифицированный формат с фиксированными ключами:
const DATASET_KEYS = {
ID: 'id',
LABEL: 'label',
DATA: 'data',
FIELDS: 'fields',
ROWS: 'rows'
};
Такая структура обеспечивает независимость визуализации от исходного источника данных.
UI взаимодействия также абстрагируются через набор событийных идентификаторов:
const UI_EVENTS = {
CLICK_LAYER: 'click_layer',
HOVER_OBJECT: 'hover_object',
TOGGLE_VISIBILITY: 'toggle_visibility',
OPEN_PANEL: 'open_panel',
CLOSE_PANEL: 'close_panel'
};
Эти события передаются в глобальный store и могут быть перехвачены middleware для логики аналитики или синхронизации состояния.
Внутренняя архитектура Kepler.gl строится на нескольких устойчивых паттернах:
Все строки, участвующие в логике, выносятся в отдельные модули:
import { LAYER_TYPES } fr om 'constants/layers';
import { MAP_STYLES } fr om 'constants/map-styles';
Константы не изменяются во время выполнения. Это критично для предсказуемости Redux-архитектуры.
Константы группируются по доменам:
Архитектура допускает добавление новых типов слоёв и режимов через расширение базовых констант.
Механизм расширения обычно включает:
Пример расширения:
const CUSTOM_LAYER_TYPES = {
HEATMAP_ADVANCED: 'heatmap_advanced'
};
Такая модель позволяет интегрировать сторонние визуализации без изменения ядра библиотеки.
Kepler.gl активно использует сериализацию конфигураций карт. Константы обеспечивают обратимую структуру состояния:
При десериализации используются те же ключи, что гарантирует совместимость между версиями приложения и сохранёнными проектами.