Kepler.gl реализует визуализацию плотности точек через Heatmap layer как один из ключевых способов анализа распределённых геоданных. Этот слой опирается на GPU-ускоренную агрегацию и предназначен для отображения интенсивности событий в пространстве без необходимости интерпретировать отдельные точки.
Heatmap layer работает не с индивидуальной отрисовкой точек, а с их вкладом в локальную область пространства. Каждая точка данных интерпретируется как источник «веса», который распределяется по окружности заданного радиуса. Итоговая визуализация формируется как непрерывное поле плотности.
В основе лежит радиальное ядро (kernel density estimation), где вклад точки уменьшается с расстоянием от центра. Формально модель можно представить как суммирование вкладов всех точек:
f(x,y)=_{i=1}^{n} w_i K(d((x,y),(x_i,y_i)))
Здесь:
Такой подход позволяет превращать дискретные события в непрерывное поле интенсивности.
Heatmap layer в Kepler.gl построен поверх deck.gl, что определяет его поведение:
Kepler.gl использует декларативную модель конфигурации слоя, где Heatmap определяется через параметры слоя и входной датасет.
Слой активируется через объект конфигурации слоя:
const heatmapLayer = {
id: 'heatmap_layer',
type: 'heatmap',
config: {
dataId: 'points_dataset',
label: 'Heatmap',
colorRange: {
name: 'ColorBrewer YlOrRd-6',
type: 'sequential',
category: 'ColorBrewer',
colors: ['#ffffb2', '#fecc5c', '#fd8d3c', '#f03b20', '#bd0026']
},
radius: 30,
intensity: 1,
threshold: 0.05
}
};
radius Определяет радиус влияния каждой точки в пикселях. Увеличение значения приводит к более «размытой» картине распределения.
intensity Управляет амплификацией вкладов точек. Фактически регулирует «яркость» тепловой карты.
threshold Фильтрует слабые значения плотности, убирая шумовые области.
Цветовая модель Heatmap layer строится как градиентная интерполяция значений плотности. Обычно применяется последовательная шкала, где холодные оттенки соответствуют низкой плотности, а тёплые — высокой.
Математически преобразование плотности в цвет можно представить как функцию отображения:
C = g(f(x,y))
где:
В Kepler.gl цветовые диапазоны задаются через массив HEX-значений, интерпретируемых линейно или нелинейно в зависимости от конфигурации слоя.
Heatmap layer принимает набор точек, где каждая запись содержит координаты:
const dataset = [
{ lat: 49.806, lng: 73.085, weight: 1 },
{ lat: 49.812, lng: 73.091, weight: 2 },
{ lat: 49.800, lng: 73.100, weight: 0.5 }
];
Поле weight используется как коэффициент влияния. При отсутствии значения применяется единичный вклад.
Важно учитывать, что географическая плотность чувствительна к системе координат и масштабированию карты, поскольку радиус вычисляется в пикселях экрана, а не в метрах.
Heatmap layer реагирует на изменение viewport:
Визуальная стабильность достигается за счёт пересчёта только видимой части данных.
Ключевая особенность реализации заключается в переносе вычислений плотности в fragment shader. Каждая точка рендерится как вклад в текстуру плотности, где значения аккумулируются в буфере.
Это обеспечивает:
При увеличении количества точек критическим становится размер текстуры агрегации, а не сама численность данных.
Heatmap layer использует экранное пространство как базовую единицу вычислений. Это означает, что при увеличении масштаба:
Такой подход делает слой ориентированным на визуальный анализ, а не на метрическую точность.
Kepler.gl позволяет комбинировать Heatmap layer с фильтрами по времени, атрибутам и диапазонам значений. При этом пересчёт плотности происходит только для активного подмножества данных.
Фильтрация влияет на итоговую функцию плотности:
f_{filtered}(x,y)=_{i S} w_i K(d((x,y),(x_i,y_i)))
где (S) — множество отфильтрованных точек.
При работе с миллионами точек Heatmap layer сохраняет стабильность за счёт:
Визуальная точность при этом становится зависимой от разрешения экрана и параметра radius.
Heatmap layer не отображает точечные координаты напрямую. Он формирует поле значений, где:
Такая модель делает слой инструментом анализа распределений, а не геометрической визуализации объектов.