echarts+echarts-gl vue2制作3D地图+下钻功能+标记点功能,解决dblclick事件失效问题,解决地图下钻后边框不更新保留问题

news2024/11/19 2:45:36

目录

先看实现效果:​编辑

步骤一

安装echarts和echarts-gl

步骤二 

设置地图容器

在methods中设置初始化地图方法并在mounted中调用

在methods中设置初始化地图方法

在mounted中调用

打开页面效果:​编辑

 步骤三

1、给地图添加双击事件dblclick

但是也出现了一个问题,和我们预想的不太一样,下钻到省地图后,china地图的边框数据保留了,即:地图边框并没有更新,如图:​编辑

解决方案一:

解决方案二:

步骤四

 扩展:

最后附上完整代码:


先看实现效果:

步骤一

安装echarts和echarts-gl

npm install echarts --save //echarts安装命令
npm install echarts-gl //echarts-gl安装命令

 引入:

import * as echarts from 'echarts';
import 'echarts-gl'

步骤二 

设置地图容器

<div id="mapBox" class="mapBox">

				</div>

注意:地图容器必须设置宽高

在methods中设置初始化地图方法并在mounted中调用

在methods中设置初始化地图方法

setMap3D(chinaJson) {
				// 引入地图边界json数据
				this.chinaJson =chinaJson?chinaJson:require('@/assets/json/china.json')
				// 获取地图容器
				var chartDom = document.getElementById('mapBox');
				var myChart = echarts.init(chartDom);
				// 注册地图
				echarts.registerMap("china", this.chinaJson)
				let dataObj = ''
				var option;
				option = {
					// title: {
					// 	text: '全国行政区划3D地图',
					// 	x: 'center',
					// 	top: "20",
					// 	textStyle: {
					// 		color: '#000',
					// 		fontSize: 24
					// 	}
					// },
					tooltip: {
						show: true,
					},
					geo3D: {
						map: 'china',
						roam: true,
						regionHeight: 4, //地图厚度
						itemStyle: {
							color: '#326a9a',
							opacity: 0.8,
							borderWidth: 0.8,
							borderColor: '#c3d7de'
						},
						label: {
							show: false,
						},
						emphasis: { //当鼠标放上去  地区区域是否显示名称
							disabled: true, //是否可以被选中
							label: {
								formatter: function(params) { // 鼠标经过的回调函数  
									// console.log('hover', params)
									dataObj = params;
									return params.name
								},
							},
						},
						//shading: 'lambert',
						light: { //光照阴影
							main: {
								color: '#fff', //光照颜色
								intensity: 1.2, //光照强度
								// shadowQuality: 'high', //阴影亮度
								shadow: false, //是否显示阴影
								alpha: 55,
								beta: 10
							},
							ambient: {
								intensity: 0.3
							}
						},
						viewControl: {
							distance: 85, // 地图视角 控制初始大小
							// rotateSensitivity: 0, // 旋转
							// zoomSensitivity: 0, // 缩放
							// autoRotate: false,
							// maxBeta: Infinity,
							// minBeta: -Infinity,
							// beta: -15, //旋转视角
							alpha: 65, //视角
							panMouseButton: 'left',
							rotateMouseButton: 'right',
							center: [-1, 0, 5],
						},
						regions: [{
							name: '南海诸岛',
							itemStyle: {
								Color: 'rgba(0, 10, 52, 1)',
								borderColor: 'rgba(0, 10, 52, 1)'
							},
							emphasis: {
								areaColor: 'rgba(0, 10, 52, 1)',
								borderColor: 'rgba(0, 10, 52, 1)'
							}
						}],
					},
					series: []
				};
				option && myChart.setOption(option);
			}

在mounted中调用

mounted() {
			this.setMap3D()
		},

打开页面效果:

 步骤三

经过以上两个步骤初步实现了地图的渲染,现在开始添加下钻功能

1、给地图添加双击事件dblclick

myChart.on('dblclick', (clickparams)=> {
					console.log(clickparams);
				});

此时双击地图板块发现并没有触发方法

这里我的解决方案是添加.getZr(),如下:

myChart.getZr().on('dblclick', (clickparams)=> {
					console.log(clickparams);
				});

再次双击地图,发现事件确实是触发了,但是并没有返回我们想要的数据(双击的地图板块名称)

这里我的解决方案是,在鼠标悬浮在地图板块的时候在label中拿到对应的数据赋值给一个变量,然后再双击地图的时候使用这个变量,如下:

 双击地图:

 这里已经拿到了双击地图板块的名称,现在只需要去匹配对应的地图json数据,重新渲染地图即可实现下钻功能,具体代码如下:

