Deck.gl предоставляет слой H3HexagonLayer как специализированный инструмент для визуализации пространственных данных через систему индексации H3. В основе лежит разбиение поверхности Земли на шестиугольные ячейки фиксированных уровней детализации, что позволяет эффективно агрегировать и отображать большие объёмы геоданных без потери структуры.
H3HexagonLayer строится поверх библиотеки H3 от Uber, где каждая точка пространства преобразуется в уникальный индекс ячейки. Это делает возможным переход от точечных данных к плотностным картам без предварительной ручной агрегации.
H3 представляет собой иерархическую сетку, где каждая последующая резолюция увеличивает детализацию.
Ключевые свойства системы:
H3HexagonLayer использует эти свойства для автоматического группирования точек данных в шестиугольники.
Слой принимает входные данные в виде массива объектов, содержащих координаты или уже готовые H3-индексы. Внутри происходит преобразование:
Основные параметры слоя:
import {H3HexagonLayer} from '@deck.gl/geo-layers';
const layer = new H3HexagonLayer({
id: 'h3-hex-layer',
data: points,
pickable: true,
filled: true,
extruded: false,
getHexagon: d => d.hex,
getFillColor: d => [255, 0, 0],
getElevation: d => d.value
});
Одним из ключевых параметров является resolution — уровень детализации сетки H3.
Каждое увеличение resolution резко увеличивает количество ячеек, но повышает точность визуализации.
H3HexagonLayer поддерживает два основных формата данных:
data: [
{lat: 52.52, lon: 13.405, value: 10},
{lat: 48.8566, lon: 2.3522, value: 20}
]
data: [
{hex: '8928308280fffff', value: 15},
{hex: '8928308280bffff', value: 30}
]
Во втором случае слой пропускает стадию индексации и сразу выполняет агрегацию.
Одной из ключевых особенностей слоя является возможность вычисления значений внутри каждой ячейки.
Типичные сценарии:
Пример:
getElevation: d => d.count,
getFillColor: d => [
255,
Math.min(255, d.count * 10),
0
]
H3HexagonLayer поддерживает два основных режима отображения:
filled: true,
extruded: false
Используются для heatmap-подобных визуализаций.
filled: true,
extruded: true,
getElevation: d => d.value
Позволяют отображать третье измерение — интенсивность данных.
Цвет задаётся через функцию getFillColor, что позволяет
динамически отображать распределение значений.
Пример линейной интерполяции:
getFillColor: d => {
const t = Math.min(1, d.value / 100);
return [
255 * t,
100 * (1 - t),
255 * (1 - t)
];
}
Для сложных сцен часто применяется нормализация значений до диапазона 0–1.
H3HexagonLayer оптимизирован для работы с большими массивами данных благодаря:
При увеличении resolution возрастает нагрузка на GPU и память, поэтому баланс детализации критичен.
H3HexagonLayer часто комбинируется с:
Пример композиции:
const layers = [
new H3HexagonLayer({...}),
new ScatterplotLayer({
data: points,
getPosition: d => [d.lon, d.lat]
})
];
Слой поддерживает picking — определение ячейки под курсором.
onHover: info => {
if (info.object) {
console.log(info.object.hex, info.object.value);
}
}
Это позволяет строить интерактивные аналитические панели поверх геоданных.
H3HexagonLayer применяется в задачах, где требуется пространственная агрегация:
В основе лежит концепция глобальной дискретной сетки, где каждая ячейка имеет уникальный идентификатор. Это позволяет:
H3 становится промежуточным слоем между сырыми координатами и визуальной моделью.
При обработке миллионов точек используется предварительная агрегация:
const grouped = new Map();
for (const p of points) {
const hex = h3.geoToH3(p.lat, p.lon, 7);
grouped.set(hex, (grouped.get(hex) || 0) + 1);
}
Затем результат передаётся в слой уже в агрегированном виде, снижая нагрузку на клиент.
Эффективная работа достигается за счёт:
Такие меры позволяют поддерживать стабильный FPS даже при сложных сценах.