结对第二次作业——某次疫情统计可视化的实现
班级的链接 | |
---|---|
这个作业要求在哪里 | 作业要求 |
结对学号 | 221701125 & 221701126 |
这个作业的目标 | 实现通过地图的形式来直观显示 疫情的大致分布情况,还可以查 看具体省份的疫情统计情况;点 击某个省份显示该省疫情的具体 情况;学习与队友进行合作;学 习使用github进行团队合作;学 习如何进行前后端数据交互。 |
作业正文 | 正文 |
其他参考文献 | echarts官网 W3Cschool教程 |
1、仓库地址&代码规范
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();