echarts 地图迁徙与地图下钻

news2025/2/26 0:28:11

echarts 地图迁徙与地图下钻

一、迁徙

地图迁徙

1、引入中国地图数据及echarts

const china = require("./echarts-mapJson-master/china.json")
import * as echarts from 'echarts'

2、数据准备

// 点数据 需要hover或点击获取数据可以添加额外的参数,
// 如{ value: [118.8062, 31.9208], code:'440100',itemStyle: { color: '#4ab2e5' },code可以在hover或点击的时候拿到;
// 数组最后一个点是线指向的终点,也可不设
let poinstData = [
                    { value: [118.8062, 31.9208], itemStyle: { color: '#4ab2e5' } }
                    , { value: [127.9688, 45.368], itemStyle: { color: '#4fb6d2' } }
                    , { value: [110.3467, 41.4899], itemStyle: { color: '#52b9c7' } }
                    , { value: [125.8154, 44.2584], itemStyle: { color: '#5abead' } }
                    , { value: [116.4551, 40.2539], itemStyle: { color: '#f34e2b' } }
                    , { value: [123.1238, 42.1216], keysValue: 8, itemStyle: { color: '#f56321' } }
                    , { value: [114.4995, 38.1006], itemStyle: { color: '#f56f1c' } }
                    , { value: [117.4219, 39.4189], itemStyle: { color: '#f58414' } }
                    , { value: [112.3352, 37.9413], itemStyle: { color: '#f58f0e' } }
                    , { value: [109.1162, 34.2004], itemStyle: { color: '#f5a305' } }
                    , { value: [103.5901, 36.3043], itemStyle: { color: '#e7ab0b' } }
                    , { value: [106.3586, 38.1775], itemStyle: { color: '#dfae10' } }
                    , { value: [101.4038, 36.8207], itemStyle: { color: '#d5b314' } }
                    , { value: [103.9526, 30.7617], itemStyle: { color: '#c1bb1f' } }
                    , { value: [108.384366, 30.439702], itemStyle: { color: '#b9be23' } }
                    , { value: [113.0823, 28.2568], itemStyle: { color: '#a6c62c' } }
                    , { value: [102.9199, 25.46639], itemStyle: { color: '#96cc34' } }
                    , { value: [113.335367, 23.13559]}
                ],
// 线数据 同样可以添加额外的参数,点击时type为lines时可拿到参数
let linesData = [
                   { coords: [ [118.8062, 31.9208],[113.335367, 23.13559]], lineStyle: { color: '#4ab2e5' } }
                    , { coords: [ [127.9688, 45.368],[113.335367, 23.13559]], lineStyle: { color: '#4fb6d2' } }
                    , { coords: [ [110.3467, 41.4899],[113.335367, 23.13559]], lineStyle: { color: '#52b9c7' } }
                    , { coords: [ [125.8154, 44.2584],[113.335367, 23.13559]], lineStyle: { color: '#5abead' } }
                    , { coords: [ [116.4551, 40.2539],[113.335367, 23.13559]], lineStyle: { color: '#f34e2b' } }
                    , { coords: [ [123.1238, 42.1216],[113.335367, 23.13559]], lineStyle: { color: '#f56321' } }
                    , { coords: [ [114.4995, 38.1006],[113.335367, 23.13559]], lineStyle: { color: '#f56f1c' } }
                    , { coords: [ [117.4219, 39.4189],[113.335367, 23.13559]], lineStyle: { color: '#f58414' } }
                    , { coords: [ [112.3352, 37.9413],[113.335367, 23.13559]], lineStyle: { color: '#f58f0e' } }
                    , { coords: [ [109.1162, 34.2004],[113.335367, 23.13559]], lineStyle: { color: '#f5a305' } }
                    , { coords: [ [103.5901, 36.3043],[113.335367, 23.13559]], lineStyle: { color: '#e7ab0b' } }
                    , { coords: [ [106.3586, 38.1775],[113.335367, 23.13559]], lineStyle: { color: '#dfae10' } }
                    , { coords: [ [101.4038, 36.8207],[113.335367, 23.13559]], lineStyle: { color: '#d5b314' } }
                    , { coords: [ [103.9526, 30.7617],[113.335367, 23.13559]], lineStyle: { color: '#c1bb1f' } }
                    , { coords: [ [108.384366, 30.439702],[113.335367, 23.13559]], lineStyle: { color: '#b9be23' } }
                    , { coords: [ [113.0823, 28.2568],[113.335367, 23.13559]], lineStyle: { color: '#a6c62c' } }
                    , { coords: [ [102.9199, 25.46639],[113.335367, 23.13559]], lineStyle: { color: '#96cc34' } }
]

