腾讯地图实现自定义icon,折叠点自动归整为正数

最终实现效果,相同的类型就会折叠:


效果图.png

js代码

    creatMap() {
      // 定义地图默认中心点坐标
      var center = new TMap.LatLng(22.971870333, 113.373452833);
      //创建map对象,初始化地图
      var map = new TMap.Map("container", {
        center: center, //设置地图中心点坐标
        zoom: 16 //设置地图缩放级别
      });
      this.map = map;
      this.markers = [];
      this.creatMarkerCluster("Battery", "1");
      this.creatMarkerCluster("Bicycle", "2");
      this.creatMarkerCluster("Cabinet", "3");
      // this.creatRegion();  生成多边形区域代码
      // this.creatPark();  生成多边形区域代码
    },
    // 生成点聚焦函数
    creatMarkerCluster(type, deviceType) {
      let imgIconList = new Array(3);
      imgIconList[0] = imgIcon1;
      imgIconList[1] = imgIcon2;
      imgIconList[2] = imgIcon3;
      // debugger
      let map = this.map;
      this.markers = [];
      // 1、标点
      let markerCluster = new TMap.MarkerCluster({
        id: "container" + type,
        map: map, //指定地图容器
        enableDefaultStyle: false, // 启用默认样式
        minimumClusterSize: 2,
        //点标记数据数组
        geometries: this.convertMarkers(deviceType), //this.markers
        zoomOnClick: true, // 点击簇时放大至簇内点分离
        gridSize: 60, // 聚合算法的可聚合距离
        averageCenter: true, // 每个聚和簇的中心是否应该是聚类中所有标记的平均值
        maxZoom: 25 // 采用聚合策略的最大缩放级别
      });

      var clusterBubbleList = [];
      var markerGeometries = [];
      var marker = null;

      // 监听聚合簇变化
      markerCluster.on("cluster_changed", function(e) {
        // 销毁旧聚合簇生成的覆盖物
        if (clusterBubbleList.length) {
          clusterBubbleList.forEach(function(item) {
            item.destroy();
          });
          clusterBubbleList = [];
        }
        markerGeometries = [];

        // 根据新的聚合簇数组生成新的覆盖物和点标记图层
        // debugger
        var clusters = markerCluster.getClusters();
        clusters.forEach((item,index) => {
          console.log(clusters,'clusters')
          if (item.geometries.length > 1) {
            let clusterBubble = new ClusterBubble({
              map,
              position: item.center,
              content: item.geometries.length
            });
            clusterBubble.on("click", () => {
              map.fitBounds(item.bounds);
            });
            clusterBubbleList.push(clusterBubble);
          } else {
            markerGeometries.push({
              position: item.center,
              properties: {
                //自定义属性
                title: `marker${index}`,
                sn: item.geometries[0].properties.sn
              }
            });
          }
        });
        if (marker) {
          // 已创建过点标记图层,直接更新数据
          marker.setGeometries(markerGeometries);
        } else {
          // 创建点标记图层
          marker = new TMap.MultiMarker({
            map,
            styles: {
              default: new TMap.MarkerStyle({
                width: 34,
                height: 42,
                anchor: {
                  x: 17,
                  y: 21
                },
                src: imgIconList[+deviceType - 1]
              })
            },
            geometries: markerGeometries
          });
          //初始化infoWindow
          var infoWindow = new TMap.InfoWindow({
            map: map,
            position: new TMap.LatLng(20, 110),
            offset: { x: -5, y: -32 } //设置信息窗相对position偏移像素
          });
          // 监听标注点击事件
          marker.on("click", function(evt) {
            // console.log(evt, "1111");
            //设置infoWindow
            infoWindow.open(); //打开信息窗
            infoWindow.setPosition(evt.geometry.position); //设置信息窗位置
            infoWindow.setContent(evt.geometry.properties.sn); //设置信息窗内容
          });
        }
      });
      // 以下代码为基于DOMOverlay实现聚合点气泡
      function ClusterBubble(options) {
        TMap.DOMOverlay.call(this, options);
      }

      ClusterBubble.prototype = new TMap.DOMOverlay();

      ClusterBubble.prototype.onInit = function(options) {
        this.content = options.content;
        this.position = options.position;
      };

      // 销毁时需要删除监听器
      ClusterBubble.prototype.onDestroy = function() {
        this.dom.removeEventListener("click", this.onClick);
        this.removeAllListeners();
      };

      ClusterBubble.prototype.onClick = function() {
        this.emit("click");
      };

      // 创建气泡DOM元素
      ClusterBubble.prototype.createDOM = function() {
        var dom = document.createElement("div");
        dom.classList.add(`clusterBubble${type}`);
        dom.innerText = this.content;
        dom.style.cssText = [
          "width: " + 40 + "px;",
          "height: " + 40 + "px;",
          "line-height: " + 40 + "px;"
        ].join(" ");

        // 监听点击事件,实现zoomOnClick
        this.onClick = this.onClick.bind(this);
        // pc端注册click事件,移动端注册touchend事件
        dom.addEventListener("click", this.onClick);
        return dom;
      };
      ClusterBubble.prototype.updateDOM = function() {
        if (!this.map) {
          return;
        }
        // 经纬度坐标转容器像素坐标
        let pixel = this.map.projectToContainer(this.position);

        // 使文本框中心点对齐经纬度坐标点
        let left = pixel.getX() - this.dom.clientWidth / 2 + "px";
        let top = pixel.getY() - this.dom.clientHeight / 2 + "px";
        this.dom.style.transform = `translate(${left}, ${top})`;

        this.emit("dom_updated");
      };
    },
    // 生成点的函数
    convertMarkers(type) {
      let markers = [];
      this.workbenchList.map((item, index) => {   // this.workbenchList起始数据
        if (item.lat && item.lng && item.lat !== "0" && !item.lng !== "0") {
          if (item.deviceType === type) {
            markers.push({
              id: item.id, //点标记唯一标识,后续如果有删除、修改位置等操作,都需要此id
              styleId: "myStyle", //指定样式id
              position: new TMap.LatLng(item.lat, item.lng), //点标记坐标位置
              properties: {
                //自定义属性
                title: `marker${index}`,
                sn: "设备编号:" + item.sn
              }
            });
          }
        }
      });
      return markers;
    },
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容