myChart.getZr().on('dblclick', (clickparams)=> {
					console.log(dataObj);
					if (dataObj.name == '河南') {
						this.chinaJson = require('@/assets/json/henan.json')
						echarts.registerMap("china", this.chinaJson)
					}else{
						this.chinaJson = require('@/assets/json/china.json')
						echarts.registerMap("china", this.chinaJson)
					}
					option && myChart.setOption(option);
				});

小编这里以河南地图为例,添加以上代码后,双击河南地图板块后,发现已经实现了我们想要的下钻功能。

但是也出现了一个问题,和我们预想的不太一样,下钻到省地图后,china地图的边框数据保留了,即:地图边框并没有更新,如图:

 在这里小编的解决方案是在下钻的时候,添加重置 option 事件。如下:

解决方案一:

                    myChart.dispatchAction({ //来用程序主动渲染选框
						type: "restore",//restore 重置 option 事件。
					});
					option && myChart.setOption(option);

双击执行函数完整代码

myChart.getZr().on('dblclick', (clickparams)=> {
					console.log(dataObj);
					if (dataObj.name == '河南') {
						this.chinaJson = require('@/assets/json/henan.json')
						echarts.registerMap("china", this.chinaJson)
					}else{
						this.chinaJson = require('@/assets/json/china.json')
						echarts.registerMap("china", this.chinaJson)
					}
					// 解决方法一
					myChart.dispatchAction({ //来用程序主动渲染选框
						type: "restore",//restore 重置 option 事件。
					});
					option && myChart.setOption(option);
					
				});

此时我们双击地图板块,发现边框已经更新,达到了我们想要的效果(边框问题完美解决),如图:

 虽然达到了我们预期的效果,但是经过多次测试,发现在个别版本的echarts-gl中还是会有边框不更新问题,如方案一不能解决,

在这里小编这里整理了第二套解决方案原理上适配所有的echarts版本:如下:

解决方案二:

原理:下钻的时候销毁当前地图,重新执行初始化渲染地图

// 解决方法二
					myChart.dispose(); //地图销毁函数
					this.setMap3D(this.chinaJson) //重新执行初始化地图的方法并传入地图数据

完整的双击事件代码

                myChart.getZr().on('dblclick', (clickparams)=> {
					console.log(dataObj);
					if (dataObj.name == '河南') {
						this.chinaJson = require('@/assets/json/henan.json')
						echarts.registerMap("china", this.chinaJson)
					}else{
						this.chinaJson = require('@/assets/json/china.json')
						echarts.registerMap("china", this.chinaJson)
					}
					// 解决方法一
					// myChart.dispatchAction({ //来用程序主动渲染选框
					// 	type: "restore",//restore 重置 option 事件。
					// });
					// option && myChart.setOption(option);
					
					// 解决方法二
					myChart.dispose(); //地图销毁函数
					this.setMap3D(this.chinaJson) //重新执行初始化地图的方法并传入地图数据
				});

以上两种解决方法,任选其一即可,如不能解决换另一种方法

步骤四

添加地图标记点功能,代码如下:

                    series: [{
						type: 'scatter3D',
						coordinateSystem: 'geo3D',
						itemStyle: {
							color: '#fff',
							opacity: 1,
						},
						zlevel: 1,
						// symbol: 'path://M133 409 c-37 -11 -73 -52 -73 -84 0 -28 71 -172 101 -203 26 -29 32 -24 84 67 52 93 63 142 41 176 -18 27 -72 56 -103 54 -10 0 -32 -5 -50 -10z m72 -63 c16 -12 17 -16 6 -30 -7 -9 -21 -16 -31 -16 -10 0 -24 7 -31 16 -11 14 -10 18 6 30 10 8 22 14 25 14 3 0 15 -6 25 -14z',
						symbol: 'circle',
						symbolSize: [40, 50],
						data: [{
							name: '标记点',
							value: [120.256616, 30.239604, 100],
							info: require('../assets/icon/dianwei.png'),
						}],
					}]

效果如下:

 扩展:

自定义标记点样式为icon图标:

                   series: [{
						type: 'scatter3D',
						coordinateSystem: 'geo3D',
						itemStyle: {
							color: '#fff',
							opacity: 1,
						},
						zlevel: 1,
						symbol: 'path://M133 409 c-37 -11 -73 -52 -73 -84 0 -28 71 -172 101 -203 26 -29 32 -24 84 67 52 93 63 142 41 176 -18 27 -72 56 -103 54 -10 0 -32 -5 -50 -10z m72 -63 c16 -12 17 -16 6 -30 -7 -9 -21 -16 -31 -16 -10 0 -24 7 -31 16 -11 14 -10 18 6 30 10 8 22 14 25 14 3 0 15 -6 25 -14z',
						// symbol: 'circle',
						symbolSize: [40, 50],
						data: [{
							name: '标记点',
							value: [120.256616, 30.239604, 100],
							info: require('../assets/icon/dianwei.png'),
						}],
					}]

 使用图片为标记点样式,但是图片只能是svg PathData 格式的,并且好像不能设置彩色的图片,官方文档如下:

ECharts 提供的标记类型包括 'circle''rect''roundRect''triangle''diamond''pin''arrow''none'

可以通过 'path://' 将图标设置为任意的矢量路径。这种方式相比于使用图片的方式,不用担心因为缩放而产生锯齿或模糊,而且可以设置为任意颜色。路径图形会自适应调整为合适(如果是 symbol 的话就是 symbolSize)的大小。路径的格式参见 SVG PathData。可以从 Adobe Illustrator 等工具编辑导出。

 效果如下:

 标记点小编技术有限,也没有太好的办法解决,去完善,到此为止,就是小编做的最终效果

最后附上完整代码:

html:

setMap3D(chinaJson) {
				this.chinaJson =chinaJson?chinaJson:require('@/assets/json/china.json')
				var chartDom = document.getElementById('mapBox');
				var myChart = echarts.init(chartDom);
				echarts.registerMap("china", this.chinaJson)
				let dataObj = ''
				var option;
				option = {
					// title: {
					// 	text: '全国行政区划3D地图',
					// 	x: 'center',
					// 	top: "20",
					// 	textStyle: {
					// 		color: '#000',
					// 		fontSize: 24
					// 	}
					// },
					tooltip: {
						show: true,
						// formatter:(params)=>{
						//   let data = "测试1:"+params.name + "<br/>"+"值:"+ params.value[2]+"<br/>"+"地理坐标:[" + params.value[0]+","+params.value[1] +"]";
						//   return data;
						// },
					},
					geo3D: {
						map: 'china',
						roam: true,
						regionHeight: 4, //地图厚度
						itemStyle: {
							color: '#326a9a',
							opacity: 0.8,
							borderWidth: 0.8,
							borderColor: '#c3d7de'
						},
						label: {
							show: false,
						},
						emphasis: { //当鼠标放上去  地区区域是否显示名称
							disabled: true, //是否可以被选中
							label: {
								formatter: function(params) { // 鼠标经过的回调函数  
									// console.log('hover', params)
									dataObj = params;
									return params.name
								},
							},
						},
						//shading: 'lambert',
						light: { //光照阴影
							main: {
								color: '#fff', //光照颜色
								intensity: 1.2, //光照强度
								// shadowQuality: 'high', //阴影亮度
								shadow: false, //是否显示阴影
								alpha: 55,
								beta: 10
							},
							ambient: {
								intensity: 0.3
							}
						},
						viewControl: {
							distance: 85, // 地图视角 控制初始大小
							// rotateSensitivity: 0, // 旋转
							// zoomSensitivity: 0, // 缩放
							// autoRotate: false,
							// maxBeta: Infinity,
							// minBeta: -Infinity,
							// beta: -15, //旋转视角
							alpha: 65, //视角
							panMouseButton: 'left',
							rotateMouseButton: 'right',
							center: [-1, 0, 5],
						},
						regions: [{
							name: '南海诸岛',
							itemStyle: {
								Color: 'rgba(0, 10, 52, 1)',
								borderColor: 'rgba(0, 10, 52, 1)'
							},
							emphasis: {
								areaColor: 'rgba(0, 10, 52, 1)',
								borderColor: 'rgba(0, 10, 52, 1)'
							}
						}],
					},
					series: [{
						type: 'scatter3D',
						coordinateSystem: 'geo3D',
						itemStyle: {
							color: '#fff',
							opacity: 1,
						},
						zlevel: 1,
						symbol: 'path://M133 409 c-37 -11 -73 -52 -73 -84 0 -28 71 -172 101 -203 26 -29 32 -24 84 67 52 93 63 142 41 176 -18 27 -72 56 -103 54 -10 0 -32 -5 -50 -10z m72 -63 c16 -12 17 -16 6 -30 -7 -9 -21 -16 -31 -16 -10 0 -24 7 -31 16 -11 14 -10 18 6 30 10 8 22 14 25 14 3 0 15 -6 25 -14z',
						// symbol: 'circle',
						symbolSize: [40, 50],
						data: [{
							name: '标记点',
							value: [120.256616, 30.239604, 100],
							info: require('../assets/icon/dianwei.png'),
						}],
					}]
				};
				// console.log(myChart)
				myChart.getZr().on('dblclick', (clickparams)=> {
					console.log(dataObj);
					if (dataObj.name == '河南') {
						this.chinaJson = require('@/assets/json/henan.json')
						echarts.registerMap("china", this.chinaJson)
					}else{
						this.chinaJson = require('@/assets/json/china.json')
						echarts.registerMap("china", this.chinaJson)
					}
					// 解决方法一
					// myChart.dispatchAction({ //来用程序主动渲染选框
					// 	type: "restore",//restore 重置 option 事件。
					// });
					// option && myChart.setOption(option);
					
					// 解决方法二
					myChart.dispose(); //地图销毁函数
					this.setMap3D(this.chinaJson) //重新执行初始化地图的方法并传入地图数据
				});
				option && myChart.setOption(option);
			}