3、获取options

getOptions(name, id, seriesData, pointsData, linesData ){
	let _this = this;
                return {
                    backgroundColor: '#0F1C3C',
                    toolbox: { // 返回按钮
                        right: '5%',
                        top: '15%',
                        feature: {
                            myBack: {
                                show: false,
                                title: '返回',
                                icon: 'path://M473.2 276.9v-133c-4-18.4-11.7-27-20.2-30.3-17.2-6.7-37.8 8.5-37.8 8.5L95.9 395.4c-70.1 48.4-4.8 84.7-4.8 84.7L405.5 751c62.9 46 67.7-24.2 67.7-24.2V603.4c319.3-99.2 449.9 297.5 449.9 297.5 12.1 21.8 19.3 0 19.3 0 123.4-595-469.2-624-469.2-624z m0 0',
                                iconStyle: {
                                    color: "#1aaef6",
                                    borderColor: "#1aaef6"
                                },
                                onclick: async function () {
                                    const seriesData = await _this.handleMap('china', chinaJson);
                                    const opt = await _this.getOptions('china', '', seriesData, _this.pointsData, _this.linesData)
                                    await _this.myChart.setOption(opt, true);
                                }
                            }
                        }
                    },
                    tooltip: {
                        trigger: 'item',
                        backgroundColor: '#ffff',
                        borderColor: '#FFFFCC',
                        showDelay: 0,
                        hideDelay: 0,
                        enterable: true,
                        transitionDuration: 0,
                        extraCssText: 'z-index:100',
                        formatter: function (params, ticket, callback) {
                            let name = params.name
                            //根据业务自己拓展要显示的内容
                            // 自定义数据 params.data
                            let res = "<div>" + name + '</div>'
                            return res;
                        },
                    },
                    geo: {
                        map: 'china',// 下钻时以当前地图名称命名
                        show: true,
                        roam: true,
                        zoom: 1.2,
                        label: {
                            show: true,
                            color: '#1DE9B6',
                            emphasis: {
                                show: true,
                                areaColor: {
                                    x: 0,
                                    y: 0,
                                    x2: 0,
                                    y2: 1,
                                    colorStops: [
                                        {
                                            offset: 0,
                                            color: '#073684' // 0% 处的颜色
                                        },
                                        {
                                            offset: 1,
                                            color: '#061E3D' // 100% 处的颜色
                                        }
                                    ]
                                }
                            }
                        },
                        layoutSize: '100%',
                        itemStyle: {
                            areaColor: {
                                x: 0,
                                y: 0,
                                x2: 0,
                                y2: 1,
                                colorStops: [
                                    {
                                        offset: 0,
                                        color: '#073684' // 0% 处的颜色
                                    },
                                    {
                                        offset: 1,
                                        color: '#061E3D' // 100% 处的颜色
                                    }
                                ]
                            },
                            borderColor: '#2863ad',
                            borderWidth: 1,
                            shadowColor: 'rgba(10,76,139,1)',
                            shadowOffsetY: 0,
                            shadowBlur: 60,
                            emphasis: {
                                areaColor: '#2AB8FF',
                                borderWidth: 0,
                                color: 'green',
                                label: {
                                    show: false
                                }
                            }
                        },

                    },
                    series: [
                        {
                            type: 'map',
                            map: 'china',// 有data时不需要
                            roam: true,
                            geoIndex: 0,
                            aspectScale: 0.85, //长宽比
                            show: true,
                            textStyle: {
                                color: '#1DE9B6'
                            },
                            emphasis: {
                                textStyle: {
                                    color: 'rgb(183,185,14)'
                                }
                            },
                            itemStyle: {
                                borderColor: 'rgb(147, 235, 248)',
                                borderWidth: 1,
                                areaColor: {
                                    type: 'radial',
                                    x: 0.5,
                                    y: 0.5,
                                    r: 0.8,
                                    colorStops: [{
                                        offset: 0,
                                        color: '#09132c' // 0% 处的颜色
                                    }, {
                                        offset: 1,
                                        color: '#274d68'  // 100% 处的颜色
                                    }],
                                    globalCoord: true // 缺省为 false
                                },
                                emphasis: {
                                    areaColor: 'rgb(46,229,206)',
                                    // shadowColor: 'rgb(12,25,50)',
                                    borderWidth: 0.1
                                }
                            },
                           // data:[{name:'',value:[经,纬]}] 
                        },
                        {
                            type: 'effectScatter', // 动效散点
                            coordinateSystem: 'geo',
                            showEffectOn: 'render',
                            zlevel: 1,
                            rippleEffect: { // 涟漪特效
                                period: 4, // 动画的周期,秒数
                                scale: 5, // 动画中波纹的最大缩放比例
                                brushType: 'stroke',// ['fill','stroke'] 波纹海浪或线圈
                            },
                            hoverAnimation: true,
                            label: {
                                formatter: '{b}',
                                position: 'right',
                                offset: [15, 0],
                                color: '#1DE9B6',
                                show: true
                            },
                            itemStyle: {
                                color: '#1DE9B6',
                                shadowBlur: 10,
                                shadowColor: '#333'
                            },
                            symbolSize: function (val) { // 点大小
                                return 12
                            },
                            data: pointsData
                        }, //地图线的动画效果
                        {
                            type: 'lines',
                            zlevel: 2,
                            effect: {
                                show: true,
                                period: 4, // 箭头指向速度,值越小速度越快
                                trailLength: 0.4, // 特效尾迹长度[0,1]值越大,尾迹越长重
                                symbol: 'arrow', // 箭头图标
                                symbolSize: 7, // 图标大小
                            },
                            lineStyle: {
                                color: '#1DE9B6',
                                width: 1, // 线条宽度
                                opacity: 0.1, // 尾迹线条透明度
                                curveness: .3 // 尾迹线条曲直度
                            },
                            data: linesData
                        }
                    ]
                };
}

