第一周周总结

2020.02.22

利用echarts中的中国地图,并将各省疫情相关数据显示在图上,此问题主要为地图的显示和数据的传输

下面代码为该地图的显示,其利用了各个省的现成json数据来显示,并将疫情数据通过ajax异步传输给前端。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html style="height: 100%">
<head>
<meta charset="UTF-8">
<title>地图</title>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/extension/dataTool.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/map/js/china.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
</head>
<body style="height: 100%; margin: 0">
	<div id="ditu" style="height:100%"></div>
	<script type="text/javascript">
	$(function() {
		$.get('${pageContext.request.contextPath}/servlet?method=quanguo',
				function(data) {
					init(data);
				});

	});
	function init(data) {
		var allData=data;
		var dom = document.getElementById("ditu");
		var myChart = echarts.init(dom);
		var app = {};
		option = null;
		//各省份的地图json文件
		var provinces = {
		    '上海': 'ss/data-1482909900836-H1BC_1WHg.json',
		    '河北': 'ss/data-1482909799572-Hkgu_yWSg.json',
		    '山西': 'ss/data-1482909909703-SyCA_JbSg.json',
		    '内蒙古': 'ss/data-1482909841923-rkqqdyZSe.json',
		    '辽宁': 'ss/data-1482909836074-rJV9O1-Hg.json',
		    '吉林': 'ss/data-1482909832739-rJ-cdy-Hx.json',
		    '黑龙江': 'ss/data-1482909803892-Hy4__J-Sx.json',
		    '江苏': 'ss/data-1482909823260-HkDtOJZBx.json',
		    '浙江': 'ss/data-1482909960637-rkZMYkZBx.json',
		    '安徽': 'ss/data-1482909768458-HJlU_yWBe.json',
		    '福建': 'ss/data-1478782908884-B1H6yezWe.json',
		    '江西': 'ss/data-1482909827542-r12YOJWHe.json',
		    '山东': 'ss/data-1482909892121-BJ3auk-Se.json',
		    '河南': 'ss/data-1482909807135-SJPudkWre.json',
		    '湖北': 'ss/data-1482909813213-Hy6u_kbrl.json',
		    '湖南': 'ss/data-1482909818685-H17FOkZSl.json',
		    '广东': 'ss/data-1482909784051-BJgwuy-Sl.json',
		    '广西': 'ss/data-1482909787648-SyEPuJbSg.json',
		    '海南': 'ss/data-1482909796480-H12P_J-Bg.json',
		    '四川': 'ss/data-1482909931094-H17eKk-rg.json',
		    '贵州': 'ss/data-1482909791334-Bkwvd1bBe.json',
		    '云南': 'ss/data-1482909957601-HkA-FyWSx.json',
		    '西藏': 'ss/data-1482927407942-SkOV6Qbrl.json',
		    '陕西': 'ss/data-1482909918961-BJw1FyZHg.json',
		    '甘肃': 'ss/data-1482909780863-r1aIdyWHl.json',
		    '青海': 'ss/data-1482909853618-B1IiOyZSl.json',
		    '宁夏': 'ss/data-1482909848690-HJWiuy-Bg.json',
		    '新疆': 'ss/data-1482909952731-B1YZKkbBx.json',
		    '北京': 'ss/data-1482818963027-Hko9SKJrg.json',
		    '天津': 'ss/data-1482909944620-r1-WKyWHg.json',
		    '重庆': 'ss/data-1482909775470-HJDIdk-Se.json',
		    '香港': 'ss/data-1461584707906-r1hSmtsx.json',
		    '澳门': 'ss/data-1482909771696-ByVIdJWBx.json'
		};

	
		loadMap('ss/data-1527045631990-r1dZ0IM1X.json', 'china');//初始化全国地图

		var timeFn = null;

		//单击切换到省级地图,当mapCode有值,说明可以切换到下级地图
		myChart.on('click', function(params) {
		    clearTimeout(timeFn);
		    //由于单击事件和双击事件冲突,故单击的响应事件延迟250毫秒执行
		    timeFn = setTimeout(function() {
		        var name = params.name; //地区name
		        var mapCode = provinces[name]; //地区的json数据
		        if (!mapCode) {
		            alert('无此区域地图显示');
		            return;
		        }

		        loadMap(mapCode, name);
		        
		    }, 250);
		});


		// 绑定双击事件,返回全国地图
		myChart.on('dblclick', function(params) {
		    //当双击事件发生时,清除单击事件,仅响应双击事件
		    clearTimeout(timeFn);
		    
		    //返回全国地图
		    loadMap('ss/data-1527045631990-r1dZ0IM1X.json', 'china');
		});

		/**
		 获取对应的json地图数据,然后向echarts注册该区域的地图,最后加载地图信息
		 @params {String} mapCode:json数据的地址
		 @params {String} name: 地图名称
		 */
		function loadMap(mapCode, name) {
		    $.get(mapCode, function(data) {
		        if (data) {
		            echarts.registerMap(name, data);
		            var option = {
		                tooltip: {
		                    show: true,
		                    formatter: function(params) {
		                        if (params.data) return params.name + '确诊:' + params.data['value']
		                    },
		                },
		               
		                visualMap: {
		                    min: 0,
		                    max: 1000,
		                    left: 26,
		                    bottom: 40,
		                    showLabel: !0,
		                    text: ["高", "低"],
		                    pieces: [{
		                        gt: 10000,
		                        label: "> 10000 人",
		                        color: "#7f1100"
		                    }, {
		                        gte: 1000,
		                        lte: 9999,
		                        label: "1000 - 9999 人",
		                        color: "#ff5428"
		                    }, {
		                        gte: 100,
		                        lt: 999,
		                        label: "100 - 999 人",
		                        color: "#ff8c71"
		                    }, {
		                        gt: 10,
		                        lt: 99,
		                        label: "10 - 99",
		                        color: "#ffd768"
		                    }, {
		                        gt: 0,
		                        lt: 9,
		                        label: "1 - 9",
		                        color: "#FFF0F5"
		                    },{
		                        value: 0,
		                        color: "#ffffff"
		                    }],
		                    show: !0
		                },
		                series: [{
		                    name: 'MAP',
		                    type: 'map',
		                    mapType: name,
		                    selectedMode: 'false',//是否允许选中多个区域
		                    label: {
		                        normal: {
		                            show: true
		                        },
		                        emphasis: {
		                            show: true
		                        }
		                    },
		                    data: allData
		                }]
		            };
		            myChart.setOption(option);
		            // curMap = {
		            //     mapCode: mapCode,
		            //     mapName: name
		            // };
		        } else {
		            alert('无法加载该地图');
		        }
		    });
		};
		if (option && typeof option === "object") {
			myChart.setOption(option, true);
		}
	}
	</script>
