IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue + Echarts 实现中国地图的绘制 -> 正文阅读

[JavaScript知识库]Vue + Echarts 实现中国地图的绘制

Vue + Echarts 实现中国地图的绘制

在做业务的时候,有一个数据大屏的需求,这里总结一下遇到绘制地图时遇到的问题以及解决方法,包括:

  • 中国地图的引入;

  • 外边框和内边框(每个省边框细,而整体中国地图外边框粗);

  • 阴影的实现;

  • 轮播每个省份,并显示图注 tooltip

1. 地图的引入

package.json 文件中发现 echarts 版本为 5.2.2,该版本的 echarts 库已经暂停了中国地图的提供(低版本的 echartsnode_modules?中会注册好中国地图的 json 文件)。

因此,我们要自己下好地图的 jsjson 文件,这里提供一下我的数据文件(提取码:4h1e)。

在引入地图数据包后,我们要在入口文件注册地图。

// 这里我是按需引入
import china from '@/map/json/china.json'
// 引入 echarts
import * as echarts from 'echarts'
?
// 注册
Vue.prototype.$echarts = echarts
echarts.registerMap('china', china)

到这里就完成了中国地图的注册,直接在组件中使用就可以了。

2. 初始地图的绘制

地图的绘制非常简单,在 echarts中文文档中有详细描述,具体而言使用 geo 配置项,这里不做过多赘述,直接贴上我的配置代码。

geo: {
 ?map: 'china',
 ?roam: false, // 不开启缩放和平移
 ?// zoom: 1.23, // 视角缩放比例
 ?data: this.chinaMapData,
 ?itemStyle: {
 ? ?borderColor: 'rgb(249, 214, 90)', // 设置外层边框
 ? ?areaColor: 'rgb(45, 59, 130)',
 ? ?borderWidth: 3,
 ? ?shadowColor: '#01273F', // 设置阴影
 ? ?shadowOffsetX: 0,
 ? ?shadowOffsetY: 25
  },
 ?emphasis: { // 鼠标悬停外边框时什么都不显示也不改变
 ? ?focus: 'none',
 ? ?borderColor: 'rgb(249, 214, 90)',
 ? ?areaColor: 'rgb(45, 59, 130)',
 ? ?borderWidth: 3,
 ? ?label: {
 ? ? ?show: false
 ?  }
  },
 ?tooltip: {
 ? ?trigger: 'item',
 ? ?formatter() { // 当鼠标悬停到边框时不展示数据
 ? ? ?return null
 ?  }
  },
 ?select: false
}

3. 内外边框粗细不同的实现

这个实现网上也有很多详细的教程,总而言之便是写两个图层,分别为 geo(下图层)和 series(上图层),也就是说在 series 配置项里再加一个 map 图层即可,代码如下:

series: [
  {
 ? ?type: 'map',
 ? ?map: 'china', // 必须设置此属性,不然不显示,找了很久才找到这个坑,网上的教程都没有!!
 ? ?data: this.chinaMapData,
 ? ?select: false,
 ? ?roam: false, // 很重要
 ? ?itemStyle: {
 ? ? ?normal: {
 ? ? ? ?areaColor: 'rgb(45, 59, 130)',
 ? ? ? ?borderColor: 'rgb(249, 214, 90)',
 ? ? ? ?borderWidth: 1
 ? ?  }
 ?  },
 ? ?emphasis: {
 ? ? ?itemStyle: {
 ? ? ? ?areaColor: '#F3B329', // 鼠标选择区域颜色
 ? ? ? ?shadowOffsetX: 0,
 ? ? ? ?shadowOffsetY: 0,
 ? ? ? ?shadowBlur: 20,
 ? ? ? ?borderWidth: 0,
 ? ? ? ?shadowColor: 'rgba(0, 0, 0, 0.5)'
 ? ?  },
 ? ? ?label: { // 鼠标悬停时显不显示省名
 ? ? ? ?show: false
 ? ?  }
 ?  },
 ? ?tooltip: {
 ? ? ?trigger: 'item',
 ? ? ?formatter(params) { // 展示当前省份的合作企业数量
 ? ? ? ?const res = `<div style='font-size:18px; opacity: 1; color: #fff'>
 ? ? ? ? ? ? ? ?${params.name}省合作企业数量:
 ? ? ? ? ? ? ? ?<span style='font-size: 30px; color: #F9DB5A'>
 ? ? ? ? ? ? ? ? ?${params.value || 0}
 ? ? ? ? ? ? ? ?</span>
 ? ? ? ? ? ? ?</div>`
 ? ? ? ?return res // 自行定义formatter格式
 ? ?  },
 ? ? ?backgroundColor: 'rgba(26, 49, 122, 0.8)', // 提示标签背景颜色
 ? ? ?padding: 50,
 ? ? ?borderWidth: 0
 ?  }
  }
]

