高德JS API的点聚合(MarkerClusterer)实现

app 端开发时会使用到地图锚点功能,但由于目标设备参差不齐性能表现也不一样,当锚点成千上万时需要点聚合等方法减缓性能的消耗,这里简单说一下 uniapp 上点聚合的使用,基本用到 3 个变量,定义在 data 中的:

1
2
3
this.map //定义的地图,这里不贴码了
this.cluster //用来创建MarkerClusterer对象,对锚点的增删改查都使用这个来操作.
this.markerArray //需要显示的聚合点数组

定义聚合点样式,这里的 count 用在根据聚合点数量动态定义颜色和大小等属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var count = this.markerArray.length;
var _renderClusterMarker = function (context) {
var factor = Math.pow(context.count / count, 1 / 18);
var div = document.createElement('div');
var Hue = 180 - factor * 180;
var bgColor = 'hsla(' + Hue + ',100%,50%,0.7)';
var fontColor = 'hsla(' + Hue + ',100%,20%,1)';
var borderColor = 'hsla(' + Hue + ',100%,40%,1)';
var shadowColor = 'hsla(' + Hue + ',100%,50%,1)';
div.style.backgroundColor = bgColor;
var size = Math.round(30 + Math.pow(context.count / count, 1 / 5) * 20);
div.style.width = div.style.height = size + 'px';
div.style.border = 'solid 1px ' + borderColor;
div.style.borderRadius = size / 2 + 'px';
div.style.boxShadow = '0 0 1px ' + shadowColor;
div.innerHTML = context.count;
div.style.lineHeight = size + 'px';
div.style.color = fontColor;
div.style.fontSize = '14px';
div.style.textAlign = 'center';
context.marker.setOffset(new AMap.Pixel(-size / 2, -size / 2));
context.marker.setContent(div)
};

添加聚合组件,这里的this指向要注意一下
this.map.plugin(["AMap.MarkerClusterer"],function() {
this.cluster = new AMap.MarkerClusterer(
this.map,
this.markerArray,
{
gridSize: 60, //网格像素
minClusterSize: 20, //最小聚合点数量
renderClusterMarker: _renderClusterMarker //上面自定义的样式
}
);
});

样式方面可以默认和自定义,文档写的很详细可以看看.对聚合点的操作可以使用
this.cluster.removeMarkers(指定聚合数组)
this.cluster.clearMarkers(销毁所有聚合) 等等方法

踩的坑:

  • 如果需要定义多个聚合点按条件显示,记得不显示时需要销毁或移除锚点数组以免聚合点数据紊乱.
  • 使用视图 js 时,不用在 data 里创建逻辑 js 已有的数据,在逻辑层标签里绑定数据并 change 到视图 js 的方法后,视图 js 中直接用 this 就可以调用到.