天天看点

结对第二次作业——某次疫情统计可视化的实现

这个作业属于哪个课程 班级的链接
这个作业要求在哪里 作业要求
结对学号 221701125 & 221701126
这个作业的目标 实现通过地图的形式来直观显示 疫情的大致分布情况,还可以查 看具体省份的疫情统计情况;点 击某个省份显示该省疫情的具体 情况;学习与队友进行合作;学 习使用github进行团队合作;学 习如何进行前后端数据交互。
作业正文 正文
其他参考文献 echarts官网 W3Cschool教程

1、仓库地址&代码规范

Github仓库地址

代码规范

2、展示作品

(1)首页如图所示,上半部分显示整体疫情,下半部分以中国地图来显示整体疫情,地图根据疫情显示不同颜色

结对第二次作业——某次疫情统计可视化的实现

(2)当鼠标移动到中国地图的某个省份,将会出现浮动窗口显示该省份的疫情,并且该省份地图会高亮显示。

结对第二次作业——某次疫情统计可视化的实现

(3)地图左边可查看根据确诊人数显示的不同颜色深浅,例如将鼠标移到100-999的部分,符合该部分的省份都将高亮显示

结对第二次作业——某次疫情统计可视化的实现

(4)鼠标点击100-999的图标,将重置所有疫情符合100-999的省份为白色,其他部分的颜色功能相同,点击即重置为白色,再次点击又会重新显示出颜色。

结对第二次作业——某次疫情统计可视化的实现

(5)中间的输入框可选择日期

结对第二次作业——某次疫情统计可视化的实现

(6)选择日期后,整个界面将统计该日期的疫情,地图的颜色也会根据疫情人数有所改变

结对第二次作业——某次疫情统计可视化的实现

(7)点击地图上某个省份,跳转到新页面显示该省份的疫情界面

结对第二次作业——某次疫情统计可视化的实现

(8)将鼠标移动到折线图上,将会跳出浮动窗显示具体数据(新增确诊趋势、新增疑似趋势、治愈趋势、死亡趋势)

结对第二次作业——某次疫情统计可视化的实现

(9)

结对第二次作业——某次疫情统计可视化的实现

折线图上方有四个标题,点击某个标题可隐藏该折线图,再次点击又可显示

结对第二次作业——某次疫情统计可视化的实现

(10)中间的输入框可选择日期,选择后将显示该省份该日期的具体疫情(现有确诊、累计确诊、累计治愈、累计死亡)

结对第二次作业——某次疫情统计可视化的实现

(11)折线图右上方有个下载的图标,点击可下载折线图界面

结对第二次作业——某次疫情统计可视化的实现

3、结对讨论过程描述

刚拿到题目后,和队友进行讨论,总结了以下问题:

(1)该用什么语言来写,需要能支持服务器(javaee还是php)?

(2)后端数据怎么获取?怎么处理?怎么统计?

(3)后端接口要如何返回数据?

(4)前端如何接收后端传来的数据?

(5)前端界面要如何规划?每个界面要如何划分模块?

(6)前端中国地图要如何绘制?前端折线图要如何绘制?

(7)前端如何实现不同省份不同疫情要显示不同颜色?鼠标移动如何显示浮窗?颜色高亮?

(8)前端如何实现日期选择?

经过讨论,并且上网查找资料后,基本解决了所有问题:

用javaee来做这个项目

后端读取日志文件,并写算法统计数据,讲数据封装到哈希表

后端接口返回int []类型的数组

前端用jsp来写,可直接写java代码调用后端接口传数据

前端首页和折线图页面都分为上下两部分,上半部分显示疫情数字,下半部分显示图表

中国地图和折线图都用echarts来绘制

echarts可设置不同数量显示不同颜色,中国地图echarts自带浮窗和显示高亮

前端日期选择用HTML5中的input标签,将属性type设置为date

echarts的用法可在官网找到使用教程

两人结对讨论截图:

结对第二次作业——某次疫情统计可视化的实现
结对第二次作业——某次疫情统计可视化的实现
结对第二次作业——某次疫情统计可视化的实现

4、设计实现过程

设计实现过程:后端处理数据后,前端调用后端接口获取数据,填充到echarts显示,中国地图点击某省份,跳转到折线图时,应该在跳转的URL后添加参数省份的id,调用方法request.getParameter()可获取input输入选择的日期,根据不同日期做相应的计算显示数据。

结对第二次作业——某次疫情统计可视化的实现

功能结构图:

结对第二次作业——某次疫情统计可视化的实现

5、关键代码

Entry.java 读取日志文件,处理数据,封装到哈希表中

/*
      * 处理每一个文件
      */
        public static void solveTheFile(String[] fileList) {
            Province nationwide = map.get("全国");
            // TODO Auto-generated method stub
            for(String aFile : fileList) {
                String fileDate = aFile.substring(0, aFile.indexOf("."));
            Date nationwideDate = new Date();
            nationwideDate.setDate(fileDate);
            
            try {
                File file = new File(path + "\\" + aFile);
                InputStreamReader inputReader = new InputStreamReader(new FileInputStream(file), "GB2312");
                BufferedReader bf = new BufferedReader(inputReader);
                String str;
                
                while ((str = bf.readLine()) != null && str.indexOf("//") != 0) {
                    if(str.length() == 0)
                        continue;
                    String[] information = str.split("\\s+");
                    String provinceName = information[0];//先取到省份
                    int number = getNumber(information);//取出各行人数
                    
                    if(map.get(provinceName) != null) {
                        Province province = map.get(provinceName);
                        Map<String, Date> dateMap = province.getDateMap();
                        Date date = new Date();
                        
                        if(dateMap.get(fileDate) != null) {
                            date = province.getDateMap().get(fileDate);
                        }
                        else {
                            date = new Date();
                            date.setDate(fileDate);
                        }
                        
                        switch (information[1]) {
                        case "新增":
                            if(information[2].equals("感染患者")) {
                                int ip = date.getIp();
                                ip += number;
                                date.setIp(ip);
                                
                                int nationwideIp = nationwideDate.getIp();