天天看点

记录echart下钻到省 市两级地图

记录echart下钻到省 市两级地图测试小demo

昨天开始做的时候在网上查了半天,我心里也很疑惑,地图的数据从哪里来的。然后就看到网上各种要下载china.js,province.js。我就到各个博客去看有没有免费的,结果没有。。。最后终于找到一个百度云盘,下载了China.js。下载完成之后满心欢喜,虽然没弄到省份的,起码中国的有了吧。我一打开js文件发现后面一堆乱码。。。。我想呀,没事。照样用。结果因为我们项目是用vue写的,china.js文件里面有this指向的问题,就跟vue起冲突了,地图怎么也加载不出来,还报错。T_T。。。

最搞笑的来了呀,我在引echarts的时候发现echarts的包里面有china.js(echarts/map/js/china)…里面还有各个省份的js(echarts/map/js/province/anhui),省份有点麻烦,如果所有的省份都要就需要引入三十多个,不知道有没有人有更好的办法。

贴图:

记录echart下钻到省 市两级地图

其实一开始拿到这个需求的时候我也是懵逼的,地图上的数据怎么搞?怎么知道我的数据定位在哪?我怎么从省下砖到市?一脸懵逼。其实写完小demo就发现逻辑很简单。就是当展示全国地图的时候,是一个全国是、各省分的option,点击省份要展示市的时候直接重新加载画布换一个option就可以了。echarts真的是一个强大的工具。上主要代码

initChart() {
        let myChart = echarts.init(document.getElementById('echartMap'))
        let data = [{
            name: '湖北',
            value1: this.randdomData(),
            value2: this.randdomData()
        }, {
            name: '北京',
            value1: this.randdomData(),
            value2: this.randdomData()
        }, {
            name: '上海',
            value1: this.randdomData(),
            value2: this.randdomData()
        }, {
            name: '浙江',
            value1: this.randdomData(),
            value2: this.randdomData()
        }, {
            name: '四川',
            value1: this.randdomData(),
            value2: this.randdomData()
        }]
        let resultdata0 = []
        let sum0 = 0
        let titledata = []
        for(let i = 0; i < data.length; i++){
            let d0 = {
                name: data[i].name,
                value: data[i].value1 + data[i].value2
            }
            titledata.push(data[i].name)
            resultdata0.push(d0)
            sum0 += data[i].value1 + data[i].value2
        }
        let option = {
            title: [{
                text: '测试地图', // 标题
                subtext: '仅仅只是测试',
                left: 'left'
            }, {
                text: '全部:' + sum0, // 标题文字展示总和
                right: '54%',
                top: 40, // 文字位置
                width: 100,
                textStyle: {
                    color: '#555',
                    fontSize: 16
                }
            }],
            tooltip: {
                trigger: 'item'
            },
            visualMap: {
                min: 0, // 指定组件允许的最小值
                max: 2500, // 指定组件允许的最大值
                left: 'left', // 距容器左侧边距
                top: '50', // 距容器上册边距
                text: ['高', '滴'], // 最大最小值得文字描述
                calculable: true, // 是否显示拖拽的手柄
                colorLightness: [0.2, 100],
                color: ['#c50500', '#e5cf0d', '#5ablef'],
                dimension: 0
            },
            toolbox: { // 悬浮框
                show: false,
                orient: 'vertical',
                left: 'right',
                top: 'center',
                feature: {
                    dataView: {
                        readOnly: false
                    },
                    restore: {},
                    saveAsImage: {}
                }
            },
            grid: {
                right: '10%',
                top: 100,
                bottom: 40,
                height: '40%',
                width: '100%'
            },
            // 重点是这里
            series: [{
                z: 1,
                name: '全部',
                type: 'map', // 图标类型
                map: 'china', // china就展示中国地图,省份名字就展示省份地图
                left: '10',
                right: '5%',
                top: 100,
                bottom: '3%',
                zoom: 1,
                label: {
                    normal: {
                        show: true
                    },
                    emphasis: {
                        show: true
                    }
                },
                // 有数据就高亮展示的地方
                data: resultdata0
            }]
        }
        // 地图进行点击
        let Prov = ''
        myChart.on('click', (params) => {
            console.log(params)
            if(this.isProvince) {
                this.isProvince = !this.isProvince
                let proviceChart = echarts.init(document.getElementById('echartMap'))
                Prov = params.name
                option = {
                tooltip: {
                    trigger: 'item',
                    formatter: '{b}'
                },
                series: [
                    {
                        name: '中国',
                        type: 'map',
                        mapType: Prov,
                        selecteMode: 'single',
                        layoutCenter: ['50%', '50%'],
                        layoutSize: 600, //省份地图大小
                        label: {
                            normal: {
                                show: true
                            },
                            emphasis: {
                                show: true
                            }
                        },
                        data: []
                    }
                ]
                }
                proviceChart.setOption(option)
                }
        })
        
        myChart.setOption(option)
    },
    randdomData() {
        return Math.round(Math.random()*1000)
    },
    NumDescSort(a, b) {
        return a.value - b.value
    }, 
           

以上只是一简单的demo,没有任何的样式。需要可以去echart官网读一读配置项手册,不要嫌麻烦,真的很有用。

最终效果(真的丑,但是可以调的)

记录echart下钻到省 市两级地图
记录echart下钻到省 市两级地图

本文启蒙文章,参考地址