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

效果图
在这里插入图片描述
划过散点的时候出现每个三点位置的数据提示
在这里插入图片描述
点击具体散点获取展示信息弹框,并为其添加点击事件
在这里插入图片描述
注意点:
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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PPO代码理解

目录 # Finding the ratio (pi_theta / pi_theta__old): ratios torch.exp(logprobs - old_logprobs.detach()) advantages rewards - state_values.detach() surr1 ratios * advantages surr2 torch.clamp(ratios, 1-self.eps_clip, 1self.eps_clip) * advantages l…

农业四情监测设备——提高农业生产的效率和质量

TH-Q1农业四情监测设备是用于实时监测农业领域的四大关键监测内容的设备&#xff0c;这些内容包括土壤墒情、苗情、病虫情和灾情。以下是关于农业四情监测设备的详细介绍&#xff1a; 主要用于实时测量农田土壤的水分状况。包含土壤湿度传感器、土壤温度传感器等&#xff0c;安…

获取打包后jar包内resource文件路径

Exception:java.lang.IllegalArgumentException: URI is not hierarchical 出现这个异常有很多原因&#xff0c;这里只描述一下我所遇到的 这是源代码&#xff0c;这段代码在本地运行是没有问题的&#xff0c;但是打成jar包&#xff0c;拿到linux上运行之后&#xff0c;就会出…

羊大师:拒绝心灵内耗:走向高效与平和

在繁忙的生活中&#xff0c;我们时常感到疲惫不堪&#xff0c;仿佛心灵被无形的枷锁束缚&#xff0c;这就是精神内耗。它让我们在思考、决策和行动中犹豫不决&#xff0c;消耗着我们的精力和时间&#xff0c;让我们无法专注于真正重要的事情。然而&#xff0c;我们有能力打破这…

【EverEdit】活用 EverEdit 小技巧

【EverEdit】活用 EverEdit 小技巧 &#xff08;1&#xff09;设置 EverEdit 对比文件文本内容 设置如下图所示&#xff1a; 首先要先打开要对比的文本文件&#xff0c;和对比文件相比&#xff0c;此时打开了至少两个文件&#xff1a; 选择文件比较&#xff1a; &#xff08…

C语言---数据结构(1)--时间复杂和空间复杂度计算

1.什么是时间复杂度和空间复杂度 1.1算法效率 算法效率分为时间效率和空间效率 时间效率被称为时间复杂度&#xff0c;而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空间复杂度主要衡量一个算法所需要的额外空间&#xff0c;在计算…

python自动化系列:自动制作PPT演示稿(多种元素)

作品介绍 作品名称&#xff1a;自动制作PPT演示稿&#xff08;多种元素&#xff09; 开发环境&#xff1a;PyCharm 2023.3.4 python3.7 用到的库&#xff1a;pptx 作品简介&#xff1a;该实例使用python-pptx库从头开始创建一个包含多种元素&#xff08;如标题、文本、图片…

中国能源统计年鉴(1986-2023年)

数据年份&#xff1a;1986-2023年&#xff0c;无1987、1988、1990三年&#xff0c;1991-2023年齐 数据格式&#xff1a;pdf、excel 数据内容&#xff1a;《中国能源统计年鉴》是一部反映中国能源建设、生产、消费、供需平衡的权威性资料书。 共分为7个篇章&#xff1a;1.综合&a…

AI赋能天气:微软研究院发布首个大规模大气基础模型Aurora

编者按&#xff1a;气候变化日益加剧&#xff0c;高温、洪水、干旱&#xff0c;频率和强度不断增加的全球极端天气给整个人类社会都带来了难以估计的影响。这给现有的天气预测模型提出了更高的要求——这些模型要更准确地预测极端天气变化&#xff0c;为政府、企业和公众提供更…

Python-矩阵元素定位

