vue2 使用echarts实现地图点击进入下一层级+点击空白处回退功能

 更新时间:2024年05月16日 09:11:30   作者:sunshine233  
这篇文章主要介绍了vue2 使用echarts实现地图点击进入下一层级+点击空白处回退,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下

先验知识:

vue2中echarts的安装和显示中国地图:https://www.jb51.net/javascript/321196ahi.htm

鼠标事件: https://echarts.apache.org/zh/api.html#echartsInstance.on

echarts.getMap():https://echarts.apache.org/zh/api.html#echarts.getMap

监听“空白处”的事件:https://echarts.apache.org/handbook/zh/concepts/event/#%E7%9B%91%E5%90%AC%E2%80%9C%E7%A9%BA%E7%99%BD%E5%A4%84%E2%80%9D%E7%9A%84%E4%BA%8B%E4%BB%B6

npm 安装 echarts4.9(全局引入不支持5.0)

运行效果(只做了河南的点击和后退):

实现思路:

1. 引入地图并显示

// 1. 基于准备好的dom,初始化echarts实例
this.myChart = this.$echarts.init(this.$refs.myChart);
// 2. 引入要显示的地图 json 文件(json文件可以是echart自带的,也可以是自己下载的)
this.mapJson = require("echarts/map/json/china.json");
// 3. 注册可用的地图 registerMap("自定义的名字,要和option中map:''对应",注册的地图指向的json文件)
this.$echarts.registerMap("mapJson", this.mapJson);
// 4. 指定图表的配置项和数据
this.option = {
    geo: {
        type: "map",
        map: "mapJson",//这里的数据会变,"这里是引入的存储json文件的变量名"
        label: {
            normal: {
                color: "#000000",
                show: true, //显示省份名称
            },
        },
    },
    series: [
        {
            name: "在地图中显示散点图",
            type: "scatter",
            coordinateSystem: "geo", //设置坐标系为 geo
            data: [
                //这里放标注点的坐标[{name: "北京",value: [116.46, 39.92]}]
            ],
        },
    ],
};
// 5. 设置图表实例的配置项以及数据,万能接口,所有参数和数据的修改都可以通过 setOption 完成,ECharts 会合并新的参数和数据,然后刷新图表。
this.myChart.setOption(this.option);

2. 地图显示的是“中国”还是“省”还是“市区”主要就是靠引入的json文件区分,
也就是  this.mapJson = require("echarts/map/json/china.json");  的mapJson,
然后   this.$echarts.registerMap("mapJson", this.mapJson); 注册一下修改后的文件,
 this.myChart.setOption(this.option);  地图即可重新显示新的地区。

3. 怎么确定  this.mapJson  引入的哪个文件呢? 添加地图的监听事件后,可以获取一个code值,用这个code值判断应该引入哪个省市的文件。点击空白处回退同理,只需要确定应该回退层级的code值,就可以由此判断应该回退到哪个层级页面了。

全部代码如下:

<template>
    <div id="app">
        <div id="myChart" ref="myChart"></div>
        <el-button type="success" @click="cancelEchartsEvent">点击取消on事件</el-button>
    </div>
