vue3 运用高德地图 自定义弹框 为信息窗体 添加 new AMaps.value.InfoWindow 添加事件

news2024/11/18 0:25:30

效果图
在这里插入图片描述
划过散点的时候出现每个三点位置的数据提示
在这里插入图片描述
点击具体散点获取展示信息弹框,并为其添加点击事件
在这里插入图片描述
注意点:
1 即使是用的vue,也不能使用@click为窗体添加点击事件,需要使用onclick,
(原因:这是因为你的弹窗内容是以字符串的形式插入到 DOM 中的。此时你给它添加的点击事件不会被 Vue 的事件监听系统所识别和处理,因为这是在 Vue 的作用范围之外的。但是,如果你把这个函数挂载到 window 对象上,那么无论在哪个地方调用这个函数,浏览器都能找到并且执行它)。

2 并且在定义了函数后,使用该函数还是会报函数未定义的错误,需要在window下添加该函数,点击时可以在原型链中找到该函数。
3 设置信息窗体,并为信息窗体里的函数添加点击事件。
处理过程:
1 给每一个 infowindow 加上一个类名,然后进行绑定事件,
2 高德地图 infowindow 不会马上就渲染出来,只有点击 marker 之后才会生成
3 所以需要在生成 infowindow 后才能绑定事件

在这里插入图片描述
在这里插入图片描述

代码实现

<template>
  <div>
    <div class="top-box">
      <Title title="煤矿地理分布图" />
      <seachIpt @clickSearch="clickSearch" />
    </div>
    <div class="map-box" v-loading="loading">
      <div class="icon">
        <span @click="postMine('container')" class="left-back">返回主地图</span>
        <span class="iconfont icon-a-zujian28421" @click="handleFullScreen"></span>
      </div>
      <div ref="chinaMap" id="container" class="map-content"></div>
      <leftMark />
    </div>
  </div>
  <mapDialog v-model:value="show" />
</template>

<script lang="ts" setup>
import AMapLoader from '@amap/amap-jsapi-loader'
import LabelsData from './china'
import Title from '../title.vue'
import leftMark from './left-mark.vue'
import seachIpt from './seachIpt.vue'
import { ElMessage } from 'element-plus'
import { postMineInfo } from '@/api/dashboard/index'
import mapDialog from './mapDialog.vue'
import { useRouter } from 'vue-router'
let show = ref(false)
let infoWindow = ref(null)
const handleFullScreen = () => {
  infoWindow.value?.close()
  show.value = true
}

//搜索
const clickSearch = (v: string) => {
  getMineInfo(v)
}

