当前位置:   article > 正文

基于大数据技术Hadoop的气象分析可视化大屏设计和实现

基于大数据技术Hadoop的气象分析可视化大屏设计和实现

博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c++等开发语言,以及毕业项目实战✌

       从事基于java BS架构、CS架构、c/c++ 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经验。

       先后担任过技术总监、部门经理、项目经理、开发组长、java高级工程师及c++工程师等职位,在工业互联网、国家标识解析体系、物联网、分布式集群架构、大数据通道处理、接口开发、远程教育、办公OA、财务软件(工资、记账、决策、分析、报表统计等方面)、企业内部管理软件(ERP、CRM等)、arggis地图等信息化建设领域有较丰富的实战工作经验;拥有BS分布式架构集群、数据库负载集群架构、大数据存储集群架构,以及高并发分布式集群架构的设计、开发和部署实战经验;拥有大并发访问、大数据存储、即时消息等瓶颈解决方案和实战经验。

       拥有产品研发和发明专利申请相关工作经验,完成发明专利构思、设计、编写、申请等工作,并获得发明专利1枚。

-----------------------------------------------------------------------------------

      大家在毕设选题、项目升级、论文写作,就业毕业等相关问题都可以给我留言咨询,非常乐意帮助更多的人或加w 908925859。

相关博客地址:

csdn专业技术博客:https://blog.csdn.net/mr_lili_1986?type=blog

Iteye博客:        https://www.iteye.com/blog/user/mr-lili-1986-163-com

获取论文及源代码:请加微908925859

注:每个学校每个老师对论文的格式要求不一样,故本论文只供参考,本论文页数达到60页以上,字数在6000及以上。

目录

一、前言介绍:

二、功能设计:

三、功能实现:

四、库表设计:

五、关键代码:

六、论文参考:

七、其他案例: 

一、前言介绍:

信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对气象分析大屏可视化等问题,对气象进行研究分析,然后开发设计出气象分析大屏可视化系统以解决问题。

气象分析大屏可视化系统主要功能模块包括后台首页,系统用户(管理员),模块管理(日照时数,平均相对湿度,年降水量,平均气温,贵阳气象分析,气温对比),采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取MySQL作为后台数据的主要存储单元,采用Hadoop框架、python技术、Ajax技术进行业务系统的编码及其开发,实现了本系统的全部功能。本次报告,首先分析了研究的背景、作用、意义,为研究工作的合理性打下了基础。针对气象分析大屏可视化系统的各项需求以及技术问题进行分析,证明了系统的必要性和技术可行性,然后对设计系统需要使用的技术软件以及设计思想做了基本的介绍,最后来实现气象分析大屏可视化系统和部署运行使用它。

关键词:气象分析大屏可视化;Hadoop框架;MySQL数据库 ;分布式;大数据;流数据;

二、功能设计:

气象分析大屏可视化系统只要由管理员模块构成。

模块的功能都是根据先前完成的需求分析,并查阅相关资料后整理制作的。

综上所述,系统功能结构图如下图所示。

三、功能实现:

要由两部分组成,登录前的登录界面以及登录后的用户功能界面。登录界面,要求用户输入用户名和密码,当用户名和密码其中一个输入为空时,给出提示“用户名,密码不能为空”。获取用户名和密码后到数据库中查找,如果用户名存在,以及对应的密码正确,则登录成功,否则登录失败。登录失败后给出提示,并把焦点停在文本框中。登录成功后将该次会话的全局变量username设置为用户名。登录成功后进入会员的功能模块,主要有会员基本信息修改,已经发布商品信息管理,发布信息,和退出功能。退出功能是清除全局变量username的值,并跳回到首页。

登录流程图如下图所示。

登录界面:

系统用户模块的实现

用户登录/注册成功之后可以修改自己的基本信息。修改页面的表单中每一个input的name值都要与实体类中的参数相匹配,在用户点击修改页面的时候,如果改后用户名与数据库里面重复了,页面会提示该用户名已经存在了,否则通过Id来查询用户,并将用户的信息修改为表单提交的数据。

模块管理的实现

管理员登录系统后,可对模块管理中的日照时数,平均相对湿度,年降水量,平均气温,贵阳气象分析,气温对比等信息进行查询,重置,删除,添加等维护操作,可以导入数据或者下载导入的文档。如下图所示。

展示大屏的实现

