Экструзия в Kepler.gl представляет собой механизм преобразования числовых значений из набора данных в вертикальное измерение геометрии на карте. Каждый объект на карте может быть «вытянут» вдоль оси Z в зависимости от заданного атрибута, формируя объемные структуры, визуально отражающие интенсивность, плотность или величину показателя.
Основой служит связь между географической сущностью (точка, полигон, сетка) и числовым полем данных. Это поле интерпретируется как высота, масштаб или коэффициент, определяющий степень экструзии.
В архитектуре Kepler.gl экструзия реализуется через слой (layer), поддерживающий 3D-рендеринг. Наиболее часто используются:
GeoJsonLayerHexagonLayerGridLayerColumnLayerКаждый из этих слоёв способен преобразовывать входные данные в вертикальные столбцы или объёмные полигоны.
Ключевой параметр:
elevationScale: number
Он задаёт глобальный коэффициент усиления высоты объектов.
GeoJsonLayer поддерживает работу с произвольными геометриями, включая полигоны и мультиполигоны. Экструзия осуществляется через параметр конфигурации объекта слоя.
Пример структуры слоя:
const layer = {
id: 'geojson-extrusion',
type: 'geojson',
data: geojsonData,
stroked: false,
filled: true,
extruded: true,
wireframe: true,
getElevation: f => f.properties.height,
getFillColor: f => [255, 140, 0],
elevationScale: 10
};
Ключевые аспекты:
extruded: true активирует 3D-режимgetElevation определяет источник высотыelevationScale масштабирует результатfilled управляет визуальной заливкой полигонаФункция getElevation выполняет роль адаптера между
данными и геометрией сцены.
Экструзия напрямую зависит от функции отображения данных. Типовая схема:
getElevation: d => d.properties.value
или с нормализацией:
getElevation: d => Math.sqrt(d.properties.population)
Используются различные стратегии преобразования:
Пример логарифмического преобразования:
getElevation: d => Math.log(d.properties.income + 1)
Подобные преобразования уменьшают дисбаланс между экстремальными значениями и остальными объектами.
HexagonLayer выполняет пространственную агрегацию точек в шестиугольную сетку. Каждая ячейка получает агрегированное значение, которое затем используется для экструзии.
Конфигурация слоя:
const layer = {
id: 'hex-extrusion',
type: 'hexagon',
data,
radius: 1000,
elevationScale: 50,
extruded: true,
getPosition: d => d.coordinates,
getElevationWeight: d => d.value
};
Механизм работы:
Параметр агрегации:
elevationAggregation: 'SUM'
Возможные режимы:
GridLayer формирует квадратную сетку вместо шестиугольной. Экструзия работает аналогично HexagonLayer, но с иной топологией разбиения.
const layer = {
id: 'grid-extrusion',
type: 'grid',
data,
cellSize: 500,
extruded: true,
elevationScale: 30,
getPosition: d => d.coordinates,
getWeight: d => d.metric
};
GridLayer используется для:
ColumnLayer представляет собой набор вертикальных цилиндров или столбцов, где каждый объект данных становится отдельной 3D-колонной.
const layer = {
id: 'column-extrusion',
type: 'column',
data,
diskResolution: 12,
radius: 500,
extruded: true,
elevationScale: 20,
getPosition: d => d.coordinates,
getElevation: d => d.amount,
getFillColor: d => [0, 128, 255]
};
Особенности:
Параметр elevationScale играет роль глобального
усилителя:
height = getElevation(data) * elevationScale
Практическое влияние:
Часто применяется динамическая настройка:
elevationScale: Math.max(1, 1000 / maxValue)
Визуализация экструзии часто дополняется цветовым градиентом, формируя двумерное кодирование данных.
getFillColor: d => [
255,
Math.min(255, d.value * 2),
100
]
Система интерпретации:
Комбинирование позволяет разделять многомерные данные без перегрузки интерфейса.
3D-экструзия требует значительных ресурсов GPU. Оптимизация включает:
diskResolution в ColumnLayergetElevationОсобенно критичны большие наборы GeoJSON:
Kepler.gl поддерживает H3-индексацию для оптимизации пространственной агрегации.
Принцип:
getHexagon: d => h3.geoToH3(d.lat, d.lng, 7)
Экструзия применяется уже к готовой сетке, что снижает нагрузку на CPU и повышает стабильность рендеринга.
Экструзия может изменяться во времени при обновлении данных:
setInterval(() => {
layer.data = updateData();
layer.getElevation = d => d.newValue;
}, 1000);
Типовые сценарии:
При обновлении важно избегать полного пересоздания слоя, предпочтительнее частичное обновление props.
Фильтрация данных влияет на форму 3D-структуры:
Пример:
filter: [
{
id: 'time-filter',
type: 'timeRange',
value: [start, end]
}
]
Экструзия пересчитывается только для отфильтрованного подмножества данных.
Экструзия формирует визуальную модель, в которой:
Такая модель позволяет выявлять: