vue 实现高德地图 点聚合

效果图

image.png

第三方相关

    <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key='高德后台获取(Web服务)'"></script>
    <script type="text/javascript" src="http://webapi.amap.com/ui/1.0/main.js"></script>

业务代码

<template>
  <div class="map-box">
    <div id="js-container" class="map"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      chooseValue: [],
      AMapUI: null,
      AMap: null
    }
  },
  async created() {
    this.getPointData()
  },
  methods: {
    /**
     * @Description: 获取后端景区数据
     * @Author: you name
     * @Date: 2021/4/2
     */
    getPointData() {
      const pointData = [
        {
          'id': 30,
          'name': '测试',
          'desc': '测试测试测试测试测试测试测试测试测试测试',
          'img': 'http://twst.isart.me/1617957949747_微信图片_202103241717127.jpg',
          'lon': 99.085249,
          'lat': 36.766608
        }
      ]
      this.initMap(pointData)
    },

    /**
     * @Description: 实例化地图
     * @Author: you name
     * @Date: 2021/4/2
     */
    initMap(points) {
      console.log(points)
      let AMapUI = this.AMapUI = window.AMapUI
      let AMap = window.AMap
      this.AMap = window.AMap
      AMapUI.loadUI([ 'control/BasicControl' ], BasicControl => {
        // 根据经纬度 定位map的初始位置
        const map = new AMap.Map('js-container', {
          center: [ '108.93879', '34.535061' ],
          zoom: 5
        })

        /*
          // 接入 放大/缩小 的插件zhuru
          map.addControl(new BasicControl.Zoom({
            position: 'rb'
            // showZoomNum: true //是否显示zoom值
          }))
        */

        const markers = []

        for (var i = 0; i < points.length; i += 1) {
          // 整理每项标记的数据格式
          const markersItem = new AMap.Marker({
            map: map,
            id: points[i].id,
            position: [ points[i].lon, points[i].lat ],
            name: points[i]['name'],
            desc: points[i]['desc'],
            img: points[i]['img'],
            content: '<div style="width: 14px;height: 14px;border-radius: 50%;padding: 2px;border: 1px solid #409eff;background-color: #409eff;background-clip: content-box;"></div>',
            offset: new AMap.Pixel(-15, -15)
          })
          // 为每项标记添加点击事件
          markersItem.on('click', event => {
            // 关闭弹窗
            const closeInfoWindow = () => {
              map.clearInfoWindow()
            }
            //构建信息窗体
            const createInfoWindow = (title, content) => {
              let info = document.createElement('div')
              info.className = 'custom-info input-card content-window-card'
              // 顶部标题
              let top = document.createElement('div')
              let titleD = document.createElement('div')
              let closeX = document.createElement('img')
              top.className = 'info-top'
              titleD.innerHTML = title
              closeX.src = require('../../assets/images/icon/x.png')
              closeX.onclick = closeInfoWindow
              top.appendChild(titleD)
              top.appendChild(closeX)
              info.appendChild(top)
              // 中部内容
              var middle = document.createElement('div')
              middle.className = 'info-middle'
              middle.innerHTML = content
              info.appendChild(middle)
              const el_button = middle.querySelector('.info-middle-content').querySelector('.info-middle-content-btn')

              let clickItem = {
                id: event.target.w.id,
                name: event.target.w.name,
                img: event.target.w.img
              }

              if (this.chooseValue.map(i => i.id).includes(clickItem.id)) {
                el_button.innerHTML = '已添加'
              } else {
                el_button.innerHTML = '添加'
              }

              el_button.onclick = () => {
                if (el_button.innerHTML === '添加') {
                  // 添加景区标记
                  el_button.innerHTML = '已添加'
                  this.chooseValue.push(clickItem)
                  console.log(this.chooseValue)
                } else {
                  // 移除景区标记
                  el_button.innerHTML = '添加'
                  this.chooseValue.splice(this.chooseValue.indexOf(clickItem), 1)
                }
              }
              return info
            }

            const contentArr = []
            let title = event.target.w.name
            contentArr.push(`<img src="${ event.target.w.img }">`)
            contentArr.push(`<div class="info-middle-content">
              <div class="info-middle-content-text">${ event.target.w.desc }</div>
              <div class="info-middle-content-btn">${ this.chooseValue.includes(event.target.w.id) ? '已添加' : '添加' }</div>
            </div>`)
            // 定义信息窗体
            let infoWindow = new AMap.InfoWindow({
              isCustom: true,  //使用自定义窗体
              content: createInfoWindow(title, contentArr.join('')),
              offset: new AMap.Pixel(0, -15)
            })
            // 打开信息窗体
            infoWindow.open(map, markersItem.getPosition())
          })
          // 存储标记
          markers.push(markersItem)
        }
        // 接入点聚合的插件
        map.plugin([ 'AMap.MarkerClusterer' ], function() {
          new AMap.MarkerClusterer(map, markers, { gridSize: 80 })
        })
      })
    }
  }
}
</script>

<style lang="scss" scoped>
  .map-box {
    width: 100vw;
    height: 100vh;
  }

  .map {
    width: 100vw;
    height: 100vh;
    -moz-user-select: none; /* Firefox私有属性 */
    -webkit-user-select: none; /* WebKit内核私有属性 */
    -ms-user-select: none; /* IE私有属性(IE10及以后) */
    -khtml-user-select: none; /* KHTML内核私有属性 */
    -o-user-select: none; /* Opera私有属性 */
    user-select: none; /* CSS3属性 */
  }

  .content-window-card {
    position: relative;
    bottom: 0;
    left: 0;
    width: auto;
    padding: 0;
    box-shadow: 0 7px 38px 0 rgba(145, 142, 142, 0.15);
  }

  .info-top {
    position: relative;
    background: #f5f7fa;
    border-radius: 5px 5px 0 0;
  }

  .info-top div {
    display: inline-block;
    color: #333333;
    font-size: 14px;
    font-weight: bold;
    line-height: 31px;
    padding: 0 10px;
  }

  .info-top img {
    position: absolute;
    top: 7px;
    right: 10px;
    transition-duration: 0.25s;
    width: 18px;
    height: 18px;
  }

  .info-middle {
    font-size: 12px;
    padding: 10px 6px;
    line-height: 20px;
    background-color: #ffffff !important;
    border-radius: 0 0 5px 5px;
    display: flex;
  }

  .info-middle img {
    border-radius: 5px;
    object-fit: cover;
    width: 100px !important;
    height: 80px !important;
    margin: auto;
  }

  .info-middle-content {
    margin-left: 8px;
    width: 200px;
  }

  .info-middle-content-text {
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 4;
  }

  .info-middle-content-btn {
    margin: auto;
    text-align: center;
    width: 40px;
    border: 1px solid #57acfb;
    border-radius: 5px;
    color: #57acfb;
    font-size: 12px;
    cursor: pointer;
  }
</style>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容