echars地图实现下钻

简介: 最近公司有一个数据可视化大屏的功能要做被分到了我这里,这个功能显示各个省以及各个省的数据信息显示,排名功能、以及一级的下钻地图市级展示和信息展示等功能。
学习过程中将笔记整理跟大家分享,希望对大家也有所帮助,共同成长进步💪~\
如果大家喜欢,可以点赞或留言💕 ~~,谢谢大家⭐️⭐️⭐️~
最近公司有一个数据可视化大屏的功能要做被分到了我这里,这个功能显示各个省以及各个省的数据信息显示,排名功能、以及一级的下钻地图市级展示和信息展示等功能。

效果图是这样请看如图展示效果:

Video_2021-11-08_095600.gif

我这里采用的是echars地图实现,技术栈是vue

准备工作

在实现中国地图之前可以要先下载需要的json数据
在该网站上下载需要的地图json
http://datav.aliyun.com/tools/atlas/#&lat=30.37018632615852&lng=106.68898666525287&zoom=3.5
点击右下角的geojson下载

在搭建的html基础上还需要用到的js有echarts.min.js,jquery.js

image.png

html部分

这里是有两个地图,一个是带下钻一个不是带下钻的,这里我就直说带下钻的第一个地图了
我这里因为是把地图封装成了一个单独的组件然后去展示
image.png

地图组件部分

image.png

下面开始说地图部分

地图功能

引入地图json数据

var myChart = echarts.init(document.querySelector('.chinaMap'));
//定义一个全局变量,用来统计每个省有几个市
let num = 0;
//1.中国地图
var chinaMap = "./echartsMapjsondata/json/china.json";
//2.台湾省地图
var taiWanMap = "./echartsMapjsondata/json/province/taiwan.json";
//3.海南省地图
var haiNanMap = "./echartsMapjsondata/json/province/hainan.json";
//4.安徽省地图
var anHuiMap = "./echartsMapjsondata/json/province/anhui.json";
//5.江西省地图
var jiangXiMap = "./echartsMapjsondata/json/province/jiangxi.json";
//6.湖南省地图
var huNanMap = "./echartsMapjsondata/json/province/hunan.json";
//7.云南省地图
var yunNanMap = "/echartsMapjsondata/json/province/yunnan.json";
//8.贵州省地图
var guiZhouMap = "./echartsMapjsondata/json/province/guizhou.json";
//9.广东省地图
var guangDongMap = "./echartsMapjsondata/json/province/guangdong.json";
//10.福建省地图
var fuJianMap = "./echartsMapjsondata/json/province/fujian.json";
//11.浙江省地图
var zheJiangMap = "./echartsMapjsondata/json/province/zhejiang.json";
//12.江苏省地图
var jiangSuMap = "./echartsMapjsondata/json/province/jiangsu.json";
//13.四川省地图
var siChuanMap = "./echartsMapjsondata/json/province/sichuan.json";
//14.重庆市市地图
var chongQingMap = "./echartsMapjsondata/json/province/chongqing.json";
//15.湖北省地图
var huBeiMap = "./echartsMapjsondata/json/province/hubei.json";
//16.河南省地图
var heNanMap = "./echartsMapjsondata/json/province/henan.json";
//17.山东省地图
var shanDongMap = "./echartsMapjsondata/json/province/shandong.json";
//18.吉林省地图
var jiLinMap = "./echartsMapjsondata/json/province/jilin.json";
//19.辽宁省地图
var liaoNingMap = "./echartsMapjsondata/json/province/liaoning.json";
//20.天津市市地图
var tianJinMap = "./echartsMapjsondata/json/province/tianjin.json";
//21.北京市市地图
var beiJingMap = "./echartsMapjsondata/json/province/beijing.json";
//22.河北省地图
var heBeiMap = "./echartsMapjsondata/json/province/hebei.json";
//23.山西省地图
var shanXiMap = "./echartsMapjsondata/json/province/shanxi.json";
//24.陕西省地图
var shanXi2Map = "./echartsMapjsondata/json/province/shanxi1.json";
//25.宁夏回族自治区省地图
var ningXiaMap = "./echartsMapjsondata/json/province/ningxia.json";
//26.青海省地图
var qingHaiMap = "./echartsMapjsondata/json/province/qinghai.json";
//27.西藏自治区地图
var xiZangMap = "./echartsMapjsondata/json/province/xizang.json";
//28.黑龙江省地图
var heiLongJiangMap = "./echartsMapjsondata/json/province/heilongjiang.json";
//29.内蒙古自治区地图
var neimengGuMap = "./echartsMapjsondata/json/province/neimenggu.json";
//30.甘肃省地图
var ganSuMap = "./echartsMapjsondata/json/province/gansu.json";
//31.新疆维吾尔自治区省地图
var xinJiangMap = "./echartsMapjsondata/json/province/xinjiang.json";
//32.广西壮族自治区地图
var guangxiMap = "./echartsMapjsondata/json/province/guangxi.json";
//设置初始地图
var mapname = chinaMap;