</body>
</html>

  

 

下边的代码为可下钻的中国地图,其可下钻到省市

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<script type="text/javascript" src="js/dataTool.js"></script>
<script type="text/javascript" src="js/echarts.js"></script>
</head>
<body>
<script type="text/javascript">
/*注:源码就是下面这些,只要复制到开发工具就行,然后把
地图json数据(下载地址:https://share.weiyun.com/5x12K4r)的路径放对,
并且要导入echarts就可以渲染出来地图了*/
var zhongguo = "map/data-china.json";
var hainan = "map/data-hainan.json";
var xizang = "map/data-xizang.json";
var zhejiang = "map/data-zhejiang.json";
var yunnan = "map/data-yunnan.json";
var xinjiang = "map/data-xinjiang.json";
var tianjin = "map/data-tianjin.json";
var sichuan = "map/data-sichuan.json";
var shanxi = "map/data-shanxi.json";
var shangxi = "map/data-shangxi.json";
var shanghai = "map/data-shanghai.json";
var shangdong = "map/data-shangdong.json";
var qinghai = "map/data-qinghai.json";
var ningxia = "map/data-ningxia.json";
var neimenggu = "map/data-neimenggu.json";
var liaoning = "map/data-liaoning.json";
var jilin = "map/data-jilin.json";
var jiangxi = "map/data-jiangxi.json";
var jiangsu = "map/data-jiangsu.json";
var hunan = "map/data-hunan.json";
var hubei = "map/data-hubei.json";
var henan = "map/data-henan.json";
var heilongjiang = "map/data-heilongjiang.json";
var hebei = "map/data-hebei.json";
var guizhou = "map/data-guizhou.json";
var guangxi = "map/data-guangxi.json";
var guangdong = "map/data-guangdong.json";
var gansu = "map/data-gansu.json";
var chongqing = "map/data-chongqing.json";
var aomen = "map/data-aomen.json";
var anhui = "map/data-anhui.json";
var beijing = "map/data-beijing.json";
var fujian = "map/data-fujian.json";
var xianggang = "map/data-xianggang.json";

