百度地图聚合点没有自带点击事件,需要调整点击聚合点时的zoom比例大小

谷歌地图点击聚合点时,有提供点击事件,百度地图却没有,因此我们可以在聚合点添加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
    },

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值