//获取该煤矿信息
let dataList = ref([])
const getMineInfo = (v: string) => {
  infoWindow.value = null
  postMineInfo({ mineName: v, region: 1 })
    .then((res: any) => {
      const { data, success } = res
      if (success) {
        if (data?.length > 0) {
          //构建信息窗体中显示的内容
          dataList.value = data[0]
          var info = []
          info.push(`<div style='font-size: 16px;'>
            <div style=' display: flex;align-items: center;justify-content: space-between;margin-bottom:8px ;padding-bottom:4px; border-bottom: 1px solid #eeeeee;'>
              <el-tooltip class="box-item" effect="dark" :content="${
                data[0].mineName
              }" placement="top">
                <span class="left-title" style="color: #3076fe; cursor: pointer;" data-id="moreIds" onclick="more(event)">
                  ${data[0].mineName}
                </span>
              </el-tooltip>
            </div>
            <div class="content">
              <div style='display: flex;line-height: 30px;'>
                <span style='text-align: right;width: 129px;color: #707070;'>所属片区: </span>
                <span style='width: 206px;color: #262626;'>${
                  data[0].zmjArea || '--'
                }</span>
              </div>
              <div style='display: flex;line-height: 30px;'>
                <span style='text-align: right;width: 129px;color: #707070;'>煤矿位置: </span>
                <span style='width: 206px;color: #262626;'>${
                  data[0].province ||
                  data[0].city ||
                  data[0].region ||
                  data[0].orgAddress
                    ? (data[0].province ? data[0].province : '') +
                      (data[0].city ? data[0].city : '') +
                      (data[0].region ? data[0].region : '') +
                      (data[0].orgAddress ? data[0].orgAddress : '')
                    : '--'
                }</span>
              </div>
              <div style='display: flex;line-height: 30px;'>
                <span style='text-align: right;width: 129px;color: #707070;'>煤矿性质: </span>
                <span style='width: 206px;color: #262626;'>${
                  data[0].mineProperty || '--'
                }</span>
              </div>
              <div style='display: flex;line-height: 30px;'>
                <span style='text-align: right;width: 129px;color: #707070;'>核定生产能力: </span>
                <span style='width: 206px;color: #262626;'>${
                  data[0].actualProductCapacity || '--'
                }${data[0].actualProductCapacity ? '万吨' : ''}</span>
              </div>
              <div style='display: flex;line-height: 30px;'>
                <span style='text-align: right;width: 129px;color: #707070;'>是否ZMJ客户: </span>
                <span style='width: 206px;color: #262626;'>${
                  data[0].customer === 1 ? '是' : '否'
                }</span>
              </div>
            </div>
          </div>`)
          infoWindow.value = new AMaps.value.InfoWindow({
            anchor: 'top-left',
            content: info.join('') //使用默认信息窗体框样式,显示信息内容
          })
          let amplify = ref(0)
          if (data[0].zmjArea !== '国际') {
            amplify.value = 10
          } else {
            amplify.value = 5
          }
          infoWindow.value.open(map.value, [data[0].longitude, data[0].latitude])
          map.value.setZoomAndCenter(amplify.value, [data[0].longitude, data[0].latitude])
        } else ElMessage.error('暂未查到该煤矿信息')
      } else {
        ElMessage.error(res.message)
      }
    })
    .catch((err) => {
      console.log(err)
    })
}

const chinaMap = ref()
let AMaps = ref(null)
let map = ref(null)

let normalMarker = ref(null)
let labelsLayer = ref(null)
let markers = ref([])
const imgList = ref([
  new URL(`@/assets/home/blue-mark.png`, import.meta.url).href,
  new URL(`@/assets/home/green-mark.png`, import.meta.url).href
])

onActivated(() => {
  postMine('container')
})

const router = useRouter()
const toMineDetails = (val:any ) => {
  router.push({
    name: 'mineBasicInfoDetail',
    params: { model: val?.mineName },
    query: { id: val?.mineId, projectName: val?.mineName }
  })
}

