基于实现地图弹窗轮播功能及遇到的问题解决

基本使用

获取地图 geojson 数据

链接: 阿里云数据可视化平台

获取ECharts
npm install echarts

或者是使用地址链接

<script src="https://registry.npmmirror.com/echarts/5.4.3/files/dist/echarts.min.js"></script>
<script src="https://registry.npmmirror.com/echarts-gl/2/files/dist/echarts-gl.min.js"></script>
地图基本创建
// 引入 ECharts 主模块
var echarts = require('echarts/lib/echarts');
// 引入地图
require('echarts/map/js/china');
 
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
 
// 指定图表的配置项和数据
var option = {
    title: {
        text: 'ECharts 地图示例',
        subtext: '中国地图',
        left: 'center'
    },
    tooltip: {
        trigger: 'item'
    },
    legend: {
        orient: 'vertical',
        left: 'left',
        data: ['中国地图']
    },
    visualMap: {
        min: 0,
        max: 2500,
        left: 'left',
        top: 'bottom',
        text: ['高','低'],
        calculable: true
    },
    series: [
        {
            name: '中国地图',
            type: 'map',
            mapType: 'china',
            roam: true,
            label: {
                normal: {
                    show: true
                },
                emphasis: {
                    show: true
                }
            },
            data: [
                {name: '北京', value: Math.round(Math.random() * 1000)},
                {name: '天津', value: Math.round(Math.random() * 1000)},
                // ... 其他省份数据
            ]
        }
    ]
};
 
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);

这段代码演示了如何在ECharts中创建一个基本的中国地图,包括如何初始化ECharts实例、设置图表的配置项和数据。

功能实现
区域分级
series: [{
   tooltip: {
       trigger: 'item',
   },
   name: 'beijing',
   type: 'map',
   map: 'beijing', // 自定义扩展图表类型
   showLegendSymbol: true, // 存在legend时显示
   label: { // 文字
       show: true,
       color: '#fff',
       fontSize: 10
   },
   itemStyle: { // 地图样式
       areaColor: '#282C34',  //区域颜色
       borderColor: '#ffffff',  //边框颜色
       borderWidth: 1
   },
   emphasis: { // 鼠标移入时显示的默认样式
       itemStyle: {
           areaColor: '#4adcf0',
           borderColor: '#404a59',
           borderWidth: 1
       },
       label: { // 文字
           show: true,
           color: '#0D5EFF',
           fontSize: 12,
           fontWeight: 600
       },
   },
   data: [
       {
           name: '丰台区',
           //自定义区域的颜色
           itemStyle: {
                   areaColor: '#F50508',
                   borderColor: '#1773c3', // 区域边框
                   shadowColor: '#1773c3', // 阴影
           }
       }
   ],
  }],
}
  • name的属性值必须要对应,比如地图上是丰台区,name值要是丰台区,那么就不会生效。
  • 注册的地图名称,必须与map值一致,比如
区域轮播高亮

实现轮播高亮需要借助官方提供的:dispatchAction 、 highlight 、downplay 这3个API来实现

设置轮播
//设置轮播
myEchart.dispatchAction({
    type: 'highlight',
    seriesIndex: 0,  //指定哪一个系列,就是series里的哪一个
    dataIndex: 0  //指定高亮的下标
})

注意: 必须在设置完属性后,再使用

接下来无法就是用个定时器,动态改变dataIndex的值就好

弹窗轮训

和区域高亮轮播使用的方法相同,用到的属性值不同

设置轮播
myChart.dispatchAction({
  type: 'downplay',
  seriesIndex: 0,
})

弹窗样式写在 echarts 属性中的 tooltip

tooltip: {
          backgroundColor: 'none',
          trigger: 'item',
          textStyle: {
            fontSize: 16,
            color: '#fff',
            fontWeight: 500,
          },
          position: function (point) {
            return [point[0] - 140, point[1] - 140] // 这里的坐标是相对于鼠标位置的偏移量
          },
          padding: 0,
          borderWidth: 0,
          shadowBlur: 0, // 去掉阴影
          borderColor: 'none',
          className: 'custom-tooltip-box',
          formatter: function (params) {
          
          },
},
轮播设定的方法

