当前位置: 首页 > news >正文

【Echarts地图开发全流程加全套代码】

前言

本篇分享近期做的项目echarts相关地图开发的相关细节和避坑细节!!

一、地图Json文件

echarts地图采用官网的type类型map进行配置开发

Apache EChartsApache ECharts,一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。icon-default.png?t=O83Ahttps://echarts.apache.org/zh/index.html

渲染地图需要通过Json文件来渲染,那么JSON文件可以参考我的上一篇文章内容

二、地图开发过程

初始化

通过echarts配置项开发,首先我们需要一个容器来接收

    <div ref="mapRef" class="map"></div>

class类名可以设置这个容器的宽高比例等等

ref属性值用于我们初始化函数init地图,具体如下:

this.$nextTick(() => {this.chartRef = this.$echarts.init(this.$refs.mapRef)this.chartRef.setOption(option)window.addEventListener('resize', () => {this.chartRef.resize()})
}

在组件挂载时进行上面的操作,同时在组件销毁前进行相同的注销操作,特别是addEventListener

  beforeDestroy() {this.chartRef = this.$echarts.init(this.$refs.mapRef)window.removeEventListener('resize', () => {this.chartRef.resize()})this.chartRef.dispose()this.chartRef = null},

基础配置Options

在不同的业务场景会有不同的业务需求,基本的地图配置即可渲染出一个地图。相关渲染字段不明白的可以去官网配置项文档查看详细内容

const options = {
backgroundColor: 'transparent', // 背景色// 提示浮窗配置tooltip: {//提示框组件show: true,trigger: 'item',triggerOn: 'mousemove', // 触发条件appendToBody: true,position: function (pos, params, dom, rect, size) {// 固定在鼠标位置return [pos[0], pos[1]]},backgroundColor: 'transparent', // 提示框浮层背景颜色borderWidth: 0,padding: [0], // 提示框浮层内边距// 提示框浮层的文本样式textStyle: {color: '#fff'}},
geo:[{type: 'map',map: 'china',zlevel: 4,aspectScale: 0.9,zoom: 1.45,layoutCenter: ['47%', '50%'],layoutSize: '100%',roam: false,silent: true,regions: [{name: '南海诸岛',value: 0,itemStyle: {opacity: 0},label: {show: false}}],label: {show: true,formatter: (params) => {if (this.areaCode == 100000) {const LevelOne = this.mapIconData?.find((item) => item.name === params.name)if (LevelOne) {return `{area_name|${LevelOne?.name}}\n {area_bg|${LevelOne?.showValue} 亿}`} else {return ''}} else {return `{area_name|${params?.name}}`}},rich: {area_name: {color: '#FFF',fontSize: '9px',fontWeight: 'bold',fontStyle: 'italic',align: 'center',textBorderWidth: 3,textBorderColor: '#110070',lineHeight: 10},area_bg: {color: '#FFF',fontWeight: 'bold',fontStyle: 'italic',fontSize: '11px',align: 'center',width: 47,height: 20,lineHeight: 20,backgroundColor: {image: indexImg}},area_gif: {width: 50,height: 50,lineHeight: 30,align: 'center',backgroundColor: {image: arrowImg}}}},itemStyle: {normal: {// 地图样式areaColor: 'transparent', // 区域颜色borderColor: 'transparent', // 边框颜色borderWidth: 0}}},],
series:[
{type: 'map',map: 'china',roam: false,zlevel: 2,layoutSize: '100%',layoutCenter: ['47%', '50%'],animation: false,zoom: 1.45, // 缩放比aspectScale: 0.9, //长宽比showLegendSymbol: false, // 存在legend时显示itemStyle: {normal: {// 地图样式areaColor: {type: 'pattern',image: firstImg, //配置图片repeat: 'repeat' //可选值repeat、no-repeat、repeat-x、repeat-y},borderColor: '#0bc6f2',borderWidth: 1}},emphasis: {itemStyle: {areaColor: {type: 'pattern',image: activeImg,repeat: 'repeat'},borderColor: '#fff',borderWidth: 2},label: {show: false}},select: {label: {show: false},itemStyle: {areaColor: {type: 'pattern',image: activeImg,repeat: 'repeat'},borderColor: '#fff',borderWidth: 2}},data: this.mapGeoData},]}

个性化地图配置—多图层

根据我目前所需的业务需求提供相关个性化配置以供参考~

首先就是地图的多图层问题

多图层问题为了样式美观,需要在geo数组下建造多个对象,通过zlevel属性去控制层级,并且只有第一层地图有相关业务功能所以其他图层地图设置silent属性沉默属性,不响应操作

        geo: [{type: 'map',map: 'china',zlevel: 4,aspectScale: 0.9,zoom: 1.45,layoutCenter: ['47%', '50%'],layoutSize: '100%',roam: false,silent: true,regions: [{name: '南海诸岛',value: 0,itemStyle: {opacity: 0},label: {show: false}}],label: {show: true,formatter: (params) => {if (this.areaCode == 100000) {const LevelOne = this.mapIconData?.find((item) => item.name === params.name)if (LevelOne) {return `{area_name|${LevelOne?.name}}\n {area_bg|${LevelOne?.showValue} 亿}`} else {return ''}} else {return `{area_name|${params?.name}}`}},rich: {area_name: {color: '#FFF',fontSize: '9px',fontWeight: 'bold',fontStyle: 'italic',align: 'center',textBorderWidth: 3,textBorderColor: '#110070',lineHeight: 10},area_bg: {color: '#FFF',fontWeight: 'bold',fontStyle: 'italic',fontSize: '11px',align: 'center',width: 47,height: 20,lineHeight: 20,backgroundColor: {image: indexImg}},area_gif: {width: 50,height: 50,lineHeight: 30,align: 'center',backgroundColor: {image: arrowImg}}}},itemStyle: {normal: {// 地图样式areaColor: 'transparent', // 区域颜色borderColor: 'transparent', // 边框颜色borderWidth: 0}}},{type: 'map',map: 'china',roam: false,zlevel: 2,layoutSize: '100%' /* 地图的大小 */,layoutCenter: ['47%', '50%'] /* 把地图放到盒子的正中间 */,zoom: 1.45,aspectScale: 0.9,regions: [{name: '南海诸岛',value: 0,itemStyle: {opacity: 0},label: {show: false}}],label: {show: false},// 当前第一层地图的初始样式itemStyle: {normal: {// 地图样式areaColor: {type: 'pattern',image: firstImg, //配置图片repeat: 'repeat' //可选值repeat、no-repeat、repeat-x、repeat-y},borderColor: '#0bc6f2',borderWidth: 1}},emphasis: {itemStyle: {areaColor: {type: 'pattern',image: activeImg,repeat: 'repeat'},borderColor: '#fff',borderWidth: 2},label: {show: false}},select: {label: {show: false},itemStyle: {areaColor: {type: 'pattern',image: activeImg,repeat: 'repeat'},borderColor: '#fff',borderWidth: 2}}},// 不包含子区域的地图{type: 'map',map: 'china_nochild',zlevel: 3,aspectScale: 0.9,zoom: 1.45,layoutCenter: ['47%', '50%'],layoutSize: '100%',roam: false,silent: true,regions: [{name: '南海诸岛',value: 0,itemStyle: {opacity: 0},label: {show: false}}],itemStyle: {normal: {// 地图样式areaColor: 'transparent', // 区域颜色borderColor: '#c5eaff', // 边框颜色opacity: 1,shadowColor: '#fff',shadowBlur: 20,// shadowOffsetX: 0,shadowOffsetY: 3,borderWidth: 3}}},{type: 'map',map: 'china_nochild',zlevel: -1,aspectScale: 0.9,zoom: 1.45,layoutCenter: ['47%', '52%'],layoutSize: '100%',roam: false,silent: true,regions: [{name: '南海诸岛',value: 0,itemStyle: {opacity: 0},label: {show: false}}],itemStyle: {normal: {// 地图样式areaColor: {type: 'pattern',image: secondImg, //配置图片repeat: 'repeat' //可选值repeat、no-repeat、repeat-x、repeat-y},borderColor: '#35b5ff', // 边框颜色borderWidth: 1}}},{type: 'map',map: 'china_nochild',zlevel: -2,aspectScale: 0.9,zoom: 1.45,layoutCenter: ['47%', '54%'],layoutSize: '100%',roam: false,silent: true,regions: [{name: '南海诸岛',value: 0,itemStyle: {opacity: 0},label: {show: false}}],itemStyle: {normal: {// 地图样式areaColor: '#2770ca', // 区域颜色borderColor: '#35b5ff', // 边框颜色shadowColor: '#00d2ff',shadowBlur: 18,shadowOffsetY: -10,borderWidth: 1,opacity: 1}}}],

其中地图为了实现中国地图边缘线高亮并且和地图内省界线样式冲突,添加了不包含子区域的地图对象,这个需要和后端接口提供的json对象渲染或者去Datav官网下载不包含地图子区域的json文件

个性化地图配置—迁徙线

地图上添加迁徙线的相关配置在series数组中添加

        {type: 'lines',zlevel: 2,silent: true,effect: {show: true,period: 2.6, // 箭头指向速度,值越小速度越快trailLength: 0.8, // 特效尾迹长度[0,1]值越大,尾迹越长重symbol: 'pin', // 箭头图标color: '#4ee0ff',loop: true,symbolSize: 8 // 图标大小},lineStyle: {width: 1, // 尾迹线条宽度// opacity: 0, // 尾迹线条透明度curveness: 0.4, // 尾迹线条曲直度color: 'transparent'},data: this.mapMigrationData},

其中data为迁徙线的渲染数据,其他配置或者更多请去文章开头官网寻找~

个性化地图配置—涟漪图

地图上添加涟漪图的相关配置在series数组中添加

 {type: 'effectScatter',coordinateSystem: 'geo',geoIndex: 0,zlevel: 2,silent: true,showEffectOn: 'render', // 绘制完成后显示特效hoverAnimation: true,large: true, // 是否开启大数据量优化rippleEffect: {// 涟漪特效period: 3, // 动画时间-秒数brushType: 'stroke', // 波纹绘制方式 stroke, fillscale: 2 // 波纹圆环最大限制,值越大波纹越大},symbol: 'circle',symbolSize: function (value, params) {if (params?.name === '北京市') {return 9} else {return 5}},label: {show: false},itemStyle: {normal: {show: false,color: '#4DFEEC'}},data: this.mapRipplesData}

个性化地图配置—自定义图标

地图上添加图标的相关配置在series数组中添加

        {type: 'scatter',coordinateSystem: 'geo', // 使用地理坐标系geoIndex: 0,zlevel: 2,data: [],// data: this.mapIconData, // 要有对应的经纬度才显示,先经度再维度showEffectOn: 'render', // 绘制完成后显示特效hoverAnimation: false,emphasis: {scale: false},silent: true,large: true, // 是否开启大数据量优化,在数据图形特别多而出现卡顿时候可以开启。symbol: 'image://' + require('@/assets/icons/arrow.png'),symbolSize: 50}

注意:

  • 以上配置如果是单图层会比较简单,多图层情况需要注意层级zlevel的展现
  • geo数组和series数组,在需要进行业务操作交互的第一层图层,需要注意其层级level、roam、zoom、aspectScale均需要设置为一致

以上就是一些配置相关问题,有关于地图的其他配置问题和疑难问题都可以留言或私信我,我会第一时间关注并回复的~

今天的知识分享就到这里啦~希望大家在这能学到知识一起分享一起进步,成为更好的自己!

相关文章:

  • AI时代,程序员会被取代吗?
  • [算法日常] 分层图最短路
  • mock方法内容的匿名方法
  • 关于HTML 案例_个人简历展示02
  • 动手学深度学习(李沐)PyTorch 第 3 章 线性神经网络
  • Jmeter的使用方法
  • python中提示‘pyinstaller‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  • vue3:路由守卫(全局守卫、路由独享守卫、组件内守卫)
  • 15、网络安全合规由来与要素
  • 应用性能管理工具-SkyWalking
  • 目前最好用的爬虫软件是那个?
  • C++游戏
  • 追梦无Bug的软件世界
  • Web3.0 应用项目
  • Conda虚拟环境配置常见问题记录
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Android Volley源码解析
  • create-react-app做的留言板
  • ES6--对象的扩展
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iOS编译提示和导航提示
  • Mysql数据库的条件查询语句
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • vue学习系列(二)vue-cli
  • 简单易用的leetcode开发测试工具(npm)
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 浅谈web中前端模板引擎的使用
  • 事件委托的小应用
  • 温故知新之javascript面向对象
  • 问题之ssh中Host key verification failed的解决
  • 我的面试准备过程--容器(更新中)
  • 函数计算新功能-----支持C#函数
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (¥1011)-(一千零一拾一元整)输出
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (蓝桥杯每日一题)love
  • (区间dp) (经典例题) 石子合并
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (自用)网络编程
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ****三次握手和四次挥手
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Core WebAPI中使用swagger版本控制,添加注释