中国省市县联动地图,可更换成任意省,地图点击省市县下钻。可显示数据并根据数据大小标注不同颜色

两类地图预览效果如下:

在这里插入图片描述
在这里插入图片描述

为了保证读者们都能理解透彻

我们先做中国地图省市县三级联动,再根据代码改成某个省的市县联动!

可用于大屏展示地图
地图可以是平面的也可以是3d的,
3d地图请参考我的另一篇文章:实用且牛逼的3D旋转地图上显示柱图,可以更换成任意省市

1. 需要素材
在这里插入图片描述
asset存放地图各省市县的json
css是简单的布局排版
js:index3是湖南省的代码;index-china为全国代码;其余js为插件不用管
我们需要关注的就是这两个js页面;
2.HTML代码与css代码(复制可用)

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <title>Echarts 地图钻取</title>
  <link rel="stylesheet" href="./css/index.css" type="text/css">
  <script type="text/javascript" src="./js/echarts.min.js"></script>
  <script src="./js/jquery-3.0.0.min.js"></script>
  <script type="text/javascript" src="./js/index3.js"></script>
  <script type="text/javascript" src="./js/china-main-city-map.js"></script>
  <script type="text/javascript" src="./js/rem.js"></script>
</head>
<body>

<div class='title' >湖南</div>
<div class="box">
  <button class= "backBtn" onclick="backSuperior()">返回上级</button>
  <div id="mapChart" class="chart"></div>
</div>
</body>
</html>

中国的js代码(复制可用)

/* jshint esversion: 6 */
$(function() {//dom加载后执行
    mapChart('mapChart')
})



/**
 * 根据Json里的数据构造Echarts地图所需要的数据
 * @param {} mapJson
 */
function initMapData(mapJson) {
    var mapData = [];
    for (var i = 0; i < mapJson.features.length; i++) {
        mapData.push({
            name: mapJson.features[i].properties.name,
            value:Math.floor(Math.random()*2800)+200//这里是模拟的数据
            //id:mapJson.features[i].id
        })
    }
    return mapData;
}

/**
 * 返回上一级地图
 */
function back(){
    if(mapStack.length!=0){//如果有上级目录则执行
        var map = mapStack.pop();
        $.get('./asset/json/map/'+map.mapId+'.json', function (mapJson,status) {

            registerAndsetOption(myChart,map.mapId,map.mapName,mapJson,false)

            //返回上一级后,父级的ID、Name随之改变
            parentId = map.mapId;
            parentName = map.mapName;

        })

    }

}
/**
 * Echarts地图
 */

//中国地图(第一级地图)的ID、Name、Json数据
var chinaId = 100000;
var chinaName = 'china'
var chinaJson = null;

//记录父级ID、Name
var mapStack = [];
var parentId = null;
var parentName = null;

//Echarts地图全局变量,主要是在返回上级地图的方法中会用到
var myChart = null;
function mapChart(divid){

    $.get('./asset/json/map/'+chinaId+'.json', function (mapJson) {
        chinaJson = mapJson;
        myChart = echarts.init(document.getElementById(divid));
        registerAndsetOption(myChart,chinaId,chinaName,mapJson,false)
        parentId = chinaId;
        parentName = 'china'
        myChart.on('click', function(param,t) {

            var cityId = cityMap[param.name]
            if(cityId){//代表有下级地图
                $.get('./asset/json/map/'+cityId+'.json', function (mapJson,status) {
                    registerAndsetOption(myChart,cityId,param.name,mapJson,true)
                })
            }else{
                //没有下级地图,回到一级中国地图,并将mapStack清空
                registerAndsetOption(myChart,chinaId,chinaName,chinaJson,false)
                mapStack=[]
                parentId = chinaId;
                parentName = chinaName;


            }
            // $.get('./asset/json/map/'+param.data.id+'.json', function (mapJson,status) {

            //     registerAndsetOption(myChart,param.data.id,param.name,mapJson,true)

            // }).fail(function () {
            //     registerAndsetOption(myChart,chinaId,'china',chinaJson,false)
            // });

        });


    })
}

/**
 *
 * @param {*} myChart
 * @param {*} id        省市县Id
 * @param {*} name      省市县名称
 * @param {*} mapJson   地图Json数据
 * @param {*} flag      是否往mapStack里添加parentId,parentName
 */