配置好各省的json数据

这里记住一点,想要实现点击效果配置的json中的name必须和中国地图上的名字一致

//设置省份的json 这里注意名字要和中国地图上的名字一致
var mapJson = [
    {
        name: "台湾",
        json: taiWanMap,
    },
    {
        name: "海南",
        json: haiNanMap,
    },
    {
        name: "安徽",
        json: anHuiMap,
    },
    {
        name: "江西",
        json: jiangXiMap,
    },
    {
        name: "湖南",
        json: huNanMap,
    },
    {
        name: "云南",
        json: yunNanMap,
    },
    {
        name: "贵州",
        json: guiZhouMap,
    },
    {
        name: "广东",
        json: guangDongMap,
    },
    {
        name: "福建",
        json: fuJianMap,
    },
    {
        name: "浙江",
        json: zheJiangMap,
    },
    {
        name: "江苏",
        json: jiangSuMap,
    },
    {
        name: "四川",
        json: siChuanMap,
    },
    {
        name: "重庆",
        json: chongQingMap,
    },
    {
        name: "湖北",
        json: huBeiMap,
    },
    {
        name: "河南",
        json: heNanMap,
    },
    {
        name: "山东",
        json: shanDongMap,
    },
    {
        name: "吉林",
        json: jiLinMap,
    },
    {
        name: "辽宁",
        json: liaoNingMap,
    },
    {
        name: "天津",
        json: tianJinMap,
    },
    {
        name: "北京",
        json: beiJingMap,
    },
    {
        name: "河北",
        json: heBeiMap,
    },
    {
        name: "山西",
        json: shanXiMap,
    },
    {
        name: "陕西",
        json: shanXi2Map,
    },
    {
        name: "宁夏",
        json: ningXiaMap,
    },
    {
        name: "青海",
        json: qingHaiMap,
    },
    {
        name: "西藏",
        json: xiZangMap,
    },
    {
        name: "黑龙江",
        json: heiLongJiangMap,
    },
    {
        // name: "内蒙古自治区",
        name: "内蒙古",
        json: neimengGuMap,
    },
    {
        name: "甘肃",
        json: ganSuMap,
    },
    {
        name: "新疆",
        json: xinJiangMap,
    },
    {
        name: "广西",
        json: guangxiMap,
    },
];

设置鼠标移入移出事件

//鼠标移入
myChart.on('mousemove', function (e) {
    //取消高亮
    myChart.dispatchAction({
        type: 'downplay',
        seriesIndex: 0,
    });
    //高亮鼠标移入的位置
    myChart.dispatchAction({
        type: 'highlight',
        seriesIndex: 0,
        dataIndex: e.dataIndex,
    });
});
//鼠标移出
myChart.on('mouseout', function (e) {
    //取消高亮
    myChart.dispatchAction({
        type: 'downplay',
        seriesIndex: 0,
        dataIndex: e.dataIndex,
    });
});

设置鼠标点击事件