let loading = ref(false)
//获取煤矿地理坐标
const postMine = (dom: any) => {
  loading.value = true
  postMineInfo({ region: 1 })
    .then((res: any) => {
      const { data, success } = res
      if (success) {
        initMap(data, dom)
      } else {
        initMap([], dom)
      }
    })
    .catch(() => {
      initMap([], dom)
    })
    .finally(() => {
      loading.value = false
    })
}
//初始化地图加载
const initMap = (data: any, dom: any) => {
  const AMapLoad = ref<any>(AMapLoader)
  // map.value && map.value.destroy()
  AMapLoad.value
    .load({
      key: '337c7e7dda33e11839f80aa219f2fc8a', // 申请好的Web端开发者Key,首次调用 load 时必填
      // version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
      plugins: [
        'AMap.DistrictSearch',
        'AMap.DistrictLayer',
        'AMap.Map',
        'AMap.Polygon',
        'AMap.LabelsLayer',
        'AMap.LabelMarker',
        'AMap.Marker'
      ], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
      AMapUI: {
        //重点就是这个
        version: '1.0',
        plugins: ['misc/PathSimplifier', 'overlay/SimpleMarker'] //SimpleMarker设置自定义图标,PathSimplifier轨迹展示组件
      }
    })
    .then((AMap: any) => {
      AMaps.value = AMap
      map.value = new AMap.Map(dom, {
        layers: [
          // disWorld,
        ],
        // resizeEnable: true,
        viewMode: '3D',
        zIndex: 5,
        zoom: 3,
        zoomEnable: true, //地图是否可缩放
        dragEnable: true, // 地图是否可通过鼠标拖拽平移
        rotateEnable: false, // 地图是否可旋转
        // mapStyle: 'amap://styles/10f9d1d306dec0990c6048597ab3bfcb',
        zooms: [4.3, 20], // 缩放级别范围
        center: [105.602725, 37.076636],
        defaultCursor: 'pointer', // 地图默认鼠标样式
        showLabel: true, // 是否展示地图文字和 POI 信息。
        showIndoorMap: false, // 是否自动展示室内地图,默认是 false
        features: ['bg', 'building', 'road', 'point']
      })
      const _window = window as any
      nextTick(()=>{
        _window.more = (event:any) => {
          const e = event.currentTarget
          const element = e.getAttribute('data-id')
          toMineDetails(dataList.value)
        }
      })
      // DistrictExplorer_fn(AMap) // 下钻

      //地图加载完成事件
      map.value.on('complete', () => {
        var layer = new AMap.LabelsLayer({
          // 开启标注避让,默认为开启,v1.4.15 新增属性
          collision: false,
          // 开启标注淡入动画,默认为开启,v1.4.15 新增属性
          animation: false
        })
        for (var i = 0; i < LabelsData.length; i++) {
          LabelsData[i].text.style = {
            fillColor: '#777c82'
          }
          var labelsMarker = new AMap.LabelMarker(LabelsData[i])
          layer.add(labelsMarker) // 省份文字
        }
        map.value.add(layer)
        markers_fn(data, AMap) // 散点
      })
      map.value.on('click', (e: any) => {
        map.value.clearInfoWindow()
      })
    })
    .catch((e: any) => {
      console.error(e) //加载错误提示
    })
    .finally(() => {
      loading.value = false
    })
}
//散点标记
const markers_fn = (data: any, AMap: any) => {
  normalMarker.value = new AMap.Marker({
    anchor: 'bottom-center',
    offset: [0, 0]
  })
  labelsLayer.value = new AMap.LabelsLayer({
    zooms: [4.3, 20],
    zIndex: 200,
    // 关闭标注淡入动画
    collision: false,
    // 设置 allowCollision:true,可以让标注避让用户的标注
    allowCollision: false
  })
  map.value.add(labelsLayer.value)

  let icon = {
    type: 'image',
    anchor: 'bottom-center'
  }
  markers.value = []
  data.forEach((item: any, i: number) => {
    let labelMarker = new AMap.LabelMarker({
      title: `${item.mineName}-${item.mineId}`,
      position: [item.longitude, item.latitude],
      zIndex: item.customer === 1 ? 20 : 16,
      icon: {
        image: item.customer === 1 ? imgList.value[0] : imgList.value[1],
        ...icon
      }
    })
    markers.value.push(labelMarker)
    labelMarker.on('mouseover', function (e: any) {
      let strArr = e.data.data.name.split('-')
      let position = e.data.data && e.data.data.position
      let pixel = e.pixel

      normalMarker.value.setContent(
        `<div class="amap-info-window" style="top:${pixel.y}px;left:${pixel.x}px;">
          ${strArr[0]}
          <div class="amap-info-sharp"></div>
        </div>`
      )
      normalMarker.value.setPosition(position)
      map.value.add(normalMarker.value)
    })
    labelMarker.on('mouseout', function () {
      map.value.remove(normalMarker.value)
    })

    labelMarker.on('click', function (e: any) {
      let strArr = e.data.data.name.split('-')
      getMineInfo(strArr[0])
    })
  })
  labelsLayer.value.add(markers.value)
}
</script>

<style scoped lang="scss">
@import './map.scss';
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1858823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 13 创建静态快捷方式shortcuts