需要注意的是,如果不想鼠标悬停在外边框出现 tooltip 或者发生样式的改变,那么一定要在上面的 geo 配置项中设置相应的配置,代码已经贴过在上面了,具体大家可以根据注释理解。

到这里就实现了内外边框。

4. 阴影的实现

直接在下图层,即 geo 配置项中设置如下配置:

itemStyle: {
 ?shadowColor: '#01273F', // 设置阴影
 ?shadowOffsetX: 0,
 ?shadowOffsetY: 25
},

具体数值可以根据要求修改。

5. 省份轮播的实现

根据 echartsdispatchActionon 实例方法实现,具体代码如下:

const mychart = this.$echarts.init(this.$refs.chinaMap)
mychart.setOption(option)
let hourIndex = 0
let fhourTime = null
fhourTime = setInterval(() => {
 ?mychart.dispatchAction({
 ? ?type: 'downplay',
 ? ?seriesIndex: 0
  })
 ?mychart.dispatchAction({
 ? ?type: 'highlight',
 ? ?seriesIndex: 0,
 ? ?dataIndex: hourIndex
  })
 ?mychart.dispatchAction({
 ? ?type: 'showTip',
 ? ?seriesIndex: 0,
 ? ?dataIndex: hourIndex
  })
 ?hourIndex++
 ?if (hourIndex > this.chinaMapData.length) {
 ? ?hourIndex = 0
  }
}, 3000)
// 鼠标移入停止轮播
mychart.on('mousemove', e => {
 ?clearInterval(fhourTime)
 ?mychart.dispatchAction({
 ? ?type: 'downplay',
 ? ?seriesIndex: 0
  })
 ?mychart.dispatchAction({
 ? ?type: 'highlight',
 ? ?seriesIndex: 0,
 ? ?dataIndex: e.dataIndex || '' 
 ? ?// 这个非空判定很重要,因为 geo 中没有 dataIndex,
    // 而鼠标移入一定会先触到 geo,会使得整个地图都被高亮。
  })
 ?mychart.dispatchAction({
 ? ?type: 'showTip',
 ? ?seriesIndex: 0,
 ? ?dataIndex: e.dataIndex || ''
  })
})
// 鼠标移出恢复轮播
mychart.on('mouseout', () => {
 ?fhourTime = setInterval(() => {
 ? ?mychart.dispatchAction({
 ? ? ?type: 'downplay',
 ? ? ?seriesIndex: 0
?
 ?  })
 ? ?mychart.dispatchAction({
 ? ? ?type: 'highlight',
 ? ? ?seriesIndex: 0,
 ? ? ?dataIndex: hourIndex
 ?  })
 ? ?mychart.dispatchAction({
 ? ? ?type: 'showTip',
 ? ? ?seriesIndex: 0,
 ? ? ?dataIndex: hourIndex
 ?  })
 ? ?hourIndex++
 ? ?// 这里根据需求显示多少省份,我这里的需求只需要轮播有数据的省份
 ? ?if (hourIndex > this.chinaMapData.length) {
 ? ? ?hourIndex = 0
 ?  }
  }, 3000)
})

以上便是这次需求中对 chinaMap 的实现。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 08:46:34  更:2021-11-26 08:47:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 3:30:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码