zoukankan      html  css  js  c++  java
  • 基于echarts实现3D地图的定时高亮和点击事件

    技术选型

    文章所选技术栈:vue、echarts、echarts-gl

    安装Vue和echarts

    1、安装echarts和echarts-al

    npm i echarts --save npm i echarts-gl --save
    

    2、引用echarts和echarts-gl

    import echarts from 'echarts';
    import 'echarts-gl'
    
    Vue.prototype.$echarts = echarts
    

    3、页面引入

    require('../../node_modules/echarts/map/js/china')
    

    此时地图消息就在你的node_modules/echarts/map/china中

    初始化echarts-gl 3D地图

    1、新建一个option.js 这个文件是用来放配置项的,不建立也可以,但是页面代码多会不不美观

    2、配置页代码如下 (主要是地点标识和3D地图的颜色样式)

    //标识数据,用来标识地图上的点,给用户提供点击事件
    var geoCoordMap = {
        '黑龙江': [127.9688, 45.368],
        '内蒙古': [110.3467, 41.4899],
        "吉林": [125.8154, 44.2584],
        '北京市': [116.4551, 40.2539],
        "辽宁": [123.1238, 42.1216],
        "河北": [114.4995, 38.1006],
        "天津": [117.4219, 39.4189],
        "山西": [112.3352, 37.9413],
        "陕西": [109.1162, 34.2004],
        "甘肃": [103.5901, 36.3043],
        "宁夏": [106.3586, 38.1775],
        "青海": [101.4038, 36.8207],
        "新疆": [87.9236, 43.5883],
        "西藏": [91.11, 29.97],
        "四川": [103.9526, 30.7617],
        "重庆": [108.384366, 30.439702],
        "山东": [117.1582, 36.8701],
        "河南": [113.4668, 34.6234],
        "江苏": [118.8062, 31.9208],
        "安徽": [117.29, 32.0581],
        "湖北": [114.3896, 30.6628],
        "浙江": [119.5313, 29.8773],
        "福建": [119.4543, 25.9222],
        "江西": [116.0046, 28.6633],
        "湖南": [113.0823, 28.2568],
        "贵州": [106.6992, 26.7682],
        "云南": [102.9199, 25.4663],
        "广东": [113.12244, 23.009505],
        "广西": [108.479, 23.1152],
        "海南": [110.3893, 19.8516],
        '上海': [121.4648, 31.2891]
    
    };
    var chinaDatas = [
        [{
            name: '黑龙江',
            value: 100
        }],
        [{
            name: '内蒙古',
            value: 300
        }],
        [{
            name: '吉林',
            value: 300
        }],
        [{
            name: '辽宁',
            value: 300
        }],
        [{
            name: '河北',
            value: 300
        }],
        [{
            name: '天津',
            value: 300
        }],
        [{
            name: '山西',
            value: 300
        }],
        [{
            name: '陕西',
            value: 300
        }],
        [{
            name: '甘肃',
            value: 300
        }],
        [{
            name: '宁夏',
            value: 300
        }],
        [{
            name: '青海',
            value: 300
        }],
        [{
            name: '新疆',
            value: 300
        }],
        [{
            name: '西藏',
            value: 300
        }],
        [{
            name: '四川',
            value: 300
        }],
        [{
            name: '重庆',
            value: 300
        }],
        [{
            name: '山东',
            value: 300
        }],
        [{
            name: '河南',
            value: 300
        }],
        [{
            name: '江苏',
            value: 300
        }],
        [{
            name: '安徽',
            value: 300
        }],
        [{
            name: '湖北',
            value: 300
        }],
        [{
            name: '浙江',
            value: 300
        }],
        [{
            name: '福建',
            value: 300
        }],
        [{
            name: '江西',
            value: 300
        }],
        [{
            name: '湖南',
            value: 300
        }],
        [{
            name: '贵州',
            value: 300
        }],
        [{
            name: '广西',
            value: 300
        }],
        [{
            name: '海南',
            value: 300
        }],
        [{
            name: '上海',
            value: 1300
        }]
    ];
    
    //处理数据,是的数据格式符合echarts
    var convertData = function(data) {
        var res = [];
        for (var i = 0; i < data.length; i++) {
            var geoCoord = geoCoordMap[data[i][0].name];
            if (geoCoord) {
                res.push({
                    name: data[i][0].name,
                    value: geoCoord.concat(data[i][0].value)
                });
            }
        }
        return res;
    };
    
    //具体配置,并输出
    
    export default {
        backgroundColor: '#fff',
        geo3D: {
            data: convertData(chinaDatas),
            map: 'china',
            color: '#fff',
            roam: true, //是否开启鼠标缩放和平移漫游。默认不开启。
            itemStyle: {
                areaColor: 'rgba(255,255,255,1)',
                opacity: 1,
                borderWidth: 1,
                borderColor: '#000'
            }, //地图上每个省的颜色配置
            label: {
                show: false,
            },// 标特是否显示,显示配置
            
            emphasis: { //当鼠标放上去的状态
                label: {
                    show: true
                },
                itemStyle: {
                    color: '#000'
                }
            },
            
            tooltip: 'axis', //提示框设置
            
            formatter: val => {
                return val
            },
            /** 标签内容格式器,支持字符串模板和
            回调函数两种形式,字符串模板与回调函数
            返回的字符串均支持用 
     换行。**/
            
            // legendHoverLink: true,
            
            regions: [{
                name: '山东',
                itemStyle: {
                    color: '#000',
                    opacity: 1,
                },
                label: {
                    show: true
                },
            }],//默认高亮区域
        },
        series: [{
            name: 'light',
            type: 'scatter3D', //标识点
            symbol: 'pin',  //散点的形状。默认为圆形。
            coordinateSystem: 'geo3D',
            data: convertData(chinaDatas),
            symbolSize: function() {
                return 36
            },
            label: {
                show: false
            },
            itemStyle: {
                normal: {
                    color: '#f00'
                }
            },
            zlevel: 6,
            emphasis: { //当鼠标放上去  地区区域是否显示名称
                label: {
                    show: false
                },
                itemStyle: {
                    color: '#000'
                }
            },
        },
    
        ]
    };
    

    3、引入option

    import option from '你的option地址'
    

    4、创建 div

    <div id="myChart" style="height: 1000px;  1000px;"></div>
    

    5、初始化

    var myChart = this.$echarts.init(document.getElementById('myChart'));
    

    6、加载配置项

    myChart.setOption(option);
    

    7、效果图展示,颜色可以自己配置

    增加定时高亮事件和点击事件

    1、定时器代码(如何高亮关键就是改变geo的regions的name属性)

    let regions = setInterval(function() {
        option.geo3D.regions[0].name = option.geo3D.data[count].name
        myChart.setOption(option);
        count ++
        if (count === option.geo3D.data.length) {
            count = 0
        }
    }, 1000);
    

    2、点击事件

    myChart.on('click',function(params){
        clearInterval(regions)
        console.log(params)
        count = params.dataIndex
        option.geo3D.regions[0].name = params.name
        myChart.setOption(option);
    });
    

    3、双击重新开始定时器事件

    myChart.getZr().on('dblclick', function(params) {
        regions = setInterval(function() {
            option.geo3D.regions[0].name = option.geo3D.data[count].name
            console.log(count)
            myChart.setOption(option);
            count ++
            if (count === option.geo3D.data.length) {
                count = 0
            }
        }, 1000);
    });
    

    4、其实要是在2D上可以用

    myChart.dispatchAction({
        type: 'highlight',
        // 可选,系列 index,可以是一个数组指定多个系列
        seriesIndex?: number|Array,
        // 可选,系列名称,可以是一个数组指定多个系列
        seriesName?: string|Array,
        // 可选,数据的 index
        dataIndex?: number,
        // 可选,数据的 名称
        name?: string
    })
    

    这个事件,很遗憾的是3D并不支持这些api

    特别注意

    • 点击事件(click)

    它只能使用getZr()来搞点击,而且返回的信息只有鼠标在屏幕的x,y轴左边,你也可以使用echartsInstance.convertFromPixel来转换,但是其中转换公式和代码的时间也许比你写出来的时间更长

    当然你也可以使用ecahrts-gl的 1.0.0 beta-6 版本来做这个版本就可以直接绑定事件,但是Radeon高亮设置不了,最好直接引入他的源代码把import 'echarts-gl'替换成import '../node_modules/echarts-gl/dist/echarts-gl.js';

    作者:Xia12137817

    链接:https://juejin.cn/post/6844903865347735559

    来源:掘金

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    JS 、JQ 获取宽高总结 & JS中getBoundingClientRect的作用及兼容方案
    JS与JQ 获取页面元素值的方法和差异对比
    ES6
    移动端:active伪类无效的解决方法
    JavaScript中valueOf函数与toString方法
    Reverse Words in a String -- LeetCode
    Count Primes -- LeetCodes (primality test)
    Maximum Size Subarray Sum Equals k -- LeetCode
    Subsets II -- LeetCode
    Maximum Product of Word Lengths -- LeetCode
  • 原文地址:https://www.cnblogs.com/TencentLBS/p/14007209.html
Copyright © 2011-2022 走看看