function registerAndsetOption(myChart,id,name,mapJson,flag)
{

    echarts.registerMap(name, mapJson);
    
    // myChart.setOption({
        //     series: [{
        //         type: 'map',
        //         map: name,
        //         itemStyle: {
        //             normal: {
        //                 areaColor: 'rgba(23, 27, 57,0)',
        //                 borderColor: '#1dc199',
        //                 borderWidth: 1,
        //             },
        //         },
        //         data:initMapData(mapJson)
        //     }]
        // });
    //上一段是地图的颜色,因为想做出根据数据大小展示颜色不同所以用了以下一段代码
    myChart.setOption({
        //左下角lengend
        tooltip : {
            // show: true,
            trigger: 'item',
            formatter: function(params) {//鼠标移动时展示当前省市县的数据
                if (params.data) return params.name + ':' + params.data['value']
            },
        },

        // dataRange: {
        //     show:false,
        //     x: 'left',
        //     y: 'bottom',
        //     splitList: [
        //         {start: 5, end: 5, color: 'orange'},//当值为5时,区域背景
        //         {start: 10, end: 10, color: '#F2D010'},//当值为10时,区域背景
        //         {start: 15, end: 15, color: '#ccc'},//当值为15时,区域背景
        //     ]
        // },
        visualMap: {//颜色的展示,这里是不显示,可以打开看看
            show:false,
            min: 200,//阈值
            max: 3000,
            left:'1%',
            bottom:'1%',
            itemWidth: 25,
            itemHeight: 100,
            text:['高','低'],
            realtime: false,
            calculable: true,
            textStyle: {
                color:'#fff',
                fontSize:'20'
            },
            inRange: {
                color: ['#18b0ff','#ffde00', '#ff6f18']
            }
        },
        series: [{//地图的一些属性设置
            hoverable: true,    //鼠标经过时,是否高亮显示
            type: 'map',
            map: name,
            label: {
                normal: {
                    show: true,
                    color:"#fff",//城市名称颜色
                    fontSize:10//城市名称字体大小
                },
                emphasis: {
                    show: true,
                    color:"#fff",
                    fontSize:10
                }
            },
            itemStyle: {
                normal: {
                    areaColor: 'rgba(7,157,233,0.4)',//背景颜色值
                    borderColor: '#ddd',

                },
                emphasis: {
                    areaColor: '#3093d8'//指向颜色值
                }
            },

            //

            data: initMapData(mapJson)
        }]
    });
    if(flag){//往mapStack里添加parentId,parentName,返回上一级使用
        mapStack.push({
            mapId: parentId,
            mapName: parentName
        });
        parentId = id;
        parentName = name;
    }
}

湖南的js代码(复制可用)

注释的是我自己写的公司需要业务代码 ,根据实际情况改,我这里做的是1.每次下钻就请求数据填充下级地图 2.大屏页面其他模块图表数据联动;可以不用理会

/* jshint esversion: 6 */
/**
 * Echarts地图
 */

//中国地图(第一级地图)的ID、Name、Json数据
var chinaId = 430000;
var chinaName = '湖南'
var chinaJson = null;
var CITYID;
//记录父级ID、Name
var mapStack = [];
var parentId = 430000;
var parentName = '湖南';

var  initState=true;
//Echarts地图全局变量,主要是在返回上级地图的方法中会用到
var myChart = null;
$(function () {//dom加载后执行
    mapChart('mapChart');//
})



/**
 * 根据Json里的数据构造Echarts地图所需要的数据
 * @param {} mapJson
 */
function initMapData(mapJson) {
    var mapData = [];
    for (var i = 0; i < mapJson.features.length; i++) {
        mapData.push({
            name: mapJson.features[i].properties.name,
            value:Math.floor(Math.random()*5000)+200
            //id:mapJson.features[i].id
        })
    }
    return mapData;
}

/**
 * 返回上一级地图
 */
function backSuperior() {
    if (mapStack.length != 0) {//如果有上级目录则执行
        $('.title').html('湖南');
        var map = mapStack.pop();
        $.get('./asset/json/map/' + map.mapId + '.json', function (mapJson) {
            initState=true;
            registerAndsetOption(myChart, map.mapId, map.mapName, mapJson, false)

            //返回上一级后,父级的ID、Name随之改变
            parentId = map.mapId;
            parentName = map.mapName;

        })
    }


}