展示大屏模块调用echarts.min.js初始化图表的样式和框架,首先要初始化类目参数和数量参数,本系统在日照时数,年降水量,平均气温等模块上使用了可视化图表,其的类目参数为日照时数,年降水量,平均气温等参数,从参数表里读取,遍历参数表中的数据,分别加入到类目数组和数量数组中,做好数据初始化准备,其次是用pythonScript开始画图,设置图的类型,设置图的标题,设置类目数,设置数量和可视化图表的尺寸,设置背景颜色,设置画图样式,调用画图函数,可视化图表就自动生成了。

展示大屏界面如下图所示。

四、库表设计:

五、关键代码:

  1. package com.qixia.hadoop;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.apache.hadoop.fs.FileSystem;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import java.io.IOException;
  8. import java.net.URI;
  9. import java.net.URISyntaxException;
  10. /**
  11. * @author:li
  12. * @date:2023/7/28
  13. * @descripion:
  14. */
  15. @Slf4j
  16. @Configuration
  17. public class HadoopConfig {
  18. @Value("${hdfs.hdfsPath}")
  19. private String hdfsPath;
  20. @Value("${hdfs.hdfsName}")
  21. private String hdfsName;
  22. @Bean
  23. public org.apache.hadoop.conf.Configuration getConfiguration(){
  24. org.apache.hadoop.conf.Configuration config = new org.apache.hadoop.conf.Configuration();
  25. config.set("fs.defaultFS",hdfsPath);
  26. return config;
  27. }
  28. @Bean
  29. public FileSystem getFileSystem(){
  30. FileSystem fileSystem=null;
  31. try {
  32. fileSystem= FileSystem.get(new URI(hdfsPath), getConfiguration(), hdfsName);
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. } catch (URISyntaxException e) {
  38. e.printStackTrace();
  39. }
  40. return fileSystem;
  41. }
  42. }
  1. package com.qixia.hadoop.hdfs;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.apache.hadoop.fs.*;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.util.StringUtils;
  7. import org.springframework.web.multipart.MultipartFile;
  8. import java.io.IOException;
  9. import java.util.*;
  10. /**
  11. * @author:li
  12. * @date:2023/7/31
  13. * @descripion:
  14. */
  15. @Service
  16. @Slf4j
  17. public class HDFSServiceImpl implements HDFSService{
  18. @Autowired
  19. private FileSystem fileSystem;
  20. @Override
  21. public boolean existFile(String path) {
  22. if (StringUtils.isEmpty(path)){
  23. return false;
  24. }
  25. Path src = new Path(path);
  26. try {
  27. return fileSystem.exists(src);
  28. } catch (IOException e) {
  29. log.error(e.getMessage());
  30. }
  31. return false;
  32. }
  33. @Override
  34. public List<Map<String, Object>> readCatalog(String path) {
  35. if (StringUtils.isEmpty(path)){
  36. return Collections.emptyList();
  37. }
  38. if (!existFile(path)){
  39. log.error("catalog is not exist!!");
  40. return Collections.emptyList();
  41. }
  42. Path src = new Path(path);
  43. FileStatus[] fileStatuses = null;
  44. try {
  45. fileStatuses = fileSystem.listStatus(src);
  46. } catch (IOException e) {
  47. log.error(e.getMessage());
  48. }
  49. List<Map<String, Object>> result = new ArrayList<>(fileStatuses.length);
  50. if (null != fileStatuses && 0 < fileStatuses.length) {
  51. for (FileStatus fileStatus : fileStatuses) {
  52. Map<String, Object> cataLogMap = new HashMap<>();
  53. cataLogMap.put("filePath", fileStatus.getPath());
  54. cataLogMap.put("fileStatus", fileStatus);
  55. result.add(cataLogMap);
  56. }
  57. }
  58. return result;
  59. }
  60. @Override
  61. public boolean createFile(String path, MultipartFile file) {
  62. boolean target = false;
  63. if (StringUtils.isEmpty(path)) {
  64. return false;
  65. }
  66. String fileName = file.getOriginalFilename();
  67. // String fileName = file.getName();
  68. Path newPath = new Path(path + "/" + fileName);
  69. FSDataOutputStream outputStream = null;
  70. try {
  71. outputStream = fileSystem.create(newPath);
  72. outputStream.write(file.getBytes());
  73. target = true;
  74. } catch (IOException e) {
  75. log.error(e.getMessage());
  76. } finally {
  77. if (null != outputStream) {
  78. try {
  79. outputStream.close();
  80. } catch (IOException e) {
  81. log.error(e.getMessage());
  82. }
  83. }
  84. }
  85. return target;
  86. }
  87. @Override
  88. public boolean uploadFile(String path, String uploadPath) {
  89. if (StringUtils.isEmpty(path) || StringUtils.isEmpty(uploadPath)) {
  90. return false;
  91. }
  92. Path clientPath = new Path(path);
  93. Path serverPath = new Path(uploadPath);
  94. try {
  95. fileSystem.copyFromLocalFile(false,clientPath,serverPath);
  96. return true;
  97. } catch (IOException e) {
  98. log.error(e.getMessage(), e);
  99. }
  100. return false;
  101. }
  102. @Override
  103. public boolean downloadFile(String path, String downloadPath) {
  104. if (StringUtils.isEmpty(path) || StringUtils.isEmpty(downloadPath)) {
  105. return false;
  106. }
  107. Path clienPath = new Path(path);
  108. Path targetPath = new Path(downloadPath);
  109. try {
  110. fileSystem.copyToLocalFile(false,clienPath, targetPath);
  111. return true;
  112. } catch (IOException e) {
  113. log.error(e.getMessage());
  114. }
  115. return false;
  116. }
  117. @Override
  118. public boolean deleteFile(String path) {
  119. boolean target = false;
  120. if (StringUtils.isEmpty(path)) {
  121. return false;
  122. }
  123. if (!existFile(path)) {
  124. return false;
  125. }
  126. Path src = new Path(path);
  127. try {
  128. target = fileSystem.deleteOnExit(src);
  129. } catch (IOException e) {
  130. log.error(e.getMessage());
  131. }
  132. return target;
  133. }
  134. @Override
  135. public BlockLocation[] getFileBlockLocations(String path) {
  136. if (StringUtils.isEmpty(path)) {
  137. return null;
  138. }
  139. if (!existFile(path)) {
  140. return null;
  141. }
  142. BlockLocation[] blocks = null;
  143. Path src = new Path(path);
  144. try{
  145. FileStatus fileStatus = fileSystem.getFileStatus(src);
  146. blocks = fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
  147. }catch(Exception e){
  148. log.error(e.getMessage());
  149. }
  150. return blocks;
  151. }
  152. @Override
  153. public String readFileContent(String path) {
  154. if (StringUtils.isEmpty(path)){
  155. return null;
  156. }
  157. if (!existFile(path)) {
  158. return null;
  159. }
  160. Path src = new Path(path);
  161. FSDataInputStream inputStream = null;
  162. StringBuilder sb = new StringBuilder();
  163. try {
  164. inputStream = fileSystem.open(src);
  165. String lineText = "";
  166. while ((lineText = inputStream.readLine()) != null) {
  167. sb.append(lineText);
  168. }
  169. } catch (IOException e) {
  170. log.error(e.getMessage());
  171. } finally {
  172. if (null != inputStream) {
  173. try {
  174. inputStream.close();
  175. } catch (IOException e) {
  176. log.error(e.getMessage());
  177. }
  178. }
  179. }
  180. return sb.toString();
  181. }
  182. }
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import importlib
  4. services_abspath_arr = []
  5. services_arr = []
  6. services_dir_ = os.getcwd() + "\\hadoop"
  7. # 遍历模块文件(绝对路径)加到services_abspath_arr数组
  8. # 选择服务函数
  9. def service_hadoop_select(str):
  10. for service_item in services_arr:
  11. if str.capitalize() == service_item.__class__.__name__:
  12. return service_item
  13. def foreach_file(path_name):
  14. for root, dirs, files in os.walk(path_name):
  15. for f in files:
  16. services_abspath_arr.append(os.path.join(root, f))
  17. # 读取模块
  18. # f:文件路径
  19. def loadModule(f):
  20. # 将f变成相对路径
  21. f = f.replace(services_dir_ + "\\", "").replace(".py", "").replace("\\", "/")
  22. # print(f)
  23. mod = importlib.import_module(
  24. "jobs."+f.replace("/", ".")
  25. )
  26. arr_1 = f.split("/")
  27. cs_service = getattr(mod, arr_1[len(arr_1) - 1].capitalize())
  28. # service的class形式
  29. service = cs_service()
  30. services_arr.append(service)
  31. foreach_file(services_dir_)
  32. for f in services_abspath_arr:
  33. if f.find(".pyc") == -1 and f.find("__init__") == -1:
  34. # print(f)
  35. loadModule(f)

 六、论文参考:

七、其他案例: 

 

  

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/798867
推荐阅读
相关标签
  

闽ICP备14008679号