太难了,弄了好几天的全国疫情统计可视化,今天终于完工了,在全国疫情统计可视化博客的基础上,完成了全国疫情统计可视化+数据下钻,可以点击省,显示各省的详细数据信息。我观摩了很多大佬的博客,在大佬们博客上,我学习到了很多,包括思想和知识,自我感受阶段二和阶段三比阶段一有很大的难度。实属不易呀呀呀。真切实地的感受到了基本功的重要性。不然太多的bug容易被忽视呀。
课题要求:
项目思路:
1.在servlet中对获得的数据进行格式化转化(利用Gson将封装的信息转换成json的形式)
2.学习echarts的相关事件,在折线的基础上学习点击事件,并且利用里面的tooltip相关知识点,完成显示框和并悬停显示详细信息
3.在阶段二的基础上,使用ajax直接从数据库中获取各省份下的各个市的有关疫情的数据
项目结构:
相关源码:
Dao.java:
package com.dao; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.bean.Bean; import com.db.DB; import com.sun.corba.se.pept.transport.Connection; public class Dao { //阶段一按着时间段进行查询 public List<Bean> CheckTime1(String firsttime,String lasttime){ java.sql.Connection con=null; PreparedStatement psts=null; ResultSet rs=null; String tablename="info"; System.out.println("-------"); DB db=new DB(); try { con=db.getCon(); //String sql="select * from info where Date between ‘"+firsttime+"‘ and ‘"+lasttime+"‘"; String sql="select * from info where Date between ‘"+firsttime+"‘ and ‘"+lasttime+"‘"; psts=con.prepareStatement(sql); //psts.setString(1,firsttime); //psts.setString(2, lasttime); rs=psts.executeQuery(); List<Bean> list=new ArrayList<Bean>(); while(rs.next()){ String date=rs.getString("Date"); String province=rs.getString("Province"); String city=rs.getString("city"); String confirmed_num=rs.getString("Confirmed_num"); String cured_num=rs.getString("Cured_num"); String dead_num=rs.getString("Dead_num"); Bean data=new Bean(date,province,city,confirmed_num,cured_num,dead_num); list.add(data); } return list; }catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } //阶段二按着时间点进行查询 public List<Bean> search(String data){ int num=0; DB db=new DB(); List<Bean>list=new ArrayList<Bean>(); Connection con=null; java.sql.Statement psts=null; ResultSet rs=null; try { con=(Connection) db.getCon(); String sql="select * from info1 where Date =‘"+data+"‘"; System.out.print(sql); psts=((java.sql.Connection) con).createStatement(); rs=psts.executeQuery(sql); while(rs.next()){ // String id=rs.getString("Id"); String date=rs.getString("Date"); String province=rs.getString("Province"); String city=rs.getString("City"); String confirmed_num=rs.getString("Confirmed_num"); // String yisi_num=rs.getString("Yisi_num"); String cured_num=rs.getString("Cured_num"); String dead_num=rs.getString("Dead_num"); Bean data1=new Bean(date,province,city,confirmed_num,cured_num,dead_num); list.add(data1); System.out.println("第二阶段dao"); } } catch (SQLException e) { e.printStackTrace(); } return list; } //阶段三 public static List searchPro(String data,String province) { int num=0; List<Bean>list=new ArrayList<Bean>(); Connection con=null; java.sql.Statement psts=null; ResultSet rs=null; DB db=new DB(); try { con=(Connection) db.getCon(); String sql="select * from info1 where Date =‘"+data+"‘ and Province =‘"+province+"‘"; System.out.print(sql); psts=((java.sql.Connection) con).createStatement(); rs=psts.executeQuery(sql); while(rs.next()){ // String id=rs.getString("Id"); String date=rs.getString("Date"); String city=rs.getString("City"); String confirmed_num=rs.getString("Confirmed_num"); // String yisi_num=rs.getString("Yisi_num"); String cured_num=rs.getString("Cured_num"); String dead_num=rs.getString("Dead_num"); Bean pro=new Bean(date,province,city,confirmed_num,cured_num,dead_num); list.add(pro); System.out.println("第三阶段dao"); } } catch (SQLException e) { e.printStackTrace(); } return list; } public static void main(String[] args) { Dao dataDao=new Dao(); //List<information>list=dataDao.search("2020-02-08 02:28:59"); List<Bean>list=dataDao.searchPro("2020-02-08 02:28:59","湖北省"); int size=list.size(); System.out.print(size); } }
BeanServlet.java:
package com.servlet; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.bean.Bean; import com.dao.Dao; import com.google.gson.Gson; /** * Servlet implementation class InfoServlet */ @WebServlet("/InfoServlet") public class BeanServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public BeanServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); String dataString=request.getParameter("time"); List<Bean>list=new ArrayList<Bean>(); Dao dataDao=new Dao(); list=dataDao.search(dataString); if(list!=null) { Gson gson = new Gson(); String json = gson.toJson(list); System.out.println(json); response.getWriter().write(json); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
CityServlet.java:
package com.servlet; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.bean.Bean; import com.bean.City; import com.dao.Dao; import com.google.gson.Gson; /** * Servlet implementation class proServlet */ @WebServlet("/proServlet") public class CityServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public CityServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); String method = request.getParameter("method"); if(method.equals("d")) { try { d(request, response); } catch (SQLException e) { e.printStackTrace(); } }else if(method.equals("city")) { try { city(request, response); } catch (SQLException e) { e.printStackTrace(); } } } /** * @param request * @param response */ private void d(HttpServletRequest request, HttpServletResponse response)throws SQLException, ServletException, IOException { // TODO Auto-generated method stub String province = request.getParameter("province"); String time = "2020-02-12 10:14:15"; Dao dao=new Dao(); List<Bean> list = dao.searchPro(time,province); List<City> data = new ArrayList<City>(); for(int i=1; i<list.size();i++) { City city = new City(); city.setProvince(list.get(i).getCity()); city.setConfirmed_num(list.get(i).getConfirmed_num()); data.add(city); } Gson gson = new Gson(); String json = gson.toJson(data); System.out.println(json); response.getWriter().write(json); } /** * @param request * @param response */ private void city(HttpServletRequest request, HttpServletResponse response)throws SQLException, ServletException, IOException { // TODO Auto-generated method stub String province = request.getParameter("province"); String time = "2020-02-12 10:14:15"; Dao dao=new Dao(); List<Bean> list = dao.searchPro(time,province); List<City> data = new ArrayList<City>(); for(int i=1; i<list.size();i++) { City city = new City(); city.setProvince(list.get(i).getCity()); city.setConfirmed_num(list.get(i).getConfirmed_num()); data.add(city); } Gson gson = new Gson(); String json = gson.toJson(data); System.out.println(json); request.setAttribute("list", json); request.setAttribute("province", province); request.getRequestDispatcher("show_province.jsp").forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
show_china.html:
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><htmlstyle="height:100%"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0"><metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1"/><base><title>全国疫情地图</title><scriptsrc="js/jquery-1.12.3.min.js"type="text/javascript"></script><scripttype="text/javascript"src="js/echarts.min.js"></script><scripttype="text/javascript"src="js/china.js"></script><scripttype="text/javascript"src="province-json"></script></head><bodystyle="height:100%;margin:0"><divclass="row"style="background-color:silver;height:50px;text-align:center;line-height:50px">查询的日期<inputtype="text"name="time"id="time"placeholder="yyyy-MM-ddhh:mm:ss"><inputtype="button"value="查询"onclick="tu()"></div><divid="main"style="height:100%"></div></body><style>*{margin:0;padding:0}html,body{width:100%;height:100%;}#main{width:600px;height:450px;margin:20pxauto;border:1pxsolid#ddd;}/*默认长宽比0.75*/</style><scripttype="text/javascript">functionrandomData(){returnMath.round(Math.random()*500);}vardt;varmydata1=newArray(0);functiontu(){time=$("#time").val();//alert(time.substring(0,2));$.ajax({url:"BeanServlet",//处理页面地址,表示ajax要用哪个页面处理async:true,type:"POST",//传值方式data:{"time":time},success:function(data){dt=data;for(vari=0;i<33;i++){vard={};d["province"]=dt[i].province;//.substring(0,2);d["confirmed_num"]=dt[i].confirmed_num;//d["yisi_num"]=dt[i].yisi_num;d["cured_num"]=dt[i].cured_num;d["dead_num"]=dt[i].dead_num;mydata1.push(d);}//varmdata=JSON.stringify(mydata1);varoptionMap={backgroundColor:‘#FFFFFF‘,title:{text:‘全国疫情地图‘,subtext:‘‘,x:‘center‘},tooltip:{formatter:function(params){returnparams.province+‘<br/>‘+‘确诊人数:‘+params.confirmed_num+‘<br/>‘+‘死亡人数:‘+params[‘data‘].dead_num+‘<br/>‘+‘治愈人数:‘+params[‘data‘].cured_num;}//数据格式化},//左侧小导航图标visualMap:{min:0,max:35000,text:[‘多‘,‘少‘],//取值范围的文字realtime:false,calculable:true,inRange:{color:[‘#f5bba7‘,‘#974236‘,‘#372a28‘]//取值范围的颜色},show:true//图注},//配置属性series:[{type:‘map‘,mapType:‘china‘,roam:false,//不开启缩放和平移zoom:1.23,//视角缩放比例label:{show:true,fontSize:‘10‘,color:‘rgba(0,0,0,0.7)‘},itemStyle:{//外边框(底层地图)的一些属性borderColor:‘rgba(0,0,0,0.2)‘,/*borderWidth:6,shadowBlur:10,shadowColor:‘rgba(0,0,0,0.2)‘,*/},emphasis:{itemStyle:{//高亮时点的颜色areaColor:‘#F3B329‘,//鼠标选择区域颜色shadowOffsetX:0,shadowOffsetY:0,shadowBlur:20,borderWidth:0,shadowColor:‘rgba(0,0,0,0.5)‘},},data:mydata1,nameMap:{‘南海诸岛‘:‘南海诸岛‘,‘北京‘:‘北京市‘,‘天津‘:‘天津市‘,‘上海‘:‘上海市‘,‘重庆‘:‘重庆市‘,‘河北‘:‘河北省‘,‘河南‘:‘河南省‘,‘云南‘:‘云南省‘,‘辽宁‘:‘辽宁省‘,‘黑龙江‘:‘黑龙江省‘,‘湖南‘:‘湖南省‘,‘安徽‘:‘安徽省‘,‘山东‘:‘山东省‘,‘新疆‘:‘新疆维吾尔自治区‘,‘江苏‘:‘江苏省‘,‘浙江‘:‘浙江省‘,‘江西‘:‘江西省‘,‘湖北‘:‘湖北省‘,‘广西‘:‘广西壮族自治区‘,‘甘肃‘:‘甘肃省‘,‘山西‘:‘山西省‘,‘内蒙古‘:"内蒙古自治区",‘陕西‘:‘陕西省‘,‘吉林‘:‘吉林省‘,‘福建‘:‘福建省‘,‘贵州‘:‘贵州省‘,‘广东‘:‘广东省‘,‘青海‘:‘青海省‘,‘西藏‘:‘西藏自治区‘,‘四川‘:‘四川省‘,‘宁夏‘:‘宁夏回族自治区‘,‘海南‘:‘海南省‘,‘台湾‘:‘台湾‘,‘香港‘:‘香港‘,‘澳门‘:‘澳门‘}}]};//初始化echarts实例varmyChart=echarts.init(document.getElementById(‘main‘));myChart.on(‘click‘,function(params){alert(params.name);/*varurl="servlet2?province="+params.name;*/varurl="CityServlet?method=city&province="+params.name+"&time="+time;window.location.href=url;});//使用制定的配置项和数据显示图表myChart.setOption(optionMap);},error:function(){alert("请求失败");},dataType:"json"});}</script></html>
show_province.html:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="js/jquery-1.12.3.min.js" type="text/javascript"></script> <script type="text/javascript" src="js/echarts.min.js"></script> <script type="text/javascript" src="js/china.js"></script> <title>Insert title here</title> </head> <div id="main" style="height: 100%"></div> <style> *{margin:0;padding:0} html,body{ width:100%; height:100%; } #main{ width:600px; height:450px; margin: 20px auto; border:1px solid #ddd; } /*默认长宽比0.75*/ </style> <body> <script> //初始化echarts实例 var myChart = echarts.init(document.getElementById(‘main‘)); var province = "${province}"; $.get("mapjson/"+ province +".json", function (geoJson) { myChart.hideLoading(); echarts.registerMap(province, geoJson); myChart.setOption(option = { title: { text: province + ‘疫情地图‘, subtext : ‘‘, x : ‘center‘ }, tooltip: { trigger: ‘item‘, formatter: ‘{b}<br/>{c} (确诊 / 人)‘ }, toolbox: { show: true, orient: ‘vertical‘, left: ‘right‘, top: ‘center‘, feature: { dataView: {readOnly: false}, restore: {}, saveAsImage: {} } }, visualMap: { min: 0, max: 50000, text : [ ‘多‘, ‘少‘ ],//取值范围的文字 realtime : false, calculable : true, inRange : { color : [ ‘#f5bba7‘, ‘#974236‘, ‘ #372a28‘ ]//取值范围的颜色 }, show:true//图注 }, series: [ { name: province + ‘地区疫情情况‘, type: ‘map‘, mapType: province, // 自定义扩展图表类型 roam: false,//不开启缩放和平移 label: { show: true, fontSize:‘10‘, color: ‘rgba(0,0,0,0.7)‘ }, itemStyle : {//外边框(底层地图)的一些属性 borderColor : ‘rgba(0, 0, 0, 0.2)‘, /* borderWidth :6, shadowBlur:10, shadowColor: ‘rgba(0, 0, 0, 0.2)‘, */ }, emphasis: { itemStyle: { // 高亮时点的颜色 areaColor: ‘#F3B329‘,//鼠标选择区域颜色 shadowOffsetX: 0, shadowOffsetY: 0, shadowBlur: 20, borderWidth: 0, shadowColor: ‘rgba(0, 0 ,0, 0.5)‘ }, } } ] }); }); $.ajax({ url:"CityServlet?method=d", async:true, type:"POST", data:{"province":province}, dataType:"json", success:function(data){ alert(data.length); var mydata1 = new Array(0); for(var i=0;i<data.length;i++){ var c = {}; c["province"] = data[i].name+‘市‘; c["confirmed_num"] = data[i].value; mydata1.push(c); } myChart.setOption({ //加载数据图表 series: [{ data: mydata1 }] }); }, error:function(){ alert("请求失败"); }, }); </script> </body> </html>
运行截图:
原文:https://www.cnblogs.com/hhjing/p/12436966.html