</template>
<script>
export default {
    data() {
        return {
            myChart: null,
            mapJson: null,
            option: {},
            curArea: {
                code: -1,
                name: ""
            },
        };
    },
    mounted() {
        this.initEchartParams();
        this.addMouseClick();//开启 echarts 事件监听
    },
    beforeDestroy() {
        this.cancelEchartsEvent();
    },
    methods: {
        cancelEchartsEvent() {
            console.log("页面卸载前,取消 echarts 的事件监听");
            this.myChart.off("click");
        },
        initEchartParams() {
            // 1. 基于准备好的dom,初始化echarts实例
            this.myChart = this.$echarts.init(this.$refs.myChart);
            // 2. 引入要显示的地图 json 文件(json文件可以是echart自带的,也可以是自己下载的)
            this.mapJson = require("echarts/map/json/china.json");
            // 3. 注册可用的地图 registerMap("自定义的名字,要和option中map:''对应",注册的地图指向的json文件)
            this.$echarts.registerMap("mapJson", this.mapJson);
            // 4. 指定图表的配置项和数据
            this.option = {
                geo: {
                    type: "map",
                    map: "mapJson",//这里的数据会变,"这里是引入的存储json文件的变量名"
                    label: {
                        normal: {
                            color: "#000000",
                            show: true, //显示省份名称
                        },
                    },
                },
                series: [
                    {
                        name: "在地图中显示散点图",
                        type: "scatter",
                        coordinateSystem: "geo", //设置坐标系为 geo
                        data: [
                            //这里放标注点的坐标[{name: "北京",value: [116.46, 39.92]}]
                            { name: "郑州", value: [113.665412, 34.757975] },
                            { name: "北京", value: [116.41995, 40.18994] },
                            { name: "天津", value: [117.205126, 39.034933] },
                            { name: "昆明", value: [102.81844, 24.906231] },
                            { name: "广州", value: [113.26453, 23.155008] },
                        ],
                    },
                ],
            };
            // 5. 设置图表实例的配置项以及数据,万能接口,所有参数和数据的修改都可以通过 setOption 完成,ECharts 会合并新的参数和数据,然后刷新图表。
            this.myChart.setOption(this.option);
        },
        addMouseClick() {
            this.addClickInMap();
            this.addClickInBlank();
        },
        // 点击了地图非空白处
        addClickInMap() {
            // echarts.getMap 获取已注册的地图
            const maps = this.$echarts.getMap("mapJson").geoJson.features;
            console.log({ maps });
            this.myChart.on("click", (res) => {
                let clickArea = maps.find(map => map.properties.name == res.name);
                // console.log({ clickArea });
                if (!clickArea) {
                    // 如果点的不是地图,而是地图上的散点,什么也不做
                    return;
                }
                this.curArea.code = clickArea.id;
                this.curArea.name = res.name;
                console.log("当前点击的是: " + this.curArea.name + " this.curArea.code:" + this.curArea.code);
                // 修改 mapJson 的数值
                this.configGeoMap(this.curArea.code);
            });
        },
        // 点击了地图空白处
        addClickInBlank() {
            this.myChart.getZr().on('click', (event) => {
                // !event.target 不存在 证明点击的地方是地图空白处
                if (!event.target) {
                    let preCode = -1;
                    const curAreaCode = this.curArea.code;
                    console.log("回退前地区code ", curAreaCode);
                    if (curAreaCode == "100000") {//当前在中国,不回退
                        console.log("当前地图已经是 china, 不可回退!");
                        return;
                    } else if (curAreaCode % 10000 == 0) {//说明当前在省,回退到 china
                        preCode = 100000;
                    } else if (curAreaCode % 100 == 0) {////说明当前在 郑州市,回退到 河南省
                        preCode = curAreaCode - curAreaCode % 10000;
                    } else {
                        preCode = curAreaCode - curAreaCode % 100; //回退到city
                    }
                    // 回退后,当前显示地图的code就是preCode
                    this.curArea.code = preCode;
                    console.log('点击了空白处,回退后地区 code:' + preCode);
                    this.configGeoMap(preCode);
                }
            });
        },
        // 修改 mapJson 的数值
        configGeoMap(code) {
            // 这里要根据code值找到对应的json文件,如果是从服务器获取,也是找到对应的json文件即可
            // 这里我用的是 用npm安装echarts@4.9.0 时自动下载的文件 
            if (code == "100000") {
                this.mapJson = require("echarts/map/json/china.json");
            } else if (code == "410000") {
                this.mapJson = require("echarts/map/json/province/henan.json");
            } else {
                console.log('除了河南外,其它地区暂时不能跳转');
            }
            this.$echarts.registerMap("mapJson", this.mapJson);
            this.myChart.setOption(this.option);
        }
    }
}
</script>
<style scoped>
#myChart {
    width: 100%;
    height: 500px;
    background-color: #f1f3f4;
}
button {
    margin: 20px;
}
</style>

到此这篇关于vue2 使用echarts实现地图点击进入下一层级+点击空白处回退功能的文章就介绍到这了,更多相关vue2  echarts地图点击进入下一层级内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue过滤器使用方法详解

    Vue过滤器使用方法详解

    过滤器的功能是对要显示的数据进行格式化后再显示,其并没有改变原本的数据,只是产生新的对应的数据,下面这篇文章主要给大家介绍了关于Vue中过滤器定义以及使用方法的相关资料,需要的朋友可以参考下
    2022-12-12
  • 详解Vue微信授权登录前后端分离较为优雅的解决方案

    详解Vue微信授权登录前后端分离较为优雅的解决方案

    这篇文章主要介绍了详解Vue微信授权登录前后端分离较为优雅的解决方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Vue实现点击导航栏当前标签后变色功能

    Vue实现点击导航栏当前标签后变色功能

    这篇文章主要为大家详细介绍了Vue实现点击导航栏当前标签后变色功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • vue实现购物车加减

    vue实现购物车加减

    这篇文章主要为大家详细介绍了vue实现购物车加减,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Vue Echarts实现可视化世界地图代码实例

    Vue Echarts实现可视化世界地图代码实例

    这篇文章主要介绍了Vue Echarts实现可视化世界地图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )

    基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )

    这篇文章主要介绍了基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 ),非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • 关于vue2使用element UI中Descriptions组件的遍历问题详解

    关于vue2使用element UI中Descriptions组件的遍历问题详解

    最近element-ui遇到了很多坑,下面这篇文章主要给大家介绍了关于vue2使用element UI中Descriptions组件的遍历问题,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • vue.js实现插入数值与表达式的方法分析

    vue.js实现插入数值与表达式的方法分析

    这篇文章主要介绍了vue.js实现插入数值与表达式的方法,结合实例形式分析了vue.js常见的3种插入数值实现方式,并总结了vue.js插值与表达式相关使用技巧,需要的朋友可以参考下
    2018-07-07
  • vue中this.$message的实现过程详解

    vue中this.$message的实现过程详解

    Message在开发中的使用频率很高,也算是Element-UI组件库中比较简单的,对于感兴趣的朋友可以一起探讨一下Message组件的实现,本文详细介绍了vue中this.$message的实现过程,感兴趣的同学可以参考一下
    2023-04-04
  • Vue 打包优化之externals抽离公共的第三方库详解

    Vue 打包优化之externals抽离公共的第三方库详解

    这篇文章主要为大家介绍了Vue 打包优化之externals抽离公共的第三方库详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2023-06-06

最新评论