echarts.extendsMap = function(id, opt) {
    // 实例
    var chart = this.init(document.getElementById('main'));

    var curGeoJson = {};
    var cityMap = {
        '中国': zhongguo,
        '上海': shanghai,
        '河北': hebei,
        '山西': shangxi,
        '内蒙古': neimenggu,
        '辽宁': liaoning,
        '吉林': jilin,
        '黑龙江': heilongjiang,
        '江苏': jiangsu,
        '浙江': zhejiang,
        '安徽': anhui,
        '福建': fujian,
        '江西': jiangxi,
        '山东': shangdong,
        '河南': henan,
        '湖北': hubei,
        '湖南': hunan,
        '广东': guangdong,
        '广西': guangxi,
        '海南': hainan,
        '四川': sichuan,
        '贵州': guizhou,
        '云南': yunnan,
        '西藏': xizang,
        '陕西': shanxi,
        '甘肃': gansu,
        '青海': qinghai,
        '宁夏': ningxia,
        '新疆': xinjiang,
        '北京': beijing,
        '天津': tianjin,
        '重庆': chongqing,
        '香港': xianggang,
        '澳门': aomen
    };

    var levelColorMap = {
        '1': 'rgba(241, 109, 115, .8)',
        '2': 'rgba(255, 235, 59, .7)',
        '3': 'rgba(147, 235, 248, 1)'
    };

    var defaultOpt = {
        mapName: 'china', // 地图展示
        goDown: false, // 是否下钻
        bgColor: '#404a59', // 画布背景色
        activeArea: [], // 区域高亮,同echarts配置项
        data: [],
        // 下钻回调(点击的地图名、实例对象option、实例对象)
        callback: function(name, option, instance) {}
    };
    if (opt) opt = this.util.extend(defaultOpt, opt);

    // 层级索引
    var name = [opt.mapName];
    var idx = 0;
    var pos = {
        leftPlus: 115,
        leftCur: 150,
        left: 198,
        top: 50
    };

    var line = [
        [0, 0],
        [8, 11],
        [0, 22]
    ];
    // style
    var style = {
        font: '18px "Microsoft YaHei", sans-serif',
        textColor: '#eee',
        lineColor: 'rgba(147, 235, 248, .8)'
    };

    var handleEvents = {
        /**
         * i 实例对象
         * o option
         * n 地图名
         **/
        resetOption: function(i, o, n) {
            var breadcrumb = this.createBreadcrumb(n);
            var j = name.indexOf(n);
            var l = o.graphic.length;
            if (j < 0) {
                o.graphic.push(breadcrumb);
                o.graphic[0].children[0].shape.x2 = 145;
                o.graphic[0].children[1].shape.x2 = 145;
                if (o.graphic.length > 2) {
                    var cityData = [];
                    var cityJson;
                    for (var x = 0; x < opt.data.length; x++) {
                        if(n === opt.data[x].city){
                            $([opt.data[x]]).each(function(index,data){
                                cityJson = {city:data.city,name:data.name,value:data.value,crew:data.crew,company:data.company,position:data.position,region:data.region};
                                cityData.push(cityJson)
                            }) 
                        }
                    }
                    
                    if(cityData!=null){
                        o.series[0].data = handleEvents.initSeriesData(cityData);
                    }else{
                        o.series[0].data = [];
                    }
                    
                    
                }
                name.push(n);
                idx++;
            } else {
                o.graphic.splice(j + 2, l);
                if (o.graphic.length <= 2) {
                    o.graphic[0].children[0].shape.x2 = 60;
                    o.graphic[0].children[1].shape.x2 = 60;
                    o.series[0].data = handleEvents.initSeriesData(opt.data);
                };
                name.splice(j + 1, l);
                idx = j;
                pos.leftCur -= pos.leftPlus * (l - j - 1);
            };

            o.geo.map = n;
            o.geo.zoom = 0.4;
            i.clear();
            i.setOption(o);
            this.zoomAnimation();
            opt.callback(n, o, i);
        },

        /**
         * name 地图名
         **/
        createBreadcrumb: function(name) {
            var cityToPinyin = {
                '中国': 'zhongguo',
                '上海': 'shanghai',
                '河北': 'hebei',
                '山西': 'shangxi',
                '内蒙古': 'neimenggu',
                '辽宁': 'liaoning',
                '吉林': 'jilin',
                '黑龙江': 'heilongjiang',
                '江苏': 'jiangsu',
                '浙江': 'zhejiang',
                '安徽': 'anhui',
                '福建': 'fujian',
                '江西': 'jiangxi',
                '山东': 'shangdong',
                '河南': 'henan',
                '湖北': 'hubei',
                '湖南': 'hunan',
                '广东': 'guangdong',
                '广西': 'guangxi',
                '海南': 'hainan',
                '四川': 'sichuan',
                '贵州': 'guizhou',
                '云南': 'yunnan',
                '西藏': 'xizang',
                '陕西': 'shanxi',
                '甘肃': 'gansu',
                '青海': 'qinghai',
                '宁夏': 'ningxia',
                '新疆': 'xinjiang',
                '北京': 'beijing',
                '天津': 'tianjin',
                '重庆': 'chongqing',
                '香港': 'xianggang',
                '澳门': 'aomen'
            };
            var breadcrumb = {
                type: 'group',
                id: name,
                left: pos.leftCur + pos.leftPlus,
                top: pos.top + 3,
                children: [{
                    type: 'polyline',
                    left: -90,
                    top: -5,
                    shape: {
                        points: line
                    },
                    style: {
                        stroke: '#fff',
                        key: name
                        // lineWidth: 2,
                    },
                    onclick: function() {
                        var name = this.style.key;
                        handleEvents.resetOption(chart, option, name);
                    }
                }, {
                    type: 'text',
                    left: -68,
                    top: 'middle',
                    style: {
                        text: name,
                        textAlign: 'center',
                        fill: style.textColor,
                        font: style.font
                    },
                    onclick: function() {
                        var name = this.style.text;
                        handleEvents.resetOption(chart, option, name);
                    }
                }, {
                    type: 'text',
                    left: -68,
                    top: 10,
                    style: {

                        name: name,
                        text: cityToPinyin[name] ? cityToPinyin[name].toUpperCase() : '',
                        textAlign: 'center',
                        fill: style.textColor,
                        font: '12px "Microsoft YaHei", sans-serif',
                    },
                    onclick: function() {
                        // console.log(this.style);
                        var name = this.style.name;
                        handleEvents.resetOption(chart, option, name);
                    }
                }]
            }

            pos.leftCur += pos.leftPlus;

            return breadcrumb;
        },

       // 设置effectscatter
        initSeriesData: function(data) {
            var temp = [];
            for (var i = 0; i < data.length; i++) {
                var geoCoord = geoCoordMap[data[i].name];
                if (geoCoord) {
                    temp.push({
                        name: data[i].name,
                        value: geoCoord.concat(data[i].value),
                        crew:data[i].crew,
						company:data[i].company,
						position:data[i].position,
						region:data[i].region
                    });
                }
            };
            return temp;
        },
        zoomAnimation: function() {
            var count = null;
            var zoom = function(per) {
                if (!count) count = per;
                count = count + per;
                // console.log(per,count);
                chart.setOption({
                    geo: {
                        zoom: count
                    }
                });
                if (count < 1) window.requestAnimationFrame(function() {
                    zoom(0.2);
                });
            };
            window.requestAnimationFrame(function() {
                zoom(0.2);
            });
        }
    };

    var option = {
        backgroundColor: opt.bgColor,
         tooltip: {
            show: true,
            trigger:'item',
            alwaysShowContent:false,
            backgroundColor:'rgba(50,50,50,0.7)',
            hideDelay:100,
            triggerOn:'mousemove',
            enterable:true,
            position:['60%','70%'],
            formatter:function(params, ticket, callback){
                return '简称:'+params.data.name+'<br/>'+'机组:'+params.data.crew+'万千瓦'+'<br/>'+'公司名称:'+params.data.company+'<br/>'+'所属大区:'+params.data.region+'<br/>'+'所在位置:'+params.data.position
            }
        },
        graphic: [{
            type: 'group',
            left: pos.left,
            top: pos.top - 4,
            children: [{
                type: 'line',
                left: 0,
                top: -20,
                shape: {
                    x1: 0,
                    y1: 0,
                    x2: 60,
                    y2: 0
                },
                style: {
                    stroke: style.lineColor,
                }
            }, {
                type: 'line',
                left: 0,
                top: 20,
                shape: {
                    x1: 0,
                    y1: 0,
                    x2: 60,
                    y2: 0
                },
                style: {
                    stroke: style.lineColor,
                }
            }]
        }, 
        {
            id: name[idx],
            type: 'group',
            left: pos.left + 2,
            top: pos.top,
            children: [{
                type: 'polyline',
                left: 90,
                top: -12,
                shape: {
                    points: line
                },
                style: {
                	
                    stroke: 'transparent',
                    key: name[0]
                },
                onclick: function() {
                    var name = this.style.key;
                    handleEvents.resetOption(chart, option, name);
                }
            }, {
                type: 'text',
                left: 0,
                top: 'middle',
                style: {
                    text: '中国',
                    textAlign: 'center',
                    fill: style.textColor,
                    font: style.font
                },
                onclick: function() {
                    handleEvents.resetOption(chart, option, '中国');
                }
            }, {
                type: 'text',
                left: 0,
                top: 10,
                style: {
                    text: 'China',
                    textAlign: 'center',
                    fill: style.textColor,
                    font: '12px "Microsoft YaHei", sans-serif',
                },
                onclick: function() {
                    handleEvents.resetOption(chart, option, '中国');
                }
            }]
        }],
        geo: {
            map: opt.mapName,
            roam: true,
            zoom: 1,
            label: {
                normal: {
                    show: true,
                    textStyle: {
                        color: '#fff'
                    }
                },
                emphasis: {
                    textStyle: {
                        color: '#fff'
                    }
                }
            },
            itemStyle: {
                normal: {
                    borderColor: 'rgba(147, 235, 248, 1)',
                    borderWidth: 1,
                    areaColor: {
                        type: 'radial',
                        x: 0.5,
                        y: 0.5,
                        r: 0.8,
                        colorStops: [{
                            offset: 0,
                            color: 'rgba(147, 235, 248, 0)' // 0% 处的颜色
                        }, {
                            offset: 1,
                            color: 'rgba(147, 235, 248, .2)' // 100% 处的颜色
                        }],
                        globalCoord: false // 缺省为 false
                    },
                    shadowColor: 'rgba(128, 217, 248, 1)',
                    // shadowColor: 'rgba(255, 255, 255, 1)',
                    shadowOffsetX: -2,
                    shadowOffsetY: 2,
                    shadowBlur: 10
                },
                emphasis: {
                    areaColor: '#389BB7',
                    borderWidth: 0
                }
            },
            regions: opt.activeArea.map(function(item) {
                if (typeof item !== 'string') {
                    return {
                        name: item.name,
                        itemStyle: {
                            normal: {
                                areaColor: item.areaColor || '#389BB7'
                            }
                        },
                        label: {
                            normal: {
                                show: item.showLabel,
                                textStyle: {
                                    color: '#fff'
                                }
                            }
                        }
                    }
                } else {
                    return {
                        name: item,
                        itemStyle: {
                            normal: {
                                borderColor: '#91e6ff',
                                areaColor: '#389BB7'
                            }
                        }
                    }
                }
            })
        },
        series: [{
            type: 'effectScatter',
            coordinateSystem: 'geo',
            showEffectOn: 'render',
            rippleEffect: {
                period:15,
                scale: 4,
                brushType: 'fill'
            },
            hoverAnimation: true,
            itemStyle: {
                normal: {
                    color: '#FFC848',
                    shadowBlur: 10,
                    shadowColor: '#333'
                }
            },
            data: handleEvents.initSeriesData(opt.data)
        }]
    };

    chart.setOption(option);
    // 添加事件
    chart.on('click', function(params) {
        var _self = this;
        if (opt.goDown && params.name !== name[idx]) {
            if (cityMap[params.name]) {
                var url = cityMap[params.name];
                $.get(url, function(response) {
                    //console.log(response);
                    curGeoJson = response;
                    echarts.registerMap(params.name, response);
                    handleEvents.resetOption(_self, option, params.name);
                });
            }
        }
    });

    chart.setMap = function(mapName) {
        var _self = this;
        if (mapName.indexOf('市') < 0) mapName = mapName + '市';
        var citySource = cityMap[mapName];
        if (citySource) {
            var url = './map/' + citySource + '.json';
            $.get(url, function(response) {
                // console.log(response);
                curGeoJson = response;
                echarts.registerMap(mapName, response);
                handleEvents.resetOption(_self, option, mapName);
            });
        }
        
    };

    return chart;
};

$.getJSON(zhongguo, function(geoJson) {
    echarts.registerMap('中国', geoJson);
    var myChart = echarts.extendsMap('chart-panel', {
        bgColor: '#154e90', // 画布背景色
        mapName: '中国', // 地图名
        goDown: true, // 是否下钻
        // 下钻回调
        callback: function(name, option, instance) {
            //console.log(name, option, instance);
        },
       
    });
})
</script>
<div id="main" style="width:100%;height:1000px;"></div>
</body>
</html>

  

 

posted @ 2020-02-22 18:41  HHHarden13  阅读(223)  评论(0编辑  收藏  举报