百度地图中自定义点聚合实现

百度地图中自定义点聚合实现

点聚合 (MarkerClusterer 标记聚合器)用来解决加载大量点要素到地图上产生覆盖现象的问题,并提高性能。

点聚合的实现原理是按照以某点为中心的正方形作为区域,把此区域的点聚合在一个点上,并随着地图比例尺改变此点区域大小,同时改变聚合点的数量。

默认百度地图的聚合marker效果如下:

官方聚合示例:http://lbsyun.baidu.com/jsdemo.htm#c1_4

  • 点击聚合点默认放大
    在这里插入图片描述

在实际项目开发中,我遇到了点聚合的一个难题:如何实现自定义聚合点点击事件。

如果直接在源码上修改,时间成本很高,

聚合点默认是没有点击监听事件的,而marker有点击监听事件

因此最终得到一个解决方案:
思路:

1. 根据百度聚合API创建聚合点,但是只需要用到点聚合后的数据,利用自定义样式进行隐藏此聚合点(目的是消除默认聚合点会点击放大效果)
2. 拿到数据后创建一个自定义标注marker,可设置标注样式(相当于利用标注模拟一个聚合点)
3. 创建标注的label,自定义label样式,用来显示聚合数量(利用聚合API的数据可得到聚合点的marker数量,进行自定义label样式模拟聚合点数字的显示)
4. 给marker设置点击监听事件,自定义事件函数内容

示例效果:
在这里插入图片描述下面是具体实现:

核心代码部分:

   var datas = [{
        'localtion': '120.585239,31.298881'
    }, {
        'localtion': '120.585239,31.298881'    
    }, {
        'localtion': '120.585239,31.298881'    
    }, {
        'localtion': '120.585239,31.298881'    
    }, {
        'localtion': '120.585239,31.298881'   
    }]
    //先创建初始marker点
    var markers = [];
    for (var i = 0; i < datas.length; i++) {
        var data = datas[i];
        var localtion = data.localtion.split(',');
        var m = new BMap.Marker(new BMap.Point(localtion[0], localtion[1]));
        m.data = data;
        markers.push(m);
    }
    //调用聚合封装函数
    markerClustersPoint(markers);
    //
    //地图缩放重新计算聚合点
    map.addEventListener("zoomend",function(){
        markerClustersPoint(markers);
    });
    //
    //聚合添加
    markerClustersPoint(markers) {
      if (markerClusterer) {
        markerClusterer.clearMarkers();//清除聚合
      }
      //添加点聚合API(index.html中需引入文件)
      //  <script type="text/javascript" src="http://api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay_min.js">
      //  </script>
      //  <script type="text/javascript" src="http://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js">
      //  </script>
      markerClusterer = new BMapLib.MarkerClusterer(this.map, {
        markers: markers,
        minClusterSize: 3, //最小的聚合数量,小于该数量的不能成为一个聚合,默认为2
        styles: [
          {
            //此处仅放置style,不要写任何内容,否则会有默认聚合的数字显示溢出
            // url: "img/info.png",
            // size: new BMap.Size(0, 0)
          }
        ]
      });
      console.log("进入聚合函数markerClusterer", markerClusterer);
      //
      // 拿到所有的聚合点
      //markerClusterer中的 _clusters是一个数组,包含了可视范围的所有聚合点   
      var cluster = markerClusterer._clusters;
      var oldmk = [];
      for (var i = 0; i < cluster.length; i++) {
       //cluster[i]._markers中包含此聚合点的所有marker集合
       //marker长度大于2时不进行聚合效果显示
        if (cluster[i]._markers.length < 2) continue;
        //自定义函数内容,可进行聚合点数据获取操作
        //......
        //......
        //拿到聚合点中的marker数量,用于数字显示
        var cluserMakerSum = cluster[i]._markers.length;
        //添加marker
        oldmk.push(addMarkerCluser(cluster[i]._center));
      }
    },
   // 标记自定义marker
    addMarkerCluser(point) {
      var markerdef = new BMap.Marker(point, {
        // icon: 设置marker样式
        icon: new BMap.Symbol(BMap_Symbol_SHAPE_CIRCLE, {
          scale: 20,
          strokeWeight: 1,
          strokeColor: "white",
          fillColor: "blue",
          fillOpacity: 0.59
        })
      });
      //设置marker的label
      var labelTitleCluser = cluserMakerSum ;
      let label = new BMap.Label(labelTitleCluser, {
        offset: new BMap.Size(12, 12)
      });
      //设置label样式
      label.setStyle({
        color: "#fff",
        fontSize: "14px",
        backgroundColor: "0.05",
        border: "0px "
      });
      markerdef.setLabel(label);
      //监听点击事件
      markerdef.addEventListener("click", function() {
        console.log("点击自定义聚合maker");        
      });
      map.addOverlay(markerdef);
      //
      return markerdef;
    },     
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在Vue实现百度地图聚合,可以按照以下步骤进行操作: 1. 首先,在Vue项目安装百度地图JavaScript API。可以通过在`index.html`文件添加以下代码来引入百度地图的API: ```html <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=YOUR_API_KEY"></script> ``` 确保替换`YOUR_API_KEY`为你自己的百度地图API密钥。 2. 在Vue组件创建地图容器,并初始化地图。可以在`mounted`钩子函数添加以下代码: ```javascript mounted() { const map = new BMap.Map("map-container"); // 创建地图实例 const point = new BMap.Point(经度, 纬度); // 设置地图坐标 map.centerAndZoom(point, 15); // 初始化地图,设置地图缩放级别 this.map = map; // 将地图实例保存到组件数据 } ``` 确保替换`经度`和`纬度`为你希望地图显示的坐标。 3. 获取需要聚合的标记数据,并使用百度地图的`MarkerClusterer`类进行聚合。可以在`mounted`钩子函数添加以下代码: ```javascript mounted() { // ... const markers = []; // 存储标记的数组 // 添加标记到地图和markers数组 yourData.forEach((item) => { const point = new BMap.Point(item.lng, item.lat); const marker = new BMap.Marker(point); map.addOverlay(marker); markers.push(marker); }); // 创建聚合器并设置参数 const markerClusterer = new BMapLib.MarkerClusterer(map, { markers: markers, }); // ... } ``` 确保替换`yourData`为你的标记数据数组,每个标记的经度和纬度分别存储在`item.lng`和`item.lat`。 4. 在Vue组件添加地图容器的HTML代码。可以在组件模板添加以下代码: ```html <template> <div id="map-container" style="width: 100%; height: 400px;"></div> </template> ``` 确保根据需要设置地图容器的宽度和高度。 通过以上步骤,你就可以在Vue项目实现百度地图聚合效果了。记得在百度地图开放平台申请并获取到API密钥,并替换代码的`YOUR_API_KEY`。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值