4、画图

// 先引入中国地图,再画图
async loadData(){
 let _this = this;
 this.myChart = echarts.getInstanceByDom(this.$refs.baseEcharts);
 if (!this.myChart) {
    this.myChart = await echarts.init(this.$refs.baseEcharts);
 }
 await _this.myChart.setOption(option);
}

二、下钻

1、画中国地图
2、从地图点击事件中获取到省级id或市级编码(具体看下一级显示什么)
3、根据省级id拿到对应省级地图数据,注册地图
4、拿到对应option,再setOptions,返回中国地图再画一遍中国地图(当前显示哪一个地图就画哪一个地图)
5、缩放或其他原因,切换地图后地图不在容器中心点解决,setOptions(option,true),true意思为重新绘画地图
在这里插入图片描述

			/**
             * 获取当前配置项
             * @param{string} name 当前地图
             * @param{string} id 当前地图id
             * @param{array} seriesData 组[{name,value}]
             * @param{array} pointsData 点
             * @param{array} linesData 线
             * */
            async getOptions(name, id, seriesData, pointsData, linesData) {
            	let _this = this;
            	// 参考迁徙图
            	return{}
            }
		 	/**
             * @description 画图
             * @param{string} name 画图
             * @param{object} json 当前地图数据
             * @return{array} [{name:'',value:[]}]
             * */
            async handleMap(name, json) {
                let obj = {}, map = [];
                // 1、初始化全国地图
                // 2、设置点击事件-单击下钻,双击返回
                // 3、单击注册点击省份地图-setOption画图
                // 4、双击返回,重新画全国地图
                if (name !== 'china') { // 注册地图
                    echarts.registerMap(name, json);
                }
                let mapFeatures = echarts.getMap(name) ? echarts.getMap(name).geoJson.features : [];
                mapFeatures.forEach(function (v) {
                    obj = { name: v.properties.name, value: v.properties.cp }
                    if (name === 'china') {
                        obj.value.push(v.properties.id)
                    }
                    map.push(obj)
                });
                return map
            },
            /**
             * @description 实例化
             * */
            async loadData() {
                let _this = this;
                this.myChart = echarts.getInstanceByDom(this.$refs.baseEcharts);
                if (!this.myChart) {
                    this.myChart = await echarts.init(this.$refs.baseEcharts);
                }
                // 全国地图
                echarts.registerMap('china', chinaJson);
                // 每个地图点,series第一个type: 'map'的data
                const seriesData = await this.handleMap('china', chinaJson);
                // options
                const opt = await this.getOptions('china', '', seriesData, this.pointsData, this.linesData)
                // 绘画
                await this.myChart.setOption(opt);
                // 监控窗口变化
                // window.addEventListener("resize", this.resize); // myChart.resize();
                this.myChart.on('click', async function (params) {
                    // 项目点击-下钻
                    if (params.data && params.data.value && params.data.value[2]) {
                        const json = require('./echarts-mapJson-master/geometryProvince/' + params.data.value[2] + '.json')
                        if (!json) {
                            return;
                        }
                        const seriesData = await _this.handleMap(params.data.value[2], json);
                        const opt = await _this.getOptions(params.data.value[2], params.data.value[2], seriesData, _this.pointsData, _this.linesData)
                        opt.toolbox.feature.myBack.show = true
                        await _this.myChart.setOption(opt, true);

                    }
                })
                // 双击返回
                this.myChart.on('dblclick', async function (params) {
                    if (params.type === 'dblclick' && params.data && (!params.data.value || !params.data.value[2])) {
                        const seriesData = await _this.handleMap('china', chinaJson);
                        const opt = await _this.getOptions('china', '', seriesData, _this.pointsData, _this.linesData)
                        await _this.myChart.setOption(opt, true);
                    }
                })
            },