参考 创建快捷方式 原生系统上&#xff0c;长按应用图标显示快捷方式&#xff0c;点击快捷方式就打开应用的某个页面。 给自己的应用也加一下。 1.清单文件添加 在应用的主页面添加如下&#xff0c;shortcuts 就是要配置的文件。 <meta-dataandroid:name"android.…

01 Swift 基础语法(变量,常量,注释,整数,浮点数,元组)

Swift 介绍 Swift 是一门用于开发 iOS、macOS、watchOS 和 tvOS 应用的新编程语言。它以安全、快速和互动的特点而著称。Swift 提供了代码预览&#xff08;playgrounds&#xff09;功能&#xff0c;使程序员可以在不编译和运行应用程序的情况下&#xff0c;实时运行 Swift 代码…

多模态-大模型:MLLM综述(适用初学)

文章目录 前言一、多模态模型基础知识二、多模态指令调优&#xff08;M-IT&#xff09;1.MLLM基础2.模态对齐3.数据获取4.模态桥接 三、多模态上下文学习&#xff08;M-ICL&#xff09;三、多模态思维链 (M-CoT)四、LLM辅助视觉推理1.训练范式2. LLM功能 五、一些思考总结 前言…

索引的分类和回表查询——Java全栈知识(29)

索引的分类和回表查询 Mysql 的索引按照类型可以分为以下几类&#xff0c;但是我们使用的 InnoDB 只支持主键索引&#xff0c;唯一索引&#xff0c;普通索引&#xff0c;并不支持全文索引。 1、聚集索引和二级索引 InnoDB 可以将索引分为两类分别是聚集索引和二级索引&…

模板匹配算法:基于模板相关性匹配的手写数字识别

1 前言 得益于硬件技术的发展&#xff0c;基于深度学习的各种识别方法如火如荼&#xff0c;在各种应用场景中都取得很好的效果。本人入行深度学习领域若干年&#xff0c;做过很多项目的工程化评估&#xff0c;对于神经网络是如何工作的也解释不清楚&#xff0c;只是知道这样做是…

如何借用物联网快速实现高标准农田信息化

如何借用物联网快速实现高标准农田信息化 高标准农田信息化&#xff0c;作为现代农业发展的重要基石&#xff0c;是指在建设高产、稳产、节水、环保的农田基础上&#xff0c;深度融合现代信息技术&#xff0c;实现农田管理的精准化、智能化和高效化。物联网&#xff08;Intern…

[Angew]:调整单原子 Pt1/CeO2催化剂中铂的局部环境以实现稳定的低温 CO 氧化

