开发 HarmonyOS NEXT 地图SDK 开发指南 在地图上绘制 绘制热力图

绘制热力图 最后更新时间: 2025年11月17日

绘制热力图

热力图功能提供将业务数据展示在地图上,可以给使用者直观描述一个区域的人员,车辆等事物的热度情况。

第一步,组织热力图数据

以下以本地模拟数据为例,简单说明 SDK 热力图需要的是经纬度点数组/列表数据。

示例代码如下:

// 第一步: 生成热力点坐标列表
let latlngs: LatLng[] = [];
let x = 39.904979;
let y = 116.40964;

for (let i = 0; i < 1; i++) {
  let x_ = 0;
  let y_ = 0;
  x_ = Math.random() * 0.5 - 0.25;
  y_ = Math.random() * 0.5 - 0.25;
  latlngs.push(new LatLng(x + x_, y + y_))
}

第二步,构建热力图 HeatmapTileProvider

HeatmapTileProvider 是生成热力图的核心类,一些基础用法可参考如下代码:

// 第二步: 构建热力图 TileProvider
let builder: HeatMapBuilder = new HeatMapBuilder();
builder.setData(latlngs);
// 设置热力图绘制的数据
builder.setGradient(HeatMapController.ALT_HEATMAP_GRADIENT); // 设置热力图渐变,有默认值 DEFAULT_GRADIENT,可不设置该接口
// Gradient 的设置可见参考手册
// 构造热力图对象
let heatmapTileProvider: HeatmapTileProvider | undefined = builder.build();

第三步,绘制热力图图层

通过 TileOverlay 绘制热力图,方法如下:

// 第三步: 构建热力图参数对象
let tileOverlayOptions: TileOverlayOptions = new TileOverlayOptions();
if (heatmapTileProvider) {
  tileOverlayOptions.tileProvider(heatmapTileProvider); // 设置瓦片图层的提供者
}
// 第四步: 添加热力图
this.tileOverlay = this.mAMap?.addTileOverlay(tileOverlayOptions);

a

效果图如下:

绘制蜂窝热力图

蜂窝热力图功能提供将业务数据展示在地图上,以蜂窝的形式给使用者直观展示热度情况。

第一步,组织蜂窝热力图数据

以下以本地模拟数据为例,简单说明 SDK 热力图需要的是经纬度点数组/列表数据。

示例代码如下:

// 第一步: 生成热力点坐标列表,数据格式(119.518251,35.683927,1159)
let heatMapStr = Utils.uint8ArrayToString(HoneycombHeatMapController.readFileContentsFromAssets(getContext(), "heatmap/heatmap_honey.data"));
let heatMapStrs = heatMapStr.split("\n");
let weightlatlngs = new ArrayList<WeightedLatLng>();
for (let str of heatMapStrs) {
  let dataItem = str.split(",");
  if (dataItem && dataItem.length == 3) {
    weightlatlngs.add(new WeightedLatLng(new LatLng(Number.parseFloat(dataItem[1]), Number.parseFloat(dataItem[0])), Number.parseFloat(dataItem[2])))
  }
}
let colors = [
  ColorUtil.colorStringToNumber("#ecda9a"),
  ColorUtil.colorStringToNumber("#efc47e"),
  ColorUtil.colorStringToNumber("#f3ad6a"),
  ColorUtil.colorStringToNumber("#f7945d"),
  ColorUtil.colorStringToNumber("#f97b57"),
  ColorUtil.colorStringToNumber("#f66356"),
  ColorUtil.colorStringToNumber("#ee4d5a")
];
let startPoints = new Array<number>(colors.length);
for(let i = 0;i < startPoints.length; i++) {
  startPoints[i] = i * 1.0 / startPoints.length
}

第二步,构建热力图 HeatMapLayerOptions

HeatMapLayerOptions 是生成热力图的核心类,一些基础用法可参考如下代码:

// 第二步: 构建蜂窝热力图 HeatMapLayerOptions
let heatMapLayerOptions = new HeatMapLayerOptions();

// 带权重的经纬度
heatMapLayerOptions.weightedData(weightlatlngs);

// 指定颜色和颜色变化索引
let gradient = new Gradient(colors, startPoints);
heatMapLayerOptions.gradient(gradient);
// heatMapLayerOptions.gradient(HeatMapLayerOptions.DEFAULT_GRADIENT);

// 大小和间隔
heatMapLayerOptions.size(6000);
heatMapLayerOptions.gap(300);

// 最大最小缩放级别
heatMapLayerOptions.setMinZoom(5);
heatMapLayerOptions.setMaxZoom(19);

// 整个覆盖物的透明度
heatMapLayerOptions.opacity(0.85);

// 热力图类型为蜂窝
heatMapLayerOptions.setType(HeatMapLayerOptions.TYPE_HEXAGON);

// 控制在底图文字的上面,默认底图文字级别是0
heatMapLayerOptions.setZIndex(1);

第三步,绘制蜂窝热力图图层

通过 HeatMapLayerOptions 绘制热力图,方法如下:

this.layer = this.mAMap?.addHeatMapLayer(heatMapLayerOptions);

第四步,注册地图点击事件,回调位置的热力情况

通过 设置点击事件,获取经纬度信息,通过经纬度获取位置的热力情况,方法如下:

// 获取指定位置的热力情况
this.mAMap?.setOnMapClickListener((latLng: LatLng) => {
  if (this.layer && this.mAMap && latLng) {
    let item: HeatMapItem | undefined = this.layer.getHeatMapItem(latLng);
    if (item) {
      let stringBuffer = ""
      stringBuffer += "热力中心:"
      stringBuffer += (item.getCenter() + "\n");
      stringBuffer += "热力值:"
      stringBuffer +=  (item.getIntensity() + "\n");
      let indexes = "";
      for(let integer of item.getIndexes()) {
        indexes += integer + ",";
      }
      stringBuffer += ("热力索引:" + indexes + "\n");
      stringBuffer += ("数据数量:" + item.getIndexes().length);
      this.updateHeatItemTv(stringBuffer.toString());
    } else {
      this.updateHeatItemTv("未找到热力信息");
    }


  }
})

a

效果图如下:

返回顶部 示例中心 常见问题 智能客服 公众号
二维码