[题目描述] 小理得到了一个 n 行 m 列的矩阵&#xff0c;现在他想知道第 x 行第 y 列的值是多少&#xff0c;请你帮助他完成这个任务。输入格式&#xff1a; 第一行包含两个数 n 和m &#xff0c;表示这个矩阵包含 n行 m 列。从第 2 行到第 n1 行&#xff0c;每行输入 m 个整数…

vue中用JSON格式查看数据(vue-json-viewer)

vue中把string用JSON格式展示数据 vue-json-viewer使用 官网地址&#xff1a;https://www.npmjs.com/package/vue-json-viewer 1. 安装插件vue-json-viewer //vue2 npm install vue-json-viewer2 --save //vue3 npm install vue-json-viewer3 --save2. 引入vue-json-viewer…

“论SOA在企业集成架构设计中的应用”写作框架,系统架构设计师

论文真题 企业应用集成(Enterprise Application Integration, EAI)是每个企业都必须要面对的实际问题。面向服务的企业应用集成是一种基于面向服务体系结构(Service-OrientedArchitecture,SOA&#xff09;的新型企业应用集成技术&#xff0c;强调将企业和组织内部的资源和业务…

【C语言】函数执行背后的秘密:函数栈帧的创建和销毁超详解

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 目录 1. 什么是函数栈帧 2. 理解函数栈帧能解决什么问题呢&#xff1f; 3. 函数栈帧的创建和销毁解析 3.1 什么是栈&#xff1f; 3.2 认识相关寄存器和汇编指…

vscode在windows系统上进行C/C++环境配置

随手笔记前言 vscode在windows系统上进行C/C环境配置 步骤如下 第一步 下载安装VSCode 这应该是最简单的一步&#xff0c;相信大家自己就可以完成。如果在vscode官网感觉下载特别慢的话&#xff0c;可以去试一下腾讯软件中心&#xff0c;我都是在这个网页上下载的。下载好之…

Huffman树——AcWing 148. 合并果子

目录 Huffman树 定义 运用情况 注意事项 解题思路 AcWing 148. 合并果子 题目描述 运行代码 代码思路 其它代码 代码思路 Huffman树 定义 它是一种最优二叉树。通过构建带权路径长度最小的二叉树&#xff0c;经常用于数据压缩等领域。 运用情况 在数据压缩中&a…

RK3568开发笔记(三):瑞芯微RK3588芯片介绍,入手开发板的核心板介绍

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139905873 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

格雷码计数器

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 实现4bit位宽的格雷码计数器。 电路的接口如下图所示。 输入描述&#xff1a; input clk, input rst_n 输出描述&#xff1a; output reg [3:0] gray_out 参考代码 timescale 1ns/1nsmod…

等级保护测评中的建设整改要做什么?

随着信息技术的飞速发展&#xff0c;信息系统已成为现代社会运转的核心。然而&#xff0c;网络安全问题的日益突出&#xff0c;使得信息系统的安全稳定运行面临着严峻挑战。为了有效应对这一挑战&#xff0c;我国推行了等级保护制度&#xff0c;其中建设整改作为等级保护工作的…

指令微调数据集构建方法

指令微调&#xff08;Instruction Tuning&#xff09;&#xff0c;是指使用自然语言形式的数据对预训练后的大语言模型进行参数微调&#xff0c;在一些文章中也称为有监督微调&#xff08;Supervised Fine-tuning&#xff0c;SFT&#xff09;或多任务提示训练&#xff08;Multi…

ONLYOFFICE8.1版本桌面编辑器测评

OO官方链接点这里&#xff1a;ONLYOFFICE 文档 8.1 现已发布&#xff1a;功能全面的 PDF 编辑器、幻灯片版式、优化电子表格的协作等等 | ONLYOFFICE 博客 一、界面与用户体验 整体布局和设计的美观性、易用性&#xff1a; ONLYOFFICE 8.1 版本的桌面编辑器展现出了令人眼前一亮…