参考:
1、echarts Demo集 https://www.isqqw.com/
2、https://datav.aliyun.com/portal/school/atlas/area_selector#&lat=31.027163647290617&lng=106.75386074913891&zoom=4.5
3、地图资源 https://gitee.com/niceguy802/map-resources.git

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

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

相关文章

前端开发必知:HTML、Vue和React中的跨域页面跳转解决方案

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

万物皆可“云” 从杭州云栖大会看数智生活的未来

文章目录 前言一、云栖渐进&#xff1a;一个科技论坛的变迁与互联网历史互联网创新创业飞天进化飞天智能驱动数字中国 二、2023云栖大会&#xff1a;云计算人工智能 玩出科技跨界新花样大会亮点重磅嘉宾热门展览算力馆人工智能馆产业创新馆 总结 前言 10月31日&#xff0c;202…

查询平均提速 700%,奇安信基于 Apache Doris 升级日志安全分析系统

本文导读&#xff1a; 数智时代的到来使网络安全成为了不可忽视的重要领域。奇安信作为一家领先的网络安全解决方案领军者&#xff0c;致力于为企业提供先进全面的网络安全保护&#xff0c;其日志分析系统在网络安全中发挥着关键作用&#xff0c;通过对运行日志数据的深入分析…

做好团队沟通和协调 不可忽略的5个重点

做好团队的沟通和协调&#xff0c;可以确保成员之间及时交流、分享信息和解决问题。这有助于避免信息滞后和工作冲突&#xff0c;提高工作效率。如果沟通不顺畅&#xff0c;往往导致成员间信息传递不及时或遗漏&#xff0c;容易产生误解和冲突&#xff0c;影响项目进度地顺利开…

【LVS实战】02 搭建一个LVS-NAT模式实验

一、网络结构 用虚拟机搭建如下的几台机器&#xff0c;并配置如下的ip 关于虚拟机网卡和网络的配置&#xff0c;可以参考 iptables章节&#xff0c;05节&#xff1a;网络转发实验 主机A模拟外网的机器 B为负载均衡的机器 C和D为 RealServer 二、C和D主机的网关设置 C和D机…

专业医学病例翻译公司推荐

我们知道&#xff0c;医学病例翻译在涉外看病的患者中具有广泛的应用&#xff0c;它可以帮助医生快速了解患者的病情&#xff0c;为治疗和药物处方提供关键信息。因此&#xff0c;对于出国看病的患者&#xff0c;医学病例翻译便成了不可或缺的重要工具。 翻译医学病例不仅要求译…

使用 Node.js 搭建 API 网关

您好&#xff0c; 如果喜欢我的文章或者想上岸大厂&#xff0c;可以关注公众号「量子前端」&#xff0c;将不定期关注推送前端好文、分享就业资料秘籍&#xff0c;也希望有机会一对一帮助你实现梦想 外部客户端访问微服务架构中的服务时&#xff0c;服务端会对认证和传输有一些…

如何将微信视频号的视频保存到手机相册?

微信视频号是近年来微信推出的一项功能&#xff0c;它允许用户通过手机拍摄和分享短视频内容。然而&#xff0c;许多人纷纷表示他们想要保存微信视频号上的视频&#xff0c;以便在离线时观看。但一直以来这个需求腾讯一直没有开放随后也取消了复制视频链接功能&#xff0c;为此…

最全的操作系统原版镜像,镜像winxp、win7、8、10、11,win server2008、2012、2016、2019、2022各版本系统下载 址