在ECharts中实现地图上的标记点轮播显示信息时,可以使用setInterval定时更新数据,并通过setOption方法重绘图表。

  • 准备一系列的地图数据,每个数据都有高亮和正常状态的样式。
  • 在ECharts中,可以通过设置 tooltip.trigger="axis" ,来显示数据轴上的提示框。
  • 实现tooltip的自动轮播显示,结合使用 setInterval()和 dispatchAction()方法,使用setInterval方法设置一个定时器,轮播高亮不同的地区。
  • 获取chart DOM 实例,监听鼠标事件,悬浮时清空定时器,鼠标离开开启定时器,继续轮播。
      this.mapSet(myChart, true)
      this.initTimer(myChart)

      myChart.on('mousemove', function (e) {
        clearInterval(_this.hoverTimer)
        myChart.dispatchAction({
          type: 'downplay',
          seriesIndex: 0,
        })
        myChart.dispatchAction({
          type: 'highlight',
          seriesIndex: 0,
          dataIndex: e.dataIndex,
        })
        myChart.dispatchAction({
          type: 'showTip',
          seriesIndex: 0,
          dataIndex: e.dataIndex,
        })
      }) //鼠标移入静止播放
      myChart.on('mouseout', function (e) {
        clearInterval(_this.hoverTimer)
        myChart.dispatchAction({
          type: 'downplay',
          seriesIndex: 0,
          dataIndex: e.dataIndex,
        }) //鼠标移出后先把上次的高亮取消
        // 把点击过的选中样式去掉
        if (this.curSelectName) {
          myChart.clear()
          myChart.setOption(option)
        }
        _this.initTimer(myChart)
      })
      myChart.on('click', function (e) {
        this.curSelectName = e.name
        let index = _this.mapDate.findIndex(item => item.name === e.name)
        _this.curHoverIndex = index
      })
    // 地图定时轮播动画
    initTimer(myChart) {
      this.hoverTimer = setInterval(() => {
        this.mapSet(myChart)
        this.cartoonIndex++
        if (this.cartoonIndex >= this.mapDate.length) {
          this.cartoonIndex = -1
        }
        this.curHoverIndex = this.cartoonIndex
      }, 5000)
    },
    mapSet(myChart, isfirst) {
      // 隐藏提示框
      myChart.dispatchAction({
        type: 'hideTip',
        seriesIndex: 0,
        dataIndex: this.cartoonIndex,
      })
      // 显示提示框
      myChart.dispatchAction({
        type: 'showTip',
        seriesIndex: 0,
        dataIndex: this.cartoonIndex + 1,
      })
      // 取消高亮指定的数据图形
      myChart.dispatchAction({
        type: 'downplay',
        seriesIndex: 0,
        dataIndex: this.cartoonIndex,
      })
      // 高亮指定的数据图形
      myChart.dispatchAction({
        type: 'highlight',
        seriesIndex: 0,
        dataIndex: this.cartoonIndex + 1,
      })
      if (isfirst) {
        this.cartoonIndex++
        this.curHoverIndex = this.cartoonIndex
      }
    },
去除弹窗阴影
问题复现

在使用了弹窗中使用了 formatter 设置自定义的样式背景时,echarts 默认的边框 border 阴影还有明显的显示,在tooltip 中设置了 shadowBlur: 0 依旧显示,查看元素如下图:

弹窗上未绑定任何 class 样式,在标签中有绑定行内样式 box-shadow 导致弹窗带有默认阴影样式。

解决方法
  • 在 tooltip 对象中添加自定义样式名 className
  • 在 css 样式中去除阴影
 tooltip: {
          backgroundColor: 'none',
          trigger: 'item',
          textStyle: {
            fontSize: 16,
            color: '#fff',
            fontWeight: 500,
          },
          position: function (point) {
            return [point[0] - 140, point[1] - 140] // 这里的坐标是相对于鼠标位置的偏移量
          },
          padding: 0,
          borderWidth: 0,
          shadowBlur: 0, // 去掉阴影
          borderColor: 'none',
          className: 'custom-tooltip-box',
          formatter: function (params) {
            
          },
        },

css 样式(需要使用深度样式修改 deep)

:deep(.custom-tooltip-box) {
  padding: 0 !important;
  border: none !important;
  background-color: transparent !important;
  box-shadow: none !important;
}
自定义 tooltip 位置

实现要求:弹窗显示的位置在地图区域中心点位的正上方