//点击事件
myChart.on('click', function (e) {
    this.tableshow="不显示";
    that.$emit("tableshowfun", this.tableshow);
    that.norm=e.data.norm;
    //过滤 这里是es6语法 filter函数可以看成是一个过滤函数,返回符合条件的元素的数组
    var chooseName = mapJson.filter((item) => {
        //我们根据名字来判断是否选择一种
        return item.name == e.name;
    });
    //这里的chooseName是一个数组,我们需要获取到json 有兴趣可以打印
    //{name: "新疆维吾尔自治区", json: "json/新疆维吾尔自治区.json"}
    mapname = chooseName[0].json;
    //添加一个返回按键
    $('<div class="back"><i class="el-icon-d-arrow-left"></i>返回</div>').appendTo(
        $('#chart-panel')
    );
    //给返回按键设置样式
    $('.back').css({
        position: 'absolute',//绝对地位
        left: '20px',//设置位置
        top: '20px',//设置位置
        color: 'blue',//设置字体颜色
        'font-size': '20px',//设置字体大小
        cursor: 'pointer',//变小手
    });
    //设置返回按钮的点击事件
    $('.back').click(function () {
        this.tableshow="显示";
        that.$emit("tableshowfun", this.tableshow);
        //地图重新设置为中国地图
        mapname = chinaMap;
        // console.log(mapname)
        //隐藏按钮
        $('.back').css({
            opacity: 0,
        });
        //绘制地图
        mapInit();
    });
    //绘制地图
    mapInit();
});

初始化

//设置初始化时间
setTimeout(function () {
    mapInit();
}, 500);

创建地图(设置小气泡位置)