function mapChart(divid) {

    $.get('./asset/json/map/' + chinaId + '.json', function (mapJson) {
        chinaJson = mapJson;
        myChart = echarts.init(document.getElementById(divid));

        registerAndsetOption(myChart, chinaId, chinaName, mapJson, false)
        parentId = chinaId;
        parentName = '湖南';


        //钻取事件
        myChart.on('click', function (param) {
            $('.title').html(param.name);
            var cityId = cityMap[param.name];
            if (cityId) {//代表有下级地图
                CITYID=cityId;
                $.get('./asset/json/map/' + cityId + '.json', function (mapJson) {
                    //location.href="indexbf.html?cs="+param.name+"&cityid="+cityId;
                    registerAndsetOption(myChart, cityId, param.name, mapJson, true)
                })

            } else {
                // window.fn_get_event_post(cityId,param.name);//调用方法 获取数据 进行渲染
                // console.log("111");
                // $.get('./asset/json/map/' + CITYID + '.json', function (mapJson) {
                //     location.href="indexbf.html?cs="+param.name+"&cityid="+CITYID;
                //     //registerAndsetOption(myChart, cityId, param.name, mapJson, false)
                // })
                // console.log(cityId,param.name)
                // //没有下级地图,回到一级中国地图,并将mapStack清空
                // registerAndsetOption(myChart, chinaId, chinaName, chinaJson, false)
                // mapStack = []
                // parentId = cityId;
                // parentName = param.name;
                // param.name="湖南"
                // alert(param.name);
                return false;
            }

            //刷新页面渲染数据
            // $.get("test.html", {Action:"get",Name:"lulu"}, function (data, textStatus){
            //
            // })

            // param.event.event.stopPropagation();
            // return false

        });
        //移动上去 触发事件
        myChart.on("mouseover",function(param){
        })


    })
}

/**
 *
 * @param {*} myChart
 * @param {*} id        省市县Id
 * @param {*} name      省市县名称
 * @param {*} mapJson   地图Json数据
 * @param {*} flag      是否往mapStack里添加parentId,parentName
 */
function registerAndsetOption(myChart, id, name, mapJson, flag) {
    if(initState==false && name=="湖南"){
        return;
    }else{
        initState=false;
    }
    // window.fn_get_event_post(id,name);
    echarts.registerMap(name, mapJson);
    myChart.setOption({
        //左下角lengend
        tooltip : {
            // show: true,
            trigger: 'item',
            formatter: function(params) {
                if (params.data) return params.name + ':' + params.data['value']
            },
        },

        // dataRange: {
        //     show:false,
        //     x: 'left',
        //     y: 'bottom',
        //     splitList: [
        //         {start: 5, end: 5, color: 'orange'},//当值为5时,区域背景
        //         {start: 10, end: 10, color: '#F2D010'},//当值为10时,区域背景
        //         {start: 15, end: 15, color: '#ccc'},//当值为15时,区域背景
        //     ]
        // },

        toolbox: {
        feature: {
            saveAsImage: {}
        }
        },
        visualMap: {
            show:false,
            min: 200,
            max: 3000,
            left:'1%',
            bottom:'1%',
            itemWidth: 25,
            itemHeight: 100,
            text:['高','低'],
            realtime: false,
            calculable: true,
            textStyle: {
                color:'#fff',
                fontSize:'20'
            },
            inRange: {
                color: ['#18b0ff','#ffde00', '#ff6f18']
            }
        },
        series: [{
            hoverable: true,    //鼠标经过时,是否高亮显示
            type: 'map',
            map: name,
            label: {
                normal: {
                    show: true,
                    color:"#000",//城市名称颜色
                    fontSize:12//城市名称字体大小
                },
                emphasis: {
                    show: true,
                    color:"#fff",
                    fontSize:14
                }
            },
            itemStyle: {
                normal: {
                    areaColor: 'rgba(7,157,233,0.4)',//背景颜色值
                    borderColor: '#ddd',

                },
                emphasis: {
                    areaColor: '#3093d8'//指向颜色值
                }
            },

            //

            data: initMapData(mapJson)
        }]
    });

    if (flag) {//往mapStack里添加parentId,parentName,返回上一级使用
        mapStack.push({
            mapId: parentId,
            mapName: parentName
        });


        parentId = id;
        parentName = name;
    }
    console.log(mapStack);
}

至此,页面成功运行。欢迎大佬们指点

资源直通车链接:https://download.csdn.net/download/qq_42197013/21761477

另:3d地图请参考我的另一篇文章::实用且牛逼的3D旋转地图上显示柱图,可以更换成任意省市

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值