HexagonLayer
六边形聚合的热力表达。相比方格,六边形邻接距离一致, 视觉上更接近各向同性的密度。
核心参数
| 参数 | 默认 | 说明 |
|---|---|---|
data | [] | 点数据数组 |
getPosition | — | 返回 [经度, 纬度] |
radius | 1000 | 六边形外接圆半径,米 |
angle | 0 | 整体旋转角,度 |
coverage | 1 | 单元绘制占比,0.8 左右可见缝隙 |
extruded | false | 是否拉成棱柱 |
elevationScale | 1 | 高度倍率 |
elevationRange | 自动 | [下限, 上限],固定高度映射区间 |
getColorWeight | 1 | 颜色权重 |
colorAggregation | 'SUM' | 'SUM'、'MEAN'、'MIN'、'MAX' |
getElevationWeight | 1 | 高度权重 |
elevationAggregation | 'SUM' | 同上 |
colorRange | 内置 | 色带数组 |
upperPercentile | 100 | 高于该百分位的单元不参与绘制,会在密集处留下空隙 |
lowerPercentile | 0 | 裁掉低端极值 |
gpuAggregation | true | GPU 聚合开关 |
material | 内置 | 环境光、主光、粗糙度,用于挤出后的明暗 |
示例
var layer = new deck.HexagonLayer({
id: 'hex',
data: points,
getPosition: function (d) { return [d.lng, d.lat]; },
radius: 900,
coverage: 0.9,
extruded: true,
elevationScale: 1.2,
elevationRange: [0, 3000],
getColorWeight: function (d) { return d.weight; },
colorAggregation: 'SUM',
colorRange: [
[15, 30, 70],
[40, 95, 150],
[60, 170, 175],
[200, 210, 90],
[240, 130, 55],
[215, 45, 45]
],
upperPercentile: 100,
pickable: true,
material: { ambient: 0.55, diffuse: 0.7, shininess: 20 }
});
半径怎么定
radius 决定每个单元覆盖的地面范围。经验上让一屏横向
出现 20–40 个六边形:视口跨度除以 30 约等于合适的半径。
城市尺度(十几公里视口)用 300–800 米;
省域尺度用 5–15 公里。
半径过小会让单元里的点数为 0 或 1,色带失去层次; 半径过大会把多个热点合并成一团,看不出结构。
高度与颜色的分工
挤出后,高度提供总量的直观比较,颜色负责另一维信息。
两者都用 SUM 时信息重复,建议把颜色改成
MEAN(例如平均客单价),高度保留总量。
upperPercentile 的作用是排除而不是截断:高于该百分位的
单元直接不画,画面上会出现空洞。它适合剔除个别异常值,
但把 97–99 用在本身就有大片高值区的数据上,会让最密集的区域
整块消失。要么保持默认的 100,要么先用 colorDomain
和 elevationRange 固定值域,再决定是否排除极值。
拾取
info.object 提供 position、count、
colorValue、elevationValue 与六边形顶点数组
points。提示里显示点数与统计值即可:
getTooltip: function (info) {
if (!info.object) return null;
return info.object.count + ' 个点 · 总量 ' + Math.round(info.object.elevationValue);
}
GPU 聚合有精度上限。默认实现把权重累加到浮点纹理,
权重值过大或数据量超过千万时可能出现溢出。数值量级很大时,
先把权重归一化到较小范围,或关闭 gpuAggregation
改走 CPU 聚合。
经纬志(2026)。《HexagonLayer》。https://www.jingweizhi.com/deckgl/api/hexagon-layer.html(访问日期 2026-11-03)。