//创建地图
var mapInit = () => {
    //调用中国地图(同步)
    $.getJSON(mapname, function (geoJson) {
        //获取到长度(每个省里有几个市)
        num = geoJson.features.length;
        //调用我们通过json对象注册的地图
        echarts.registerMap('China', geoJson);
        //文件加载的动画
        myChart.hideLoading();
        //判断是否为祖国地图
        if (mapname === chinaMap) {
            //设置小蓝点
            var geoCoordMap = {
                '台湾': [122, 23],
                '黑龙江': [126.661669, 45.742347],
                '内蒙古': [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],
                "西藏": [88.388277, 31.56375],
                "四川": [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 data = [
            //     { name: "台湾", value: 1,hushu:188,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "北京", value: 2,hushu:488,zczb:"3,330,156",zzc:"9,01,302"  },
            //     { name: "天津", value: 3,hushu:288,zczb:"3,330,156",zzc:"9,01,302"  },
            //     { name: "河北", value: 4,hushu:388,zczb:"3,330,156",zzc:"9,01,302"  },
            //     { name: "山西", value: 5,hushu:188,zczb:"3,330,156",zzc:"9,01,302"  },
            //     { name: "内蒙古", value: 6 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "辽宁", value: 7 ,hushu:488,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "吉林", value: 8 ,hushu:588,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "黑龙江", value: 9 ,hushu:688,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "上海", value: 10 ,hushu:788,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "江苏", value: 11 ,hushu:388,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "浙江", value: 12 ,hushu:58,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "安徽", value: 13 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "福建", value: 14 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "江西", value: 15 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "山东", value: 16 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "河南", value: 17 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "湖北", value: 18 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "湖南", value: 19 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "重庆", value: 20 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "四川", value: 21 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "贵州", value: 22 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "云南", value: 23 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "西藏", value: 24 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "陕西", value: 25 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "甘肃", value: 26 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "青海", value: 27 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "宁夏", value: 28 ,hushu:118,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "新疆", value: 29 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "广东", value: 30 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "广西", value: 31 ,hushu:88,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "海南", value: 32 ,hushu:28,zczb:"3,330,156",zzc:"9,01,302",},
            //     { name: "白城", value: 132 ,hushu:128,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "白城市", value: 132 ,hushu:128,zczb:"3,330,156",zzc:"9,01,302" },
            // ];
            var data=[];
            data=cnmapShendata;//这里我用的自己接口的数据,所以上边的数据就注释掉了,大家可自行解开尝试看效果
            var dotData = [1, 2, 3,4,5];
            //给每个地区赋值
            var convertData = function (data) {
                //定义一个数组
                var res = [];
                //循环遍历每个区域值
                for (var i = 0; i < data.length; i++) {
                    //获取坐标
                    var geoCoord = geoCoordMap[data[i].norm_name];
                    //判断是否有坐标
                    if (geoCoord) {
                        //往数组里设置值
                        res.push({
                            name: data[i].norm_name,
                            value: geoCoord.concat(i + 1),
                            hushu:data[i].QYHS,//户数
                            zczb:data[i].ZCZB,//注册资本
                            zzc:data[i].norm,//总资产
                            norm:data[i].norm,
                        });
                    }
                }
                return res;
            };
        } 
        else {
            //下钻的数据处理在这里要注意哦~
            //这里不为中国地图所以先不设置(后面需要对市区进行标记在设置)
            //设置小黄点
            var geoCoordMap = {};
            //设置每个区域的值
            // var data = [
            //     { name: "白城市", value: 132 ,hushu:128,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "松原市", value: 22 ,hushu:22,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "呼伦贝尔市", value: 132 ,hushu:128,zczb:"3,330,156",zzc:"9,01,302" },
            //     { name: "包头市", value: 22 ,hushu:22,zczb:"3,330,156",zzc:"9,01,302" },
            // ];
            var data=[];
            data=that.zzcfbdata2(that.norm);
            //给每个地区赋值
            convertData = function (data) {
                var res = [];
                for (var i = 0; i < data.length; i++) {
                    res.push({
                        name: data[i].norm_name,
                        value: data[i].norm,
                        hushu:data[i].QYHS,//户数
                        zczb:data[i].ZCZB,//注册资本
                        zzc:data[i].norm,//总资产
                        norm:data[i].norm,
                    });
                }
                return res;
            };
        }
        // 前五名的地区
        function areaSort() {
            var threeArea = convertData(data);
            threeArea.sort(function (a, b) {
                return b.zczb - a.zczb
            })
            return threeArea.slice(0, 5);
        }
        var aa = areaSort();
    });
};

创建地图

option = {
    //设置背景颜色
    geo: {
        map: 'China',//地图为刚刚设置的China
        // aspectScale: 0.75, //长宽比
        // zoom: 1.1,//当前视角的缩放比例
        // roam: false,//是否开启鼠标缩放和平移漫游。默认不开启。如果只想要开启缩放或者平移,可以设置成 'scale' 或者 'move'。设置成 true 为都开启
        // itemStyle: {//地图区域的多边形 图形样式
        //     normal: {
        //         areaColor: '#013C62',//地区颜色
        //         shadowColor: '#182f68',//阴影颜色
        //         shadowOffsetX: 0,//阴影偏移量
        //         shadowOffsetY: 25,//阴影偏移量
        //     },
        //     emphasis: {
        //         areaColor: '#2AB8FF',//地区颜色
        //         label: {
        //             show: false,//是否在高亮状态下显示标签
        //         },
        //     },
        // },
    },
    tooltip: {
        trigger: 'item',
        show: true,
        // position:
        // padding: [5,0,0,200], 
        // triggerOn: "mousemove",//鼠标点击时触发提示框组件
        backgroundColor: "transparent",
        // extraCssText: 'width:237px;height:95px;',
        formatter: function (params) {
            if(params.data){
                var htmlStr = '';
                htmlStr += '<div class="bgboder" style="height:80px;padding: 10px 30px;background:rgba(22,80,158,0.8);border:1px solid rgba(7,166,255,0.7)">';
                htmlStr += '<div id="city">' + params.name + '</div><div id="trans">企业总户数:' + params.data.hushu + '</div><div id="trans">注册资本:' + params.data.zczb + '</div><div id="trans">总资产:' + params.data.zzc + '</div>';
                htmlStr += '</div>';
                return htmlStr;
            }else{
            }
        },
        textStyle: {
            width: 300,
            height: 300,
        }
    },
    series: [//数据系列
        {
            type: 'map',//地图类型
            //地图上文字
            label: {
                normal: {
                    show: true,//是否显示标签
                    textStyle: {
                        color: '#fff',
                    },
                },
                emphasis: {
                    textStyle: {
                        color: '#fff',
                    },
                },
            },
            //地图区域的多边形 图形样式
            itemStyle: {
                normal: {
                    borderColor: '#2ab8ff',
                    borderWidth: 1.5,
                    areaColor: '#12235c',
                },
                emphasis: {
                    areaColor: '#2AB8FF',
                    borderWidth: 0,
                },
            },
            // zoom: 1.2,//当前视角的缩放比例
            //是否开启鼠标缩放和平移漫游。默认不开启。如果只想要开启缩放或者平移,可以设置成 'scale' 或者 'move'。设置成 true 为都开启
            roam: false,
            map: 'China', //使用中国地图
            data: convertData(data)
        },
        {
            //前五名
            //设置为分散点
            type: 'scatter',
            //series坐标系类型
            coordinateSystem: 'geo',
            //设置图形 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'
            symbol: 'pin',
            // //标记的大小,可以设置成诸如 10 这样单一的数字,也可以用数组分开表示宽和高,例如 [20, 10] 表示标记宽为20,高为10
            symbolSize: [40, 40],
            //气泡字体设置
            label: {
                normal: {
                    show: true,//是否显示
                    textStyle: {
                        color: '#fff',//字体颜色
                        fontSize: 8,//字体大小
                    },
                    //返回气泡数据
                    formatter(value) {
                        var res='';
                        res+=value.dataIndex+1;
                        return res;
                    }
                }
            },
            itemStyle: {
                normal: {
                    color: '#1E90FF', //标志颜色
                }
            },
            //给区域赋值
            // data: convertData(data),
            data: aa,
            showEffectOn: 'render',//配置何时显示特效。可选:'render' 绘制完成后显示特效。'emphasis' 高亮(hover)的时候显示特效。
            rippleEffect: {//涟漪特效相关配置。
                brushType: 'stroke'//波纹的绘制方式,可选 'stroke' 和 'fill'
            },
            hoverAnimation: true,//是否开启鼠标 hover 的提示动画效果。
            zlevel: 1//所属图形的 zlevel 值
        },
    ],
};
myChart.setOption(option);
window.addEventListener("resize", function () {
    myChart.resize();
});

我这里根据自己的业务都用了真实的数据以及交互功能等,大家使用的时候需要自己改成假数据即可、以及我其他地方的传值等需要自行删掉,代码里有注释解开替换一下就可以了然后根据自己的业务再做调整

具体效果可以直接复制代码到本地看哦~ 欢迎阅读点赞给个支持⭐️⭐️⭐️
目录
相关文章
|
定位技术 API 网络架构
地图图层接入:从mapbox转向cesium
由于地图坐标系的不统一,地图图商提供的图层服务也各有特色,在图层对接的开发过程中常会遇到许多坑,从二维图层到三维图层,地图引擎mapbox再到cesium,本文将分享笔者在近期地图图层接入过程中总结的一些经验。
3630 10
|
数据可视化 搜索推荐 JavaScript
数据可视化大屏百度地图区域掩膜MapMask实现地图指定区域非省市县行政区显示的实战案例解析(JavaScript API GL、个性化地图定制、指定区域经纬度拾取转化)
数据可视化大屏百度地图区域掩膜MapMask实现地图指定区域非省市县行政区显示的实战案例解析(JavaScript API GL、个性化地图定制、指定区域经纬度拾取转化)
936 0
|
1月前
|
JSON JavaScript 定位技术
Vue结合ECharts绘制省市地图:数据驱动区域颜色展示,支持省市下钻与经纬度打点功能
Vue结合ECharts绘制省市地图:数据驱动区域颜色展示,支持省市下钻与经纬度打点功能
81 0
|
1月前
|
JSON JavaScript 前端开发
vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果
vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果
385 0
|
4月前
echarts 热力图(中国地图版)
echarts 热力图(中国地图版)
148 0
|
6月前
|
定位技术
echarts 地图点位
在使用ECharts的点击事件绑定中,观察到每次点击会递增一次后台请求:首次点击请求1次,第二次点击请求2次,第三次点击请求3次,以此类推。为解决这个问题,尝试在事件绑定前使用`myChart.off(&#39;click&#39;)`移除原有监听器,然后添加新的点击事件处理函数。
58 0
|
定位技术
百度地图使用 ->展示地图一
百度地图使用 ->展示地图一
94 0
|
定位技术
百度地图开发(8):地图覆盖物实现纵横交错的交通网络
百度地图开发(8):地图覆盖物实现纵横交错的交通网络
48 0
百度地图开发(8):地图覆盖物实现纵横交错的交通网络
|
JSON JavaScript 数据可视化
漏刻有时Echarts地图三级下钻和散点图使用说明
漏刻有时Echarts地图三级下钻和散点图使用说明
188 0
|
Web App开发 数据可视化 JavaScript
漏刻有时数据可视化Echarts组件开发(23):世界地图动态时间轴的散点气泡图
漏刻有时数据可视化Echarts组件开发(23):世界地图动态时间轴的散点气泡图
199 0