使用 position 函数表达法

point: 鼠标位置,如 [20, 40]。
params: 同 formatter 的参数相同。
dom: tooltip 的 dom 对象。
rect: 只有鼠标在图形上时有效,是一个用x, y, width, height四个属性表达的图形包围盒。
size: 包括 dom 的尺寸和 echarts 容器的当前尺寸,例如:{contentSize: [width, height], viewSize: [width, height]}。

返回值:
可以是一个表示 tooltip 位置的数组,数组值可以是绝对的像素值,也可以是相 百分比。

  • point[0] - 140:弹框宽度的一半
  • point[1] - 140]:弹窗的整体高度
position: function (point) {
   return [point[0] - 140, point[1] - 140] // 这里的坐标是相对于鼠标位置的偏移量
},


 

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

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

相关文章

关于螺栓的注意事项和正确操作方法——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 螺栓&#xff0c;作为一种常见的紧固件&#xff0c;广泛应用于各种机械设备和结构中。在日常生活和工作中&#xff0c;我们经常需要接触到螺栓&#xff0c;因此了解螺栓的一些注意事项和正确操作方法对于确保设备的安全…

【C#】Stopwatch计时器

使用Stopwatch检查C#中代码块的执行时间&#xff0c;比如歌曲&#xff0c;图片的下载时间问题 首先&#xff0c;我们可看到Stopwatch 类内部的函数。 根据需求&#xff0c;我们具体可使用到 Start() 开始计时&#xff0c;Stop() 停止计时等 //创建 Stopwatch 实例 Stopwatch …

Intersection Observer API探索

我们经常遇到这样的需求——检测一个元素是否可见或者两个元素是否相交&#xff0c;如 ● 图片懒加载——当图片滚动到可见时才进行加载 ● 内容无限滚动——也就是用户滚动到接近内容底部时直接加载更多&#xff0c;而无需用户操作翻页&#xff0c;给用户一种网页可以无限滚动…

分布式密钥生成

可验证且无经销商 分布式密钥生成 (DKG) 是一种加密协议&#xff0c;使多方能够协作生成共享密钥&#xff0c;而无需任何一方完全了解密钥。 它通过在多个参与者之间分配信任来增强各种应用程序的安全性&#xff0c;从而降低密钥泄露的风险。 我们引入了一种可验证且无经销商的…

深度学习从入门到精通—Transformer

1.绪论介绍 1.1 传统的RNN网络 传统的RNN&#xff08;递归神经网络&#xff09;主要存在以下几个问题&#xff1a; 梯度消失和梯度爆炸&#xff1a;这是RNN最主要的问题。由于序列的长距离依赖&#xff0c;当错误通过层传播时&#xff0c;梯度可以变得非常小&#xff08;消失…

mybatisplus3.5.4基础生成代码完整步骤(超详细)

在网上看了很多自动生成的例子本地不是很好使&#xff0c;最后找到了一套好用的&#xff0c;适合版本&#xff1a; idea:2024.1 springboot2.6.12 java17 mybatisplus3.5.4 废话不多说&#xff0c;直接上步骤&#xff1a; 新建项目&#xff1a; 结构如下&#xff1a; 添加依…

Calibre Ebook Management 一款功能强大操作简单的电子书管理神器(V7.9.0)

Calibre Ebook Management Calibre 软件被广泛认可为一款功能全面并且用户友好的电子书管理工具。其卓越性能和必备性得到了用户的高度评价。该软件提供了一套综合性的功能&#xff0c;允许用户执行各种电子书相关的操作。此外&#xff0c;Calibre 软件遵循免费和开源的原则&a…

spring基本使用

文章目录 1. ioc(Inversion of Control) | DI(Dependency Injection)(1) maven坐标导包(2) 编写配置文件bean.xml(3) 配置bean(4) 配置文件注入属性 2. DI(dependency injection) 依赖注入(setter)其他属性(1) 对象属性注入(2) 数组属性输入(3) 集合属性注入(4) map集合注入(5)…

【一刷《剑指Offer》】面试题 9:斐波那契数列(扩展:青蛙跳台阶、矩阵覆盖)

