Kepler.gl строит работу с данными вокруг концепции слоёв (layers) и наборов данных (datasets), где каждый dataset представляет собой структурированную таблицу с географическими полями и метаданными. Вся система загрузки данных опирается на единый поток: подготовка данных → парсинг через loaders.gl → преобразование в внутренний формат → регистрация в состоянии приложения через Redux → связывание с визуальными слоями.
Внутренне Kepler.gl использует нормализованную модель хранения:
Каждый dataset после загрузки получает структурированное представление, пригодное для быстрого рендеринга WebGL-слоёв.
Основная идея заключается в том, что сырые данные никогда не используются напрямую — они всегда проходят стадию нормализации и обогащения метаданными.
Kepler.gl поддерживает несколько типов входных данных, каждый из
которых обрабатывается через соответствующие парсеры из
loaders.gl.
Основные форматы:
CSV остаётся наиболее распространённым вариантом, поскольку он легко интегрируется с внешними системами аналитики.
GeoJSON используется для работы с полигонами, линиями и точками, особенно в задачах пространственного анализа.
Центральный механизм добавления данных в Kepler.gl — action
addDataToMap. Он передаёт данные в reducer, где происходит
их нормализация и включение в состояние приложения.
import {addDataToMap} from 'kepler.gl/actions';
const dataset = {
data: [
{lat: 59.93, lng: 30.33, name: 'Point A'},
{lat: 59.94, lng: 30.35, name: 'Point B'}
],
info: {
id: 'sample_dataset',
label: 'Sample Data'
}
};
dispatch(addDataToMap({
datasets: dataset
}));
При вызове этого action происходит несколько этапов:
CSV обрабатывается через встроенный CSVLoader из
@loaders.gl/csv. Данные могут поступать как строка или
файл.
import {addDataToMap} from 'kepler.gl/actions';
const csvData = `
lat,lng,value
59.93,30.33,10
59.94,30.35,20
`;
dispatch(addDataToMap({
datasets: {
info: {
id: 'csv_dataset',
label: 'CSV Dataset'
},
data: csvData
}
}));
Во время парсинга:
Особенность Kepler.gl заключается в автоматическом inference гео-полей, что позволяет минимизировать ручную настройку.
GeoJSON обрабатывается как структурированная геометрия. В отличие от CSV, здесь уже присутствует пространственная модель.
const geojsonData = {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [30.33, 59.93]
},
properties: {
name: 'Point A'
}
}
]
};
dispatch(addDataToMap({
datasets: {
info: {
id: 'geo_dataset',
label: 'GeoJSON Dataset'
},
data: geojsonData
}
}));
Внутренне происходит трансформация:
GeoJSON является основой для таких слоёв, как polygon layer, line layer и arc layer.
Kepler.gl использует loaders.gl как слой абстракции над
форматами данных. Это позволяет унифицировать загрузку независимо от
источника.
Пример логики:
data — строка → CSVLoaderdata — объект с
type: FeatureCollection → GeoJSONLoaderdata — массив объектов → JSON normalizerВнутренний pipeline можно представить так:
raw input → loader selection → parse → normalize → enrich metadata → store
Metadata включает:
Kepler.gl поддерживает одновременную работу с несколькими datasets.
Каждый из них изолирован по dataId, но может использоваться
в одном или нескольких слоях.
dispatch(addDataToMap({
datasets: [
{
info: {
id: 'dataset_1',
label: 'Cities'
},
data: citiesData
},
{
info: {
id: 'dataset_2',
label: 'Routes'
},
data: routesData
}
]
}));
При этом:
После загрузки Kepler.gl строит schema — описание структуры данных.
Каждое поле получает:
Пример структуры:
{
fields: [
{name: "lat", type: "real"},
{name: "lng", type: "real"},
{name: "value", type: "integer"}
]
}
Schema используется для:
В реальных приложениях данные часто приходят с сервера. Kepler.gl допускает загрузку через async pipeline.
async function loadData() {
const response = await fetch('/api/data');
const json = await response.json();
dispatch(addDataToMap({
datasets: {
info: {
id: 'remote_data',
label: 'Remote Dataset'
},
data: json
}
}));
}
При этом важно учитывать:
Kepler.gl полностью интегрирован в Redux через
keplerGlReducer. Данные попадают в state следующим
образом:
state.keplerGl.map.datasets
Каждый dispatch addDataToMap вызывает reducer,
который:
Пример подключения reducer:
import keplerGlReducer from 'kepler.gl/reducers';
const reducers = combineReducers({
keplerGl: keplerGlReducer
});
При работе с большими наборами данных (сотни тысяч строк) критичны следующие аспекты:
1. Columnar processing
2. Lazy evaluation
3. Typed arrays
4. Memoization schema
Несоответствие координат
Неверная структура GeoJSON
Дублирование dataId
Смешение типов в колонках
Kepler.gl может выполнять предварительные трансформации:
Пример: строка даты автоматически преобразуется в UNIX timestamp для ускорения фильтрации.
Полный путь данных в Kepler.gl можно описать следующим образом:
Input Data
↓
Loader Selection (CSV / GeoJSON / JSON / Arrow)
↓
Parsing (loaders.gl)
↓
Normalization (table schema creation)
↓
Metadata enrichment (types, domains, geo detection)
↓
Redux store (datasets state)
↓
Layer binding (visualization)
↓
WebGL rendering (deck.gl layers)
Каждый этап строго разделён, что обеспечивает масштабируемость и предсказуемость поведения при работе с различными источниками данных.