1、 MSDN原版系统(我告诉你&#xff09; [软件、镜像下载地址](https://www.imsdn.cn/)2、 HelloWindows.cn 精校 完整 极致 Windows系统下载仓储站 镜像、软件下载地址 3、系统库 镜像下载地址 4、 山己几子木 镜像下载地址

Redis Predixy 集群

文章目录 一、概述二、测试规划三、Redis 服务实例准备3.1 配置Redis实例3.2 创建相关资源3.2 启动Redis服务实例 四、Sentinel 监控准备4.1 配置 sentine l3.2 开启 Sentinel 五、安装配置 Predixy5.1 下载 Predixy5.2 配置 Predixy5.3 启动 Predixy 代理 六、测试 如果您对Re…

快手协议算法最新版

快手的协议分析是指对快手算法系统进行分析&#xff0c;以了解其推荐内容和个性化用户体验的机制。 然而&#xff0c;一般来说&#xff0c;协议分析的目标是理解算法系统中各个组成部分的功能和作用&#xff0c;以及它们之间的相互关系。以下是一些常见的分析方向&#xff1a;…

Jmeter之JSR223

一、JSR223组件 JSR是Java Specification Requests的缩写,意思是Java规范提案。JSR已成为Java界的一个重要标准. JSR223其实包含了有好几种组件,但是其用法都是一致的,并且都是执行一段代码&#xff0c;主要分类如下&#xff1a; JSR223 PreProcessor JSR223 Timer JSR223 S…

高防CDN如何在防护cc上大显神通

高级防御CDN&#xff08;Content Delivery Network&#xff09;在对抗CC&#xff08;HTTP Flood&#xff09;攻击方面扮演着关键的角色&#xff0c;具备以下重要职能和作用&#xff1a; 流量分散&#xff1a;CC攻击的目标是通过大规模的HTTP请求使服务器过载&#xff0c;从而导…

【Docker】十分钟完成mysql8安装,你也可以的!!!

十分钟完成mysql8安装&#xff0c;你也可以的 前言安装步骤1.创建安装目录2.创建docker-compose.yml3.启动容器4.mysql开启远程连接5.连接mysql 总结 前言 本文基于Docker安装mysql:8.0.29&#xff0c;首先确保系统安装了docker和docker-compose。 没有使用过docker朋友可以去…

flink的安装与使用(ubuntu)

组件版本 虚拟机&#xff1a;ubuntu-20.04.6-live-server-amd64.iso flink&#xff1a;flink-1.18.0-bin-scala_2.12.tgz jdk&#xff1a;jdk-8u291-linux-x64.tar flink 下载 1、官网&#xff1a;https://flink.apache.org/downloads/ 2、清华镜像&#xff1a;https://mirr…

vue3+vite实现一个后台管理框架,毒蘑菇后台管理。

写后台管理的项目写了很多个了&#xff0c;虽说用的别人的模板&#xff0c;自己专注于自己的业务&#xff0c;保证自己的业务不出错就行了&#xff0c;但是自定义配置又不好去配置&#xff0c;大家用的模板都差不多&#xff0c;用模板自带的业务功能呢后台又得是模板自带的&…

Linu之VM及WindowsServer安装

# 1.操作系统 ## 1.1.什么是操作系统 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是一种系统软件&#xff0c;它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源&#xff0c;为应用程序提供接口和服务&#xff0c;并协调应用程序的…

算法通过村第十八关-回溯|青铜笔记|什么叫回溯(后篇)

文章目录 前言回溯热身问题输出二叉树的所有路径&#xff1a;路径总和问题&#xff1a; 总结 前言 提示&#xff1a;今夜思量千条路&#xff0c;明朝依旧卖豆腐。 --谚语 回溯是非常重要的算法思想之一&#xff0c;主要解决一些暴力枚举也搞不定的问题&#xff08;这里埋个坑&a…

Ubuntu 20.04设置虚拟内存 (交换内存swap)解决内存不足

数据库服务器程序在运行起来之后&#xff0c;系统内存不足。 在系统监控中发现&#xff0c;当数据库服务程序启动后&#xff0c;占用了大量内存空间&#xff0c;导致系统的剩余的内存往往只有几十MB。 在ubuntu系统中&#xff0c;swap空间就是虚拟内存&#xff0c;所以考虑在磁…

2017年第三届 美亚杯电子取证 个人赛题解

记录做题个人赛题目 取证大师直接取证 1 Gary的笔记本电脑已成功取证并制作成镜像 (Forensic Image)&#xff0c;下列哪个是其MD5哈希值。 A.0CFB3A0BB016165F1BDEB87EE9F710C9 B.5F1BDEB87EE9F710C90CFB3A0BB01616 C.A0BB016160CFB3A0BB0161661670CFB3 D.16160CFB3A0BB0161…