经纬志
首页 / deck.gl / API 文档

HexagonLayer

先看结论

六边形聚合的热力表达。相比方格,六边形邻接距离一致, 视觉上更接近各向同性的密度。

最后验证 2026-11-03 · deck.gl 9.0 · 更新 2026-10-27 · 引用本文
new deck.HexagonLayer(props)

核心参数

参数默认说明
data[]点数据数组
getPosition—返回 [经度, 纬度]
radius1000六边形外接圆半径,米
angle0整体旋转角,度
coverage1单元绘制占比,0.8 左右可见缝隙
extrudedfalse是否拉成棱柱
elevationScale1高度倍率
elevationRange自动[下限, 上限],固定高度映射区间
getColorWeight1颜色权重
colorAggregation'SUM''SUM'、'MEAN'、'MIN'、'MAX'
getElevationWeight1高度权重
elevationAggregation'SUM'同上
colorRange内置色带数组
upperPercentile100高于该百分位的单元不参与绘制,会在密集处留下空隙
lowerPercentile0裁掉低端极值
gpuAggregationtrueGPU 聚合开关
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)。