通过热冲击合成调整孤立 Pt2+的局部环境,开发出一种用于 CO 氧化的高活性和坚固的单原子 Pt1/CeO2催化剂(见图)。惰性气氛中的超快冲击波在非对称 Pt1O4结构中产生 Pt 单原子,从而大大增强了低温活性,并且在氧化条件下仍能保持活性。 摘要:通过原子捕获(AT,800C空气中…

pycharm在pytorch环境的使用

前言 有时我们使用jupyter感觉不习惯&#xff0c;想使用编译器进行相关任务。在安装好pytorch环境下&#xff0c;我们可以使用pycharm等编译器进行完成任务等操作。 安装pycharm不做赘述。配置安装好pytorch环境可以参考我前一篇博客&#xff1a; 深度学习工具jupyter创建并检…

基于Java考研助手网站设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

海南聚广众达电子商务咨询有限公司抖音开店怎么样?

在数字化浪潮汹涌的当下&#xff0c;电商行业正迎来前所未有的发展机遇。作为抖音电商服务领域的佼佼者&#xff0c;海南聚广众达电子商务咨询有限公司凭借其专业的服务团队和前瞻的战略眼光&#xff0c;成为了众多品牌和商家在抖音平台上实现业务增长的重要合作伙伴。今天&…

毫米波移动通信系统中的波束赋形—模数混合的波束赋形架构

模数混合的波束赋形将波束赋形分为了模拟波束赋形与数字波束赋形两部分&#xff0c;其模拟部分通过移相器实现&#xff0c;数字部分通过基带预编码实现&#xff0c;&#xff0c;其结构如图2所示。当射频链路数目NRF为1时&#xff0c;认为其是一种特殊的模数混合的波束赋形。 此…

linux企业级CDN/100万并发架构设计/企业故障案例、网站优化架构原则

高薪思想&#xff1a;财富来源于信息差 什么是cdn&#xff1f; cdn全称是contenct delivery network内容分发网络 cdn是一套分布式&#xff0c;缓存&#xff0c;集群&#xff0c;范围可以是全球或全国&#xff0c;运行的实质是通过智能DNS获取用户的来源地域以及上网线路 为…

perfect-scrollbar缩小浏览器窗口滚动条无线滚动的bug

https://github.com/mdbootstrap/perfect-scrollbar/issues/153

【tcomat】聊聊tomcat是如何打破双亲委派模型进行类加载的

双亲委派模型 对于JVM类加载器来说&#xff0c;其实就是如下的code&#xff0c;JDK提供的三个类加载器&#xff0c;每个类加载器都加载自己范围内的类。Boot\EXT\APP 三个。双亲委派一句话就是&#xff0c;先让老爸处理&#xff0c;老爸处理不了&#xff0c;给爷爷。爷爷处理不…

java数据结构-链表经典习题

前言 上一篇讲解了链表的基本操作详解&#xff0c;接下来练习一下链表的应用。 目录 1.删除链表中等于给定值 val 的所有节点。 题解思路 2.反转一个单链表 思路分析 画图分析 代码实现 3.链表的中间结点 思路分析 画图分析 代码实现 4.链表中倒数最后k个结点 第一解决…

IPV6典型实验

实验要求&#xff1a; 1、R1和R2之间使用静态IPV6地址互联 2、R2作为DHCPIPV6服务器给R3分配全球单薄地址 3、R4接口通过R2的RA进行无状态地址自动分配 4、配置静态路由&#xff0c;实现设备直接互访。 R1&#xff1a; ipv6 #系统视图使设备能够处理IPV6报文 interface Gigabi…

《好内容成就好商单—巨量星图内容洞察全量培训课件》

本报告详细阐述了如何通过优质内容挖掘商业机会,包括平台升级规划、内容营销新机、如何做好内容以及怎么选对达人等关键议题。报告中深入分析了抖音内容生态的繁荣,以及如何利用巨量星图平台进行内容洞察和达人选择,以实现高效种草和转化。报告还介绍了多种选人方式和热点洞察工…

《2024年战略管理趋势报告》

本报告由Quantive发布。 《2024年战略管理趋势报告》这份报告深刻剖析了企业在策略管理上的当前状态、面临的挑战以及未来发展的趋势。报告指出,大多数组织在迅速适应市场变化方面存在困难,并且许多企业未能实现其战略目标,显示出策略制定与执行之间存在脱节。报告中不仅强调了…

000005 - HDFS 读写流程

HDFS 读写流程 1 HDFS 写数据流程1.1 HDFS 写数据流程图1.2 HDFS 写数据之网络拓扑 - 节点距离计算1.3 机架感知&#xff08;副本存储节点选择&#xff09; 2 HDFS 读数据流程2.1 HDFS 读数据流程图 3 HDFS 如何做到机架感知 1 HDFS 写数据流程 1.1 HDFS 写数据流程图 &#x…

Latex学习之“usefont”用法

Latex学习之“\usefont”用法 一、通俗的解释 \usefont 是 LaTeX 中的一个命令&#xff0c;用于在文档中临时改变字体&#xff0c;其基本语法如下&#xff1a; \usefont{字体编码}{字体族}{字体系列}{字体形状}这样看起来好像蛮抽象&#xff0c;你可能以及晕了&#xff0c;什…