力扣对应链接&#xff1a;LCR 126. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 牛客对应链接&#xff1a;斐波那契数列_牛客题霸_牛客网 (nowcoder.com) 核心考点&#xff1a;空间复杂度&#xff0c;fib 理解&#xff0c;剪枝重复计算。 一、《剑指Offer》内容 二、分…

ThingsBoard处理设备上报的属性并转换为可读属性

一、前言 二、案例 1、AI生成JSON数据体 2、将json数据体直接通过遥测topic发送查看效果 3、可查看目前整个数据都在一起 ​编辑 4、配置附规则链路 5、对msg的消息值&#xff0c;进行数据的转换&#xff0c;并从新进行赋值。 6、规则链路关联关系 7、再次通过MQTT发送遥…

618大促有哪些值得买的家居好物?618五款必Buy好物

来了&#xff01;来了&#xff01;万众瞩目的618购物狂欢节即将拉开帷幕&#xff0c;我们的目标清晰而坚定&#xff0c;那就是用最实惠的价格尽情享受购物的乐趣。然而&#xff0c;面对各种纷繁复杂的促销活动和琳琅满目的商品&#xff0c;选择困难症似乎也在悄然滋生。因此&am…

【自定义渲染通道】

自定义渲染通道 2023-09-07 14:58 How to Create Masks With the Custom Depth Buffer Tips - Tricks Unreal Engine.mp4 后期材质ppm_customDepth 要加入通道的物体设置 render customdepth pass postprocessvolue 设置post process materials 为上面的ppm_customDepth 不同…

【信安评估】2024年全国职业院校技能大赛高职组“信息安全管理与评估”安徽省选拔赛赛项规程

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 移动应用开发群&#xff1a;548238632 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技…

PLL深度解析第一篇——PLL的知识图谱

在硬件电路中&#xff0c;时钟就像心脏一样&#xff0c;在时钟的节拍下&#xff0c;不同的芯片、不同的电路、不同的接口都可以有序的进行工作或者通信&#xff08;类似流水线一样&#xff0c;必须有节奏的运行&#xff09;。 但是在芯片中&#xff0c;不同的模块和接口工作的频…

基于SSM的物业管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的物业管理系统2拥有三种角色 管理员&#xff1a;用户管理、物业管理、房产信息管理、小区概况管理、开发商管理、收费标准管理、物业公司管理等 物业&#xff1a;住户管理、收费…

C语言求 MD5 值

MD5值常被用于验证数据的完整性&#xff0c;嵌入式开发时经常用到。md5sum命令可以求MD5码&#xff0c;下面介绍如何用C语言实现MD5功能。 一、求字符串MD5值 1、md5sum命令 $ echo -n "12345678" | md5sum //获取"12345678"字符串的md5值 结果&…

1小时学会SpringBoot3+Vue3前后端分离开发

首发于Enaium的个人博客 引言 大家可能刚学会Java和Vue之后都会想下一步是什么&#xff1f;那么就先把SpringBoot和Vue结合起来&#xff0c;做一个前后端分离的项目吧。 准备工作 首先你需要懂得Java和Vue的基础知识&#xff0c;环境这里就不多说了&#xff0c;直接开始。 …

Neo-reGeorg明文流量

Neo-reGeorg 1 同IP对&#xff0c;同一个URI&#xff0c;第一个TCP流是“GET”请求&#xff0c;随后的TCP流请求为“POST”。&#xff08;jsp\jspx\php&#xff09; 2 第一个TCP流中&#xff0c;GET只有一个会话。&#xff08;jsp\jspx\php&#xff09;&#xff0c;响应body79…

stm32HAL库-GPIO

一 什么是 GPIO: GPIO(general porpose intput output), 通用输入输出端口 . 二 我们先认识芯片控制 GPIO 输出控制。 2.1LED 硬件原理如图&#xff1a; 当电流从这根电线流通&#xff0c; LED 亮。当电流不通过这根电线&#xff0c; LED 灭。 上面 PF** &#xff0c;芯片电…

平芯微PW7014中文规格书

产品概述 PW7014 具有前端过电压和过温保护功能。 支持 3V 到 36V 的宽输入电压工作范围。 过压保护阈 值可以外部设置 4V~22V 或采用内部默认 6.1V 设置。 超快的过压保护响应速度能够确保后级电路 的安全。 集成了超低导通阻抗的 nFET 开关&#xff0c; 确保电路系统应用更好…