vue 项目中高德地图自定义覆盖物绑定自定义弹窗

vue yekong 487℃

在之前的vue 项目中使用高德地图自定义图标覆盖物我们实现了自定义图标覆盖物,这里我们来给自定义覆盖物绑定自定义弹窗。

vue 项目中高德地图自定义覆盖物绑定自定义弹窗

演示地址

vue 项目中高德地图自定义覆盖物绑定自定义弹窗

首先引入高德地图

在vue项目中的index.html中引入高德地图,这里的key需要自己申请。

<script
        type="text/javascript"
        src="https://webapi.amap.com/maps?v=1.4.15&key=your key&plugin=AMap.Geocoder,AMap.RangingTool,AMap.Heatmap"
></script>
<script src="//webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>

html

使用div用来渲染高德地图

<template>
  <div class="maps">
    <div ref="allmap" class="mapsMain"></div>
  </div>
</template>

初始化高德地图

这里的地图使用的是卫星图,并渲染图标

// 高德地图相关
    getGdMap() {
      var that = this;
      that.map = new AMap.Map(this.$refs.allmap, {
        scrollWheel: true,
        viewMode: '2D',
        resizeEnable: true,
        layers: [ //使用多个图层
          new AMap.TileLayer.Satellite() //使用卫星图
        ],
        zoom: 14,
        maxZoom: 30,
        minZoom: 0,
        center: [121.22989570399066, 31.02782839832306],
      });
// 渲染基地列表
      this.jidilist.forEach((location) => {
        this.createMarker(location, icon_jidi, 'jidilist');
      });

// 渲染地块列表
      this.dikuaiList.forEach((location) => {
        this.createMarker(location, icon_dikuai, 'dikuaiList');
      });

// 渲染车辆列表
      this.carList.forEach((location) => {
        const icon = location.onLine === '在线' ? icon_cheliang : icon_cheliang_lixian;
        this.createMarker(location, icon, 'carList');
      });
    },

给图标绑定点击事件

这里我们封装一个方法,接收经纬度 图标地址 以及类型,我们根据类型显示不同的弹窗,并给弹窗传我们需要的自定义值。并给弹窗关闭按钮绑定点击事件,点击后关闭弹窗。

createMarker(location, iconSrc, type) {
      var that = this;
      // 创建 marker
      const marker = new AMap.Marker({
        position: location.position,
        icon: new AMap.Icon({
          size: new AMap.Size(38, 43),
          image: iconSrc,
          imageSize: new AMap.Size(38, 43)
        }),
        offset: new AMap.Pixel(-19, -21.5)
      });

      // 根据类型定制弹窗内容
      let title = '';
      let icon = '';
      let infoClass = '';
      let statusHTML = ''; // 状态信息的HTML字符串
      let bodyHTML = ''; // 状态信息的HTML字符串

      switch (type) {
        case 'dikuaiList':
          title = '地块信息';
          icon = icon_dikuai2;
          infoClass = 'dikuaiList';
          bodyHTML = `<div class="bodyInfo">
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>作物品种:<em>土豆</em></span>
                        </div>
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>经纬度:<em>49</em></span>
                        </div>
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>种植面积:<em>72</em></span>
                        </div>
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>海拔:<em>29</em></span>
                        </div>
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>土壤类型:<em>沙土</em></span>
                        </div>
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>坡度:<em>缓坡</em></span>
                        </div>
                        <div class="bodyInfoItem2">
                        <img src="${dot}" alt="">
                        <span>所属基地:<em>所属基地</em></span>
                        </div>
                        </div>`
          break;
        case 'carList':
          title = '车辆信息';
          icon = icon_cheliang2;
          infoClass = location.onLine === '在线' ? 'carlist-online' : 'carlist-offline';
          // 根据在线状态动态添加status
          statusHTML = location.onLine === '在线' ?
              '<span class="status" style="color: green;">在线</span>' :
              '<span class="status2" style="color: grey;">离线</span>';
          bodyHTML = `<div class="bodyInfo">
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>车辆类型:<em>耕种机</em></span>
                        </div>
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>当日作业面积:<em>102亩</em></span>
                        </div>
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>编号:<em>S0208</em></span>
                        </div>
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>电话:<em>12345</em></span>
                        </div>
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>驾驶员:<em>驾驶员</em></span>
                        </div>
                        <div class="bodyInfoItem">
                        <img src="${dot}" alt="">
                        <span>无故障作业时间:<em>0分</em></span>
                        </div>
                        <div class="bodyInfoItem2">
                        <img src="${dot}" alt="">
                        <span>所属基地:<em>基地名称</em></span>
                        </div>
                        </div>`
          break;
      }

      const infoWindow = new AMap.InfoWindow({
        isCustom: true, // 使用自定义窗口
        content: document.createElement('div'), // 创建一个div元素用于内容填充
        offset: new AMap.Pixel(0, -40)
      });

      // 设置内容
      const content = document.createElement('div');
      content.className = 'gdPopWin' + ' ' + infoClass
      content.innerHTML = `
    <div class="gdPopWinInner">
      <div class="gdPopWinInnerTop">
        <div class="gdPopWinInnerTopLeft">
          <img src="${icon}" alt="icon" class="gdPopWinIcon" />
          <span class="gdPopWinTitle">${title}</span>
          ${statusHTML}  <!-- 这里插入状态 -->
        </div>
        <div class="gdPopWinInnerTopRight">
          <img src="${close}" alt="close" class="gdPopWinClose" />
        </div>
      </div>
      <!-- 这里可以根据需要添加更多的信息 -->
       ${bodyHTML}
    </div>
  `;

      // 找到关闭按钮,并为其添加点击事件监听器
      const closeButton = content.querySelector('.gdPopWinClose');
      closeButton.addEventListener('click', function () {
        infoWindow.close();
      });

      // 更新信息窗口内容
      infoWindow.setContent(content);

      // marker 点击时显示信息窗口
      marker.on('click', function () {
        infoWindow.open(that.map, marker.getPosition());
      });

      // 添加 marker 到地图
      that.map.add(marker);
    },

到这里vue 项目中高德地图自定义覆盖物绑定自定义弹窗效果就完成了。

更多高德地图实例

vue 高德地图效果实例汇总

实例代码下载

项目基于vue3 vite js node.js 16 开发

相关文件下载地址
此资源需支付 ¥1 后下载
支付宝购买扫右侧红包码购买更优惠,如无法下载请联系微信:17331886870
喜欢 (0)
vue 项目中高德地图自定义覆盖物绑定自定义弹窗