码字不易,如有帮到您,麻烦三连支持下!!!!!

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

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

相关文章

Linux安装后门监测工具chkrootkit

官网&#xff1a;chkrootkit -- locally checks for signs of a rootkit locally checks for signs of a rootkit Chkrootkit is named Top 10 Tools to Scan Linux Servers for Vulnerability and Malware by Cyber Security News. Debian安装 sudo apt install chkrootkit#…

BigDecimal有哪些坑?

BigDecimal概述 BigDecimal是Java编程语言中的一个类&#xff0c;用于进行高精度的十进制数值计算。它提供了精确的数值表示和计算&#xff0c;可以处理比基本数据类型&#xff08;如double和float&#xff09;更大范围和更高精度的数字。 Java的基本数据类型&#xff08;如i…

在线考试教学系统平台系统源码/视频教学系统PHP源码/在线考试系统PHP源码

在线考试教学系统平台系统源码&#xff0c;视频教学系统PHP源码&#xff0c;在线考试系统PHP源码。 安装说明&#xff1a; 1、部署好网站环境&#xff1a;php5.6mysql 2、将源码传至网站根目录&#xff0c;php源码用二进制上传&#xff0c;或者上传压缩包在空间解压 3、将据库…

独热编码和Embedding

对于一个大小为N词典&#xff0c;给出一个N*N的矩阵。将这些词分别进行编码。再者&#xff0c;例如&#xff0c;香蕉与水果这两个词词意接近&#xff0c;我们引进余弦相似度来计算两者相似度。余弦值越接近1&#xff0c;就表明夹角越接近0度&#xff0c;也就是两个向量越相似。…

团体程序设计天梯赛-练习集L2篇⑧

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

css基础(三)

目录 一、CSS三大特性 1.层叠性 2.继承性 3.行高的继承 4.CSS三大特性之优先级 5.优先级注意的问题 6.CSS权重的叠加 二、盒子模型 1.盒子模型组成部分 2.盒子模型边框border 3.边框的复合写法 4.表格细线边框 5.边框会影响盒子实际大小 6.盒子模型内边距padding 7.盒子模型外边…

文心一言 VS 讯飞星火 VS chatgpt (49)-- 算法导论6.2 1题

一、参照图6-2的方法&#xff0c;说明 MAX-HEAPIFY(A&#xff0c;3)在数组 A(27&#xff0c;17&#xff0c;3&#xff0c;16&#xff0c;13&#xff0c;10&#xff0c;1&#xff0c;5&#xff0c;7&#xff0c;12&#xff0c;4&#xff0c;8&#xff0c;9&#xff0c;0)上的操作…

怪物设计记录

一、怪物的对抗性 《怪物猎人世界》 1.生态系的重视&#xff0c;高低差&#xff0c;怪物密度 3.怪物的活动范围 4.瘴气之谷 设定&#xff1a;鲸落等等 5.设定上的爬升 6.怪物设计原则&#xff1a; 和同一只怪物多次战斗&#xff0c;仍然能感觉到乐趣 让玩家尝试不同种类的…

责任链模式(Chain of Responsibility)

