echarts实现伪3D地图、省会坐标涟漪、自动轮播、数据联动

2023-10-10 23:52

本文主要是介绍echarts实现伪3D地图、省会坐标涟漪、自动轮播、数据联动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果图:

在这里插入图片描述
实现的效果:

  1. 伪3D效果地图
  2. 省会坐标展示标点,并带有涟漪效果
  3. 鼠标覆盖的区域,区域以及涟漪高亮
  4. 地图上的所有区域按照时间间隔轮播
  5. 点击、轮播时的区域,会带着所有其他表格的数据进行联动刷新,展示不同地区的统计数据

完整的JS代码:


let regions = [];
let orgRegions = [];// 初始状态颜色
var selectedAreaName = "";// 当前被选中/轮播地市
var mapName = 'NX';
var geoJson = mapData;// 普通涟漪效果的标点
function convertNormalLianyiData(mapData) {var res = [];for (var i = 0; i < mapData.features.length; i++) {var prop = mapData.features[i].properties;//var geoCoord =  prop.center;// 标点位于地区省会var geoCoord = prop.centroid;// 标点位于地区正中心if (geoCoord && prop.name != selectedAreaName) {res.push({name: prop.name,// 横纵坐标后,拼接高度坐标,默认为10value: geoCoord.concat(100),adcode: prop.adcode,});}}return res;
}
// 选中区域涟漪效果的标点
function convertSelectedLianyiData(mapData) {var res = [];for (var i = 0; i < mapData.features.length; i++) {var prop = mapData.features[i].properties;//var geoCoord =  prop.center;// 标点位于地区省会var geoCoord = prop.centroid;// 标点位于地区正中心if (geoCoord && prop.name == selectedAreaName) {res.push({name: prop.name,// 横纵坐标后,拼接高度坐标,默认为10value: geoCoord.concat(100),adcode: prop.adcode,});}}return res;
}for (i = 0; i < geoJson.features.length; i++) {let cityInfo = {name: geoJson.features[i].properties.name,adcode: geoJson.features[i].properties.adcode,}city.push(cityInfo);
}
for (i = 0; i < city.length; i++) {regions.push({name: city[i].name,adcode: city[i].adcode,itemStyle: {color: color[i % 10]},});orgRegions.push({name: city[i].name,adcode: city[i].adcode,itemStyle: {color: color[i % 10]},});
}// 叠加图层构建立体效果
let addShadow = function (geo) {let max = 30;let upper = '#2768b6';let deeper = '#0e408a';for (let i = 0; i < max; i++) {geo.push({type: 'map',map: mapName,// 地图标签label: {show: false},layoutCenter: ['50%', '50%'],layoutSize: '80%',zlevel: -1 * i,itemStyle: {normal: {color: 'rgba(39, 104 ,190, 1)',borderColor: '#AEFBFF',borderWidth: 1,opacity: 0.8,shadowColor: i < max / 2 ? upper : deeper,shadowOffsetX: i * -1,shadowOffsetY: i * 1.5,shadowBlur: 1},emphasis: {show: false,color: "#fff",// 地图区域被选中的颜色areaColor: "rgba(0,254,233,0.6)",},},aspectScale: 1, //长宽比selectedMode: false, //是否允许选中多个区域});}
};
let geo = [{type: 'map',map: mapName,itemStyle: {normal: {areaColor: {type: "linear",x: 1200,y: 0,x2: 0,y2: 0,colorStops: [{offset: 0,color: "rgba(3,27,78,0.75)", // 0% 处的颜色},{offset: 1,color: "rgba(58,149,253,0.75)", // 50% 处的颜色},],global: true, // 缺省为 false},borderColor: "#fff",borderWidth: 0.2,},emphasis: {show: false,color: "#fff",// 地图区域被选中的颜色areaColor: "rgba(0,254,233,0.6)",},},// 地图标签label: {show: false},layoutCenter: ['50%', '50%'],layoutSize: '80%',zlevel: 0,aspectScale: 1, //长宽比selectedMode: false, //是否允许选中多个区域}
];
addShadow(geo);option = {tooltip: {show: true, // 提示框trigger: 'item',formatter: function (params) {return params.name;}},geo: geo,series: [{type: 'map',map: mapName,itemStyle: {normal: {areaColor: {type: "linear",x: 1200,y: 0,x2: 0,y2: 0,colorStops: [{offset: 0,color: "rgba(3,27,78,0.75)", // 0% 处的颜色},{offset: 1,color: "rgba(58,149,253,0.75)", // 50% 处的颜色},],global: true, // 缺省为 false},borderColor: "#fff",borderWidth: 0.2,},emphasis: {show: false,color: "#fff",// 地图区域被选中的颜色areaColor: "rgba(0,254,233,0.6)",},},// 地图标签label: {show: false},zlevel: -1,aspectScale: 1, //长宽比selectedMode: false, //是否允许选中多个区域data: convertNormalLianyiData(mapData),},// 常规状态下的涟漪效果{// 动效散点公共配置项type: 'effectScatter',// 使用的坐标系coordinateSystem: 'geo',// 涟漪效果rippleEffect: {//涟漪特效color: '#f29130',period: 4, //动画时间,值越小速度越快brushType: 'stroke', //波纹绘制方式 stroke, fillscale: 10 //波纹圆环最大限制,值越大波纹越大},symbol: 'circle',symbolSize: 15,label: {normal: {show: true,position: 'bottom', //显示位置offset: [5, 0], //偏移设置formatter: function (params) {//圆环显示文字return params.data.name;},textStyle: {fontSize: 15,color: 'white',borderWidth: 15//borderColor: 'orange'}},emphasis: {show: true}},// 城市坐标样式itemStyle: {normal: {color: {type: 'linear',x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: '#fbc05d' // 0% 处的颜色},{offset: 1,color: '#ee8125' // 100% 处的颜色}],global: false // 缺省为 false}}},data: convertNormalLianyiData(mapData)},// 选中状态下的涟漪效果{// 动效散点公共配置项type: 'effectScatter',// 使用的坐标系coordinateSystem: 'geo',// 涟漪效果rippleEffect: {//涟漪特效color: '#1a6198',period: 4, //动画时间,值越小速度越快brushType: 'fill', //波纹绘制方式 stroke, fillscale: 15 //波纹圆环最大限制,值越大波纹越大},symbol: 'circle',symbolSize: 15,label: {normal: {show: true,position: 'bottom', //显示位置offset: [5, 0], //偏移设置formatter: function (params) {//圆环显示文字return params.data.name;},textStyle: {fontSize: 15,color: 'white',borderWidth: 15//borderColor: 'orange'}},emphasis: {show: true}},// 城市坐标样式itemStyle: {normal: {color: {type: 'linear',x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: '#fbc05d' // 0% 处的颜色},{offset: 1,color: '#ee8125' // 100% 处的颜色}],global: false // 缺省为 false}}},data: convertSelectedLianyiData(mapData)}]
};function buildOption(context, eChartData, chartOption, echarts) {debuggerecharts.registerMap(mapName, geoJson);startLunbo(context, true);// 初始化时立即广播宁夏if (context.vueContext) {let selectedCode = '640000';let msg = {//P_ND: "20220101",CZQH: selectedCode}context.vueContext.emit('sendMsg', msg)}chartOption = option;return chartOption;
};
var myChart;
var interval;
function onRender(context, eChartData, container, obj, instance) {debuggermyChart = instance;// 鼠标移入轮播结束,移出轮播开始myChart.off('mouseover')myChart.on("mouseover", (params) => {clearInterval(interval);clearAllStyle();// 记录被选中的/轮播的区域selectedAreaName = params.name;resetScatter();setSelectedStyle();myChart.setOption(option);});myChart.off('mouseout')myChart.on("mouseout", () => {debuggerselectedAreaName = "";resetScatter();//轮播函数开始clearInterval(interval);clearAllStyle();startLunbo(context);// 记录被选中的/轮播的区域myChart.setOption(option);});myChart.off('click')myChart.on("click", function (params) {// debugger// 点击区域的区划codelet changeCode = params.region.adcode;if (changeCode && context.vueContext) {let msg = {//P_ND: "20220101",CZQH: changeCode}context.vueContext.emit('sendMsg', msg)}// 仪表盘的Id// let dashboardGuid = window['nvwa-dataanalyze-dashboard_0000018A39DD52A99D9A26069BCED0DE'].dashboardGuid;console.log('点击获取Params', params);});
};
/*** * @param context 图表上下文参数* @param init 是否为第一加载:true:立即开启选中,false:时间间隔后开启选中*/
function startLunbo(context, init = false) {// debugger// 保留当前选中地市的下标和颜色信息const lastSelectedArea = {index: 0,color: 'rgba(39, 104 ,190, 1)',};let _context = context;// 开始轮播,-1表示展示省级信息let mapIndex = -1;interval = setInterval(() => {if (mapIndex == -1) {clearAllStyle();if (!init) {// 广播宁夏if (_context.vueContext) {let selectedCode = '640000';let msg = {//P_ND: "20220101",CZQH: selectedCode}_context.vueContext.emit('sendMsg', msg)}}mapIndex++;} else {regions[lastSelectedArea.index].itemStyle.color = lastSelectedArea.color;let finishLunbo = (mapIndex == mapData.features.length);mapIndex = mapIndex % mapData.features.length;lastSelectedArea.index = mapIndex;lastSelectedArea.color = regions[lastSelectedArea.index].itemStyle.color;// 当前轮播被选中的地区颜色regions[mapIndex].itemStyle.color = '#ffffff';// regions[mapIndex].itemStyle.color = '#e2cd00';// 记录被选中的/轮播的区域selectedAreaName = regions[mapIndex].name;// 广播当前轮播的财政区划if (_context.vueContext) {let selectedCode = regions[mapIndex].adcode;let msg = {//P_ND: "20220101",CZQH: selectedCode}_context.vueContext.emit('sendMsg', msg)}if (finishLunbo == true) {// 全部轮询完成,从省级重新开始,下标恢复为-1mapIndex = -1;} else {mapIndex++;}for (let i = 0; i < option.geo.length; i++) {const geoItem = option.geo[i];geoItem.regions = regions;}resetScatter();}myChart.setOption(option);}, 15000);// 此处修改轮播的频率(单位毫秒)
}
// 清除所有地区被选中样式
function clearAllStyle() {// debuggerfor (let i = 0; i < option.geo.length; i++) {const geoItem = option.geo[i];geoItem.regions = orgRegions;}regions = [];for (i = 0; i < city.length; i++) {regions.push({name: city[i].name,adcode: city[i].adcode,itemStyle: {color: color[i % 10]},});}myChart.setOption(option);
}
// 重置涟漪效果
function resetScatter() {option.series[1].data = convertNormalLianyiData(mapData);option.series[2].data = convertSelectedLianyiData(mapData);
}
// 设置被选中地区样式
function setSelectedStyle() {// debugger// 被选中的地区颜色let selectedStyle = {color: "rgba(0,254,233,0.6)",}for (let i = 0; i < regions.length; i++) {const selectedItem = regions[i];if (selectedItem.name == selectedAreaName) {selectedItem.itemStyle = selectedStyle;break;}}for (let i = 0; i < option.geo.length; i++) {const geoItem = option.geo[i];geoItem.regions = regions;}
}

这篇关于echarts实现伪3D地图、省会坐标涟漪、自动轮播、数据联动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/184024

相关文章

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

PyQt5+Python-docx实现一键生成测试报告

《PyQt5+Python-docx实现一键生成测试报告》作为一名测试工程师,你是否经历过手动填写测试报告的痛苦,本文将用Python的PyQt5和python-docx库,打造一款测试报告一键生成工... 目录引言工具功能亮点工具设计思路1. 界面设计:PyQt5实现数据输入2. 文档生成:python-

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

浅析如何使用xstream实现javaBean与xml互转

《浅析如何使用xstream实现javaBean与xml互转》XStream是一个用于将Java对象与XML之间进行转换的库,它非常简单易用,下面将详细介绍如何使用XStream实现JavaBean与... 目录1. 引入依赖2. 定义 JavaBean3. JavaBean 转 XML4. XML 转 J

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例