Deck.gl строится вокруг концепции слоёв (layers),
каждый из которых принимает на вход набор данных и преобразует их в
визуальные примитивы. Центральное понятие — data, которое
задаёт источник и структуру информации для рендеринга.
Практически все слои Deck.gl работают с параметром:
data: массив объектов, URL к данным или функция доступа
к даннымКлючевая особенность архитектуры — отсутствие строгого единого формата. Вместо этого используется адаптивная модель, поддерживающая несколько типов входных структур.
Наиболее распространённый формат — стандартный JavaScript-массив:
const data = [
{ position: [37.78, -122.41], value: 10 },
{ position: [37.79, -122.42], value: 20 }
];
Каждый объект описывает одну сущность (точку, линию, полигон и т.д.).
new deck.ScatterplotLayer({
id: 'scatter',
data,
getPosition: d => d.position,
getRadius: d => d.value
});
Для больших объёмов данных используется формат TypedArray, обеспечивающий максимальную производительность.
Поддерживаются:
Float32ArrayFloat64ArrayUint8Arrayconst data = new Float32Array([
37.78, -122.41, 10,
37.79, -122.42, 20
]);
Здесь данные обычно интерпретируются как последовательные блоки значений.
new deck.ScatterplotLayer({
data,
getPosition: (d, {index}) => [
data[index * 3],
data[index * 3 + 1]
],
getRadius: (d, {index}) => data[index * 3 + 2]
});
Deck.gl активно работает с геопространственными данными, поэтому поддерживается формат GeoJSON, являющийся стандартом для географических объектов.
const data = {
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [-122.41, 37.78]
},
properties: {
value: 10
}
}
]
};
Поддержка всех стандартных типов геометрий:
Совместимость с GIS-системами
Используется в слоях:
GeoJsonLayerPathLayerPolygonLayernew deck.GeoJsonLayer({
id: 'geojson',
data,
getFillColor: f => [255, 0, 0],
getLineWidth: 2
});
Deck.gl не ограничивается JSON-структурами и может работать с табличными данными, например CSV.
latitude,longitude,value
37.78,-122.41,10
37.79,-122.42,20
После парсинга данные обычно преобразуются в массив объектов:
const data = parsedCSV.map(d => ({
position: [+d.latitude, +d.longitude],
value: +d.value
}));
Deck.gl поддерживает динамическое обновление данных без полной перерисовки слоя.
layer.setProps({
data: [...oldData, newPoint]
});
Используется в real-time визуализациях
Подходит для:
Deck.gl не требует строгой структуры данных благодаря системе accessor-функций.
Каждое визуальное свойство определяется функцией:
getPosition: d => d.position
getColor: d => d.color
getRadius: d => d.size
Один и тот же слой может работать с разными форматами:
{ x: 1, y: 2 }
[1, 2]
Float32Array
Deck.gl не навязывает схему данных, а делегирует интерпретацию слою через accessors.
Deck.gl может загружать данные напрямую из внешних источников.
.json.geojson.csvnew deck.GeoJsonLayer({
data: 'https://example.com/data.geojson'
});
Для высоконагруженных сцен используются бинарные структуры:
// [x, y, value, x, y, value, ...]
const buffer = new Float32Array([...]);
Некоторые слои используют промежуточную трансформацию данных:
new deck.ScreenGridLayer({
data,
getPosition: d => d.position,
getWeight: d => d.value
});
Здесь входные данные могут быть преобразованы в:
Deck.gl допускает полностью пользовательские структуры, при условии реализации accessors.
const data = {
nodes: [...],
edges: [...]
};
Использование:
getSourcePosition: d => d.nodes[d.source],
getTargetPosition: d => d.nodes[d.target]
В реальных приложениях часто комбинируются разные типы данных:
const data = {
geo: geojson,
metrics: new Float32Array([...]),
labels: ['A', 'B', 'C']
};
Разные слои интерпретируют входные данные по-разному:
ScatterplotLayer — точки и координатыPathLayer — массивы линийPolygonLayer — вложенные массивы координатHexagonLayer — агрегируемые точкиGridLayer — регулярная сетка// PathLayer
data: [
[[lng, lat], [lng, lat]]
]
// PolygonLayer
data: [
[[lng, lat], [lng, lat], [lng, lat]]
]
Перед передачей в слой данные часто проходят этап нормализации:
const normalized = raw.map(d => ({
position: [d.lon, d.lat],
value: Math.max(0, d.value)
}));
При работе с Deck.gl критичны ограничения:
Оптимизация формата данных напрямую влияет на: