谷歌地图点击聚合点时,有提供点击事件,百度地图却没有,因此我们可以在聚合点添加marker,但是不要弹出内容,只拿点击事件,在点击事件里面做操作
addMarkerFactory (points,outClickScreen = 0) {
let signPosList = points ?? this.points
let flag = this.OpenMarkerClusterer
for (let i = 0, len = signPosList.length; i < len; i++) {
let item = signPosList[i]
let marker
let pos = new mBMap.Point(item.lng, item.lat)
if (!markers[item.id]) {
let url = require('@/assets/coordinate.png')
let myIcon = new mBMap.Icon(url, new mBMap.Size(32, 32))
marker = new mBMap.Marker(pos, {icon: myIcon})
let infoWin = new mBMap.InfoWindow(this.infoWinFn(item), {
// maxWidth: 100,
enableAutoPan: true,
enableCloseOnClick: false
})
marker.addEventListener('click', function () {
marker.openInfoWindow(infoWin);
});
let obj = this.addMarker(item, this.infoWinFn, !flag)
obj.marker.openInfoWindow(obj.infoWin)
markers[item.id] = Object.assign(obj, {obj: item})
}else if(outClickScreen == item.id){
markers[item.id].marker.openInfoWindow(markers[item.id].infoWin);
} else {
let markerModel = markers[item.id];
markerModel.obj = item;
!flag && this.setPositon(markerModel.marker, item.lat, item.lng)
}
}
if (openMarkerClusterer){
// eslint-disable-next-line no-undef
// clusterer = new BMapLib.MarkerClusterer(map, {markers: Object.values(markers).map(v => v.marker)})
//#region 因为地图两边有其他内容显示 点击聚合点的时候 会自动放到最大 导致看不到marker点,需要手动缩小一个zoom,使用以下方法,如没有这个需求,使用上面一行的方法即可
//地图添加聚合点
this.markerClustersPoint(markers);
//地图缩放重新计算聚合点
// var self = this
// map.addEventListener("zoomend",function(){
// self.markerClustersPoint(markers);
// });
//#endregion
}
},
创建完marker后,创建MarkerClusterer,在MarkerClusterer添加marker,但是marker使用透明的图片,使其可以点击,触发点击事件
markerClustersPoint:function(markers){
if (markerClusterer) {
markerClusterer.clearMarkers();//清除聚合
}
// 老点位 去除
if(oldmk.length != 0){
for (var i = 0; i < oldmk.length; i++) {
map.removeOverlay(oldmk[i])
}
oldmk = [];
}
markerClusterer= new BMapLib.MarkerClusterer(map, {markers: Object.values(markers).map(v => v.marker)})
var newCluster = markerClusterer._clusters;
for (var i = 0; i < newCluster.length; i++) {
if (newCluster[i]._markers.length < 2) continue;
oldmk.push(this.addMarkerCluser(newCluster[i]._center));
}
},
addMarkerCluser(point){
let markerIcon = new mBMap.Icon('/img/gmap/m1.png', new mBMap.Size(53, 53),{
// 这里的offset和imageOffset可以根据实际图标位置调整
offset: new mBMap.Size(25, 25), // 图标的中心位置
imageOffset: new mBMap.Size(0, 0 - 25) // 图片的中心位置
})
//这是额外加的marker Icon,原本自带的已经有了,所以把自定义的icon设置成透明的
markerIcon.imageSize = new mBMap.Size(400, 400);
let markerdef = new mBMap.Marker(point, {icon: markerIcon})
//监听点击事件
var self = this
markerdef.addEventListener("click", function(e) {
for (let i = 0; i < markerClusterer._clusters.length; i++) {
const ele = markerClusterer._clusters[i];
//重点在这,找出当前点击的聚合点的坐标 与地图上已创建的markerClusterer实例的_clusters的左边作比对,拿到其聚合的几个marker
if(e.target.point.lat == ele._center.lat && e.target.point.lng == ele._center.lng){
map.setViewport(self.newGetBounds(ele._markers))
map.setZoom(map.getZoom() - 1)
}
}
});
map.addOverlay(markerdef);
return markerdef;
},
newGetBounds(markers){
// 参考MarkerCluser.js的map.getBounds()
var k = null
for (var j = 0, h; h = markers[j]; j++) {
if(j == 0){
k = new mBMap.Bounds(h.getPosition(),h.getPosition());
}
k.extend(h.getPosition())
}
return k
},