别名 命令链&#xff08;Chain of Command&#xff09;。 定义 责任链是一种行为设计模式&#xff0c;允许你将请求沿着处理者链进行发送。收到请求后&#xff0c;每个处理者均可对请求进行处理&#xff0c;或将其传递给链上的下个处理者。 前言 1. 问题 假如你正在开发一…

监听器-Listener

Servlet规范中的监听器-Listener 观察者设计模式, 所有的监听器都是观察者设计模式的体现。 什么是观察者设计模式呢&#xff1f; 它是事件驱动的一种体现形式。就好比在做什么事情的时候被人盯着。当对应做到某件事时&#xff0c;触发事件。 观察者模式通常由以下三部分组成…

【话题达人】你觉得存款难吗?如何看待半数年轻人存款不住10万?这不是基操

导读 近日&#xff0c;有调查称 大概五分之一的年轻人存款在一万元以内。10万元存款是一个“坎”&#xff0c;存款超过10万就会超过53.7%的人。年轻人(23-28) 和 存款 两个词碰撞在一起&#xff0c;引来了广泛的关注和讨论。你认为年轻人存款难吗&#xff1f; 先说结论&#…

程序员之马上结束任务

计算机系的男同学追班里一女同学&#xff0c;结果此女总是躲躲闪闪。 男的看没戏&#xff0c;就另找了一个去追&#xff0c;结果这女的不满意了&#xff0c;质问这男的为啥抛弃她。 男的问&#xff1a;“请教一个电脑问题&#xff0c;如果你点击一个程序&#xff0c;总是提示…

浓浓书香伴新春,TVP邀你共读7本精选好书!

引言 颜之推在《颜氏家训勉学》中曾云“夫所以读书学问&#xff0c;本欲开心明目&#xff0c;利于行耳。”所谓读书学问&#xff0c;就是要开阔自己的胸襟&#xff0c;提高自己的鉴别力&#xff0c;从而有利于亲身实践。岁末年初&#xff0c;庭前飘雪&#xff0c;TVP 带你赴一场…

刚去了家新公司,发现个个都是卷王 , 真想离职了。。。

个个都说想躺平了&#xff0c;可是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00后&#xff0c;才工作一年&#xff0c;跳槽到我们公司起薪15K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。…

Python元组、集合、字典

总有一天你要一个人在暗夜中&#xff0c;向那座桥走过去 文章目录 一、元组 字符串、元组、列表的总结 二、集合 1.定义空集合 2.创建集合 &#xff08;1&#xff09;直接创建 &#xff08;2&#xff09;set函数 3.列表、元组、字符串、字典的去重 4.向集合中添加元素…

VUE-001-在表格单元格(el-table-column)中添加超链接访问

在进行前端网页开发时&#xff0c;通常列表数据我们使用table展示。那么如何在 el-table-column 单元格中使用超链接呢&#xff1f; 如下即是解决方式的一种&#xff1a; 仅需要将如下代码&#xff1a; <el-table-column prop"url" label"访问链接" …

软件测试入门(测试环境及用例编写)

目录 一、什么是软件环境 二、软件运行环境类型 三、什么是测试用例&#xff08;测试case&#xff09; 四、测试用例包含哪些信息 五、测试用例设计方法 六、如何设计一个功能点的case 一、什么是软件环境 人有人类的生存环境&#xff1b;软件有软件的运行环境 二、软件…

数通王国历险记之TCP协议的三次握手和四次挥手

系列文章目录 数通王国历险记&#xff08;2&#xff09; 目录 前言 一、TCP我们称之为可靠的传输层协议&#xff0c;为什么称它为可靠呢? 二、TCP的建立——三次握手 1&#xff0c;提前知道TCP协议报文中都有些啥&#xff1f; 2.第一次握手 总的来说:就是PC1向PC2发出一个…

MySql进阶篇(附面试快速答法)

文章目录 1、慢查询1.1、如何定位慢查询呢&#xff1f;小总结面试快速答法 1.2、SQL语句执行很慢, 如何分析呢&#xff1f;小总结面试快速答法 2、存储引擎2.1、MySQL体系结构2.2、存储引擎特点小总结 3、索引3.1、什么是索引&#xff1f;小总结面试快速答法 3.2、聚集索引和非…

mesh网格数据解析及cesium可视化实现

代码实现运行效果 技术术语 Mesh通常指网络拓扑中的网状结构。在计算机网络中&#xff0c;Mesh是指每个节点都与其他节点相连&#xff0c;形成一个无中心的网状结构。Mesh网络常见于分布式计算、传感器网络、互联网等场景中。另外&#xff0c;在3D计算机图形学中&#xff0c;M…