疫情地图项目

01 | 效果

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

02 | 代码实现

  1. control.js

    var myChart = echarts.init(document.getElementById('main'));
    function updateMap(num){
    		$(".control").show();
    		$(".control:eq("+num+")").hide();
    		myChart.clear();
    		var opt = null;
    		switch(num){
    			case 0:{
    				opt = {
    				        // 设置标题和副标题及副标题跳转链接
    				        title: {
    				            text: '新冠疫情-国内累计数据',
    				            subtext: '数据来源--开课吧',
    				            sublink: 'https://www.kaikeba.com'
    				        },
    				        // 数据提示框
    				        tooltip: {
    				            trigger: 'item', // item放到数据区域触发
    				            formatter: function (params, ticket, callback) {
    				                if(params.data)
    				                    return params.name+'<br/>'+params.data.value+' (人)';
    				                else
    				                    return params.name+'<br/>无疫情信息';
    				            }
    				        },
    				        // 视觉映射方案:
    				        // visualMap默认是连续映射,我们也可以设置为分段型,对于分布范围广的数据
    				        // 使用透明度来区分疫情严重情况
    				        visualMap: {
    				            type: 'piecewise',
    				            pieces: [
    				                {gt: 2000, color: 'darkred'},                        // (1500, Infinity]
    				                {gt: 1300, lte: 2000, color: 'red', colorAlpha: 1},  // (1000, 1500]
    				                {gt: 800, lte: 1300, color: 'red', colorAlpha: 0.8},
    				                {gt: 500, lte: 800, color: 'red', colorAlpha: 0.6},
    				                {gt: 200, lte: 500, color: 'red', colorAlpha: 0.4},
    				                {gt: 50, lte: 200, color: 'red', colorAlpha: 0.3},
    				                {lt: 50, color: 'red', colorAlpha: 0.2}          // (-Infinity, 100)
    				            ],
    				        },
    				
    				        // 具体数据
    				        series: [
    				            {
    				                name: '国内各省确诊病例', // 系列名称
    				                zoom:1.2,//地图大小
    				                type: 'map', // 系列类型,地图
    				                map: 'china', // 要使用的地图,即上面注册的地图名称
    				                roam: true, // 开启鼠标缩放和平移漫游
    				                label: { // 图形上的文本标签,地图默认显示数据名
    				                    show: true,
    				                    formatter: '{b}', // b是数据名,c是数据值
    				                    fontSize: 8
    				                },
    				                data: data.data,
    				            }
    				        ]
    				    };
    				
    			}
    			break;
    			case 1:{
    				opt = {
    				        // 设置标题和副标题及副标题跳转链接
    				        title: {
    				            text: '新冠疫情-国内新增数据',
    				            subtext: '数据来源--开课吧',
    				            sublink: 'https://www.kaikeba.com'
    				        },
    				        // 数据提示框
    				        tooltip: {
    				            trigger: 'item', // item放到数据区域触发
    				            formatter:  function (params, ticket, callback) {
    				                if(params.data)
    				                    return params.name+'<br/>'+params.data.value+' (人)';
    				                else
    				                    return params.name+'<br/>无疫情信息';
    				            }
    				        },
    				
    						// 视觉映射方案:
    				        // visualMap默认是连续映射,我们也可以设置为分段型,对于分布范围广的数据
    				        // 使用透明度来区分疫情严重情况
    				        visualMap: {
    				            type: 'piecewise',
    				            pieces: [
    				                {gt: 50, color: 'darkred'},                        // (1500, Infinity]
    				                {gt: 30, lte: 50, color: 'red', colorAlpha: 1},  // (1000, 1500]
    				                {gt: 20, lte: 30, color: 'red', colorAlpha: 0.8},
    				                {gt: 10, lte: 20, color: 'red', colorAlpha: 0.6},
    				                {gt: 5, lte: 10, color: 'red', colorAlpha: 0.4},
    				                {gt: 1, lte: 5, color: 'red', colorAlpha: 0.3},
    				                {lt: 1, color: 'red', colorAlpha: 0.0}          // (-Infinity, 100)
    				            ],
    				        },
    				
    				        // 具体数据
    				        series: [
    				            {
    				                name: '国内各省确诊病例', // 系列名称
    				                zoom:1.2,//地图大小
    				                type: 'map', // 系列类型,地图
    				                map: 'china', // 要使用的地图,即上面注册的地图名称
    				                roam: true, // 开启鼠标缩放和平移漫游
    				                label: { // 图形上的文本标签,地图默认显示数据名
    				                    show: true,
    				                    formatter: '{b}', // b是数据名,c是数据值
    				                    fontSize: 8
    				                },
    				                data: data.today,
    				            }
    				        ]
    				    };	
    			}
    			break;
    			case 2:{
    				opt = {
    				    // 设置标题和副标题及副标题跳转链接
    				    title: {
    				      text: '新冠疫情-全球累计数据',
    				      subtext: '数据来源--开课吧',
    				      sublink: 'https://www.kaikeba.com'
    				    },
    				    // 数据提示框
    				    tooltip: {
    				      trigger: 'item', // item放到数据区域触发
    				      //formatter: '{b}<br/>{c} (人)' // 提示数据格式br表示换行,地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无)
    				      formatter:function (params, ticket, callback) {
    				        if(params.data)
    				          return params.name+'<br/>'+params.data.value+' (人)';
    				        else
    				          return params.name+'<br/> 未公布感染人数';
    				      }
    				    },
    				    // 视觉映射方案1:,疫情颜色根据传染病疫情等级分类为5个级别:黄色-橙色-深橙色-红色-深红色
    				    // 为了是视觉分布更好,可以添加更多的颜色范围,然后适当调小max的值,因为美国和其它国家相差太大
    				    /**/
    				    visualMap: {
    				      min: 1, // 颜色映射对应的最小值,即对应下面的lightskyblue
    				      max: 500000, // 颜色映射对应的最大值,即对应下面的orangered
    				      text: ['严重', '轻微'], // 映射图上下标记文本
    				      realtime: true, // 是否显示拖拽手柄,映射条可以拖拽调整要映射的范围
    				      calculable: true, // 拖拽时,是否实时更新地图
    				      inRange: {
    				        color: ['rgba(222,0,0,0.2)','rgba(160,0,0,1)'] // 颜色映射范围,最小值,过渡值,最大值
    				      }
    				    },
    				
    				    
    				
    				
    				    // 具体数据
    				    series: [
    				      {
    				        name: '全球各国确诊病例', // 系列名称
    				        zoom:1.2,//地图大小
    				        type: 'map', // 系列类型,地图
    				        map: 'world', // 要使用的地图,即上面注册的地图名称
    				        roam: true, // 开启鼠标缩放和平移漫游
    				        label: { // 图形上的文本标签,地图默认显示数据名
    				          show: true,
    				          fontSize:8,
    				          //formatter: '{b}', // b是数据名,c是数据值
    				          formatter:function (params, ticket, callback) {
    				            //公布了数据 且 数据累计数据大于5万的显示国家名称
    				            if(params.data && params.data.value>50000) {
    				              return params.name;
    				            }else{
    				              return '';
    				            }
    				          }
    				        },
    				        data: data.g_data,
    				      }
    				    ]
    				  };
    			}
    			break;
    			case 3:{
    				opt = {
    				    // 设置标题和副标题及副标题跳转链接
    				    title: {
    				      text: '新冠疫情-全球新增数据',
    				      subtext: '数据来源--开课吧',
    				      sublink: 'https://www.kaikeba.com'
    				    },
    				    // 数据提示框
    				    tooltip: {
    				      trigger: 'item', // item放到数据区域触发
    				      formatter:function (params, ticket, callback) {
    				        if(params.data)
    				          return params.name+'<br/>'+params.data.value+' (人)';
    				        else
    				          return params.name+'<br/> 未公布感染人数';
    				      }
    				    },
    				    // 视觉映射方案1:,疫情颜色根据传染病疫情等级分类为5个级别:黄色-橙色-深橙色-红色-深红色
    				    // 为了是视觉分布更好,可以添加更多的颜色范围,然后适当调小max的值,因为美国和其它国家相差太大
    				    /**/
    				    visualMap: {
    				      min: 0, // 颜色映射对应的最小值,
    				      max: 20000, // 颜色映射对应的最大值
    				      text: ['严重', '轻微'], // 映射图上下标记文本
    				      realtime: true, // 是否显示拖拽手柄,映射条可以拖拽调整要映射的范围
    				      calculable: true, // 拖拽时,是否实时更新地图
    				      inRange: {
    				        color: ['rgba(160,0,0,0)','rgba(160,0,0,1)'] // 颜色映射范围,最小值,过渡值,最大值
    				      }
    				    },
    				    // 具体数据
    				    series: [
    				      {
    				        name: '全球各国新增病例', // 系列名称
    				        zoom:1.2,//地图大小
    				        type: 'map', // 系列类型,地图
    				        map: 'world', // 要使用的地图,即上面注册的地图名称
    				        roam: true, // 开启鼠标缩放和平移漫游
    				        label: { // 图形上的文本标签,地图默认显示数据名
    				          show: true,
    				          fontSize:8,
    				          //formatter: '{b}', // b是数据名,c是数据值
    				          formatter:function (params, ticket, callback) {
    				            //公布了数据 且 数据累计数据大于5万的显示国家名称
    				            if(params.data && params.data.value>1000 || params.name == '中国') {
    				              return params.name;
    				            }else{
    				              return '';
    				            }
    				          }
    				        },
    				        data: data.g_today,
    				      }
    				    ]
    				  };
    			}
    			break;
    		}
    		 myChart.setOption(opt);
    	}
    	updateMap(0);
    
  2. index.jsp

    <%@ page import="java.io.InputStream" %>
    <%@ page import="java.net.URL" %>
    <%@ page import="java.io.BufferedReader" %>
    <%@ page import="java.io.InputStreamReader" %>
    <%@ page import="java.net.URLConnection" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta charset="UTF-8">
        <title>疫情地图</title>
      </head>
    
      <script type="text/javascript">
        <%!
            // 记录时间戳 ,0表示1970年1月1日
            long time = 0;
            String text;
        %>
    
        <%
            //时间戳:指的是格林威治开始时( 1970-1-1 00:00) 历到月前的毫秒数13位数字
            if(System.currentTimeMillis() - time > 600000) {        // 600000表示10分钟
                // 更新时间
                time = System.currentTimeMillis();
    
                //1. 创建一个URL类的对象url
                URL url = new URL("https://zaixianke.com/yq/all");
    
                //2. 通过URL类的对象url打开网络连接 , 并得到连接对象conn
                URLConnection conn = url.openConnection();
    
                //3. 通过连接对象 , 得到用于读取网页内容的输入流 is
                InputStream is = conn.getInputStream();
    
                //4. 将上述的字节流is 装饰为字符流 , 将字符流再装饰为一次能读取一行的字符流br
                BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
    
                //5. 通过字符流br,读取一行内容,并将内容存储到变量text中
                text = br.readLine();     // 由于之前在成员区域已经声明过 这里要取消原先的声明 否则页面加载不出来
            }
            //6. 可以将读取到的内容text 输出显示到前端模板中
           %>
          var data = <%=text%>;
      </script>
      
      <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
      <script src="https://cdn.bootcss.com/echarts/4.7.0/echarts.min.js"></script>
      <script src="http://cdn.zaixianke.com/china.js"></script>
      <script src="http://cdn.zaixianke.com/world.js"></script>
      </head>
      <body>
        <div id="main" style="width: 100%;height:600px;"></div> <br>
        <div style="text-align:center">
          <a style="color:#333" class="control" align="center" href="javascript:updateMap(0)">国内累计</a>
          <a style="color:#333" class="control" align="center" href="javascript:updateMap(1)">国内新增</a>
          <a style="color:#333" class="control" align="center" href="javascript:updateMap(2)">全球累计</a>
          <a style="color:#333" class="control" align="center" href="javascript:updateMap(3)">全球新增</a>
        </div>
        <script src="control.js"></script>
      </body>
    </html>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值