基于SpringBoot和Leaflet的地震台网信息预警可视化

目录

前言

一、后台管理设计与实现

1、Model层

2、业务层

3、控制层

二、前端预警可视化设计与实现

1、网页结构

2、数据绑定

三、效果展示

总结


前言

        在之前的几篇博客中,我们讲解了如何在Leaflet中进行预警信息提示效果,以及基于XxlCrawler进行中国地震台网信息的采集、入库以及如何进行反爬处理。博文目录如下,感兴趣的朋友可以点击标题进入:

序号博客地址
1基于Leaflet.js的Marker闪烁特效的实现-模拟预警
2基于Java的XxlCrawler网络信息爬取实战-以中国地震台网为例
3使用SpringBoot将中国地震台网数据保存PostGIS数据库实践
4在Java中使用XxlCrawler时防止被反爬的几种方式

        在实际应用中,我们不仅需要将数据及时的采集回来,同时也需要实现对数据进行可视化。不仅对二维数据的列表展示,同时还需要对数据进行空间可视化。

        本文即对采集回来的中国地震台网数据进行预警可视化进行深入讲解。首先讲解后台的代码和功能设计,然后基于L.Icon.Pulse进行地震预警展示,最后展示预警可视化效果。地址灾害不可预测,但是我们在灾后应该快速提供应急救援,将尽量减少人民群众的生命财产损失。如果您目前也有类似的需求,不妨来博文中指导一二。

一、后台管理设计与实现

        后台管理使用SpringBoot框架来开发,数据库访问层依然采用熟悉的Mybatis-Plus框架。本小节将主要基于MVC结构介绍后台的相关设计与实现。数据后台提供数据访问支持,为前台的数据展示提供有效支撑。

1、Model层

        model层包含地震台网数据的实体类,在之前的博客中有过介绍,这里也将主要的代码分享出来。让大家在熟悉这部分代码时,不至于有不适感:

package com.yelang.project.extend.earthquake.domain.crawler;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.google.gson.annotations.SerializedName;
import com.yelang.framework.handler.PgGeometryTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@TableName(value ="biz_ceic_earthquake",autoResultMap = true)
public class CeicEarthquake implements Serializable{private static final long serialVersionUID = -1212153879708670015L;@TableId(value="pk_id")private Long pkId;//主键@SerializedName("AUTO_FLAG")@TableField(value="auto_flag")private String autoFlag;@SerializedName("CATA_ID")@TableField(value="cata_id")private String cataId;@SerializedName("CATA_TYPE")@TableField(value="cata_type")private String cataType;@SerializedName("EPI_DEPTH")@TableField(value="epi_depth")private BigDecimal epiDepth = new BigDecimal("0.0");@SerializedName("EPI_LAT")@TableField(value="epi_lat")private String epiLat;//纬度@SerializedName("EPI_LON")@TableField(value="epi_lon")private String epiLon;@SerializedName("EQ_CATA_TYPE")@TableField(value="eq_cata_type")private String eqCataType;@SerializedName("EQ_TYPE")@TableField(value="eq_type")private String eqType;@SerializedName("IS_DEL")@TableField(value="is_del")private String isDel;@SerializedName("LOCATION_C")@TableField(value="location_c")private String locationC;@SerializedName("LOCATION_S")@TableField(value="location_s")private String locationS;@SerializedName("LOC_STN")@TableField(value="loc_stn")private String locStn;@SerializedName("M")@TableField(value="m")private String m;@SerializedName("M_MB")@TableField(value="mmb")private String mmb;@SerializedName("M_MB2")@TableField(value="mmb2")private String mmb2;@SerializedName("M_ML")@TableField(value="mml")private String mml;@SerializedName("M_MS")@TableField(value="mms")private String mms;@SerializedName("M_MS7")@TableField(value="mms7")private String mms7;@SerializedName("NEW_DID")@TableField(value="new_did")private String newDid;@SerializedName("O_TIME")@TableField(value="o_time")private Date oTime;@SerializedName("O_TIME_FRA")@TableField(value="o_time_fra")private String oTimeFra;@SerializedName("SAVE_TIME")@TableField(value="save_time")private Date saveTime;@SerializedName("SUM_STN")@TableField(value="sum_stn")private String sumStn;@SerializedName("SYNC_TIME")@TableField(value="sync_time")private Date syncTime;@SerializedName("id")@TableField(value="epi_id")private String epiId;@TableField(typeHandler = PgGeometryTypeHandler.class)private String geom;@TableField(exist=false)private String geomJson;
}

        Maper层没有其它特殊的业务,仅实现了基础的BaseMapper,方法体内没有扩展业务。在此不再赘述。 

2、业务层

        业务层作为控制层和模型层的中间层,主要负责数据的传递以及业务逻辑的处理。在地震可视化中,需要扩展的方法是需要提供按照震中位置和震级进行模糊 查询,同时提供按照地震主键查询地震详情的接口。在进行地震预警时,通过ajax获取详情实现地震位置的可视化。

根据震中位置和震级模糊查询的核心方法如下:

@Override
public List<CeicEarthquake> getList(CeicEarthquake earthquake) {QueryWrapper<CeicEarthquake> queryWrapper = new QueryWrapper<CeicEarthquake>();if (StringUtils.isNotBlank(earthquake.getLocationC())) {queryWrapper.like("location_c", earthquake.getLocationC());}if (StringUtils.isNotBlank(earthquake.getM())) {queryWrapper.eq("m", earthquake.getM());}queryWrapper.orderByDesc("o_time");return this.baseMapper.selectList(queryWrapper);
}

3、控制层

        控制层是对接前台,接收前台请求,调用业务层的业务方法,查询相关数据或者保存相关数据的入口。前端地图展示和列表展示都是通过控制层实现。在控制层中,主要实现以下三个方法:

序号方法说明
1 public String index()跳转到首页
2public TableDataInfo list(CeicEarthquake earthquake)根据震中位置和震级查询信息
3public AjaxResult detail(@PathVariable("pkId")Long pkId)根据数据ID查询数据详情

        关键代码如下:

package com.yelang.project.extend.earthquake.controller;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.yelang.framework.aspectj.lang.annotation.Log;
import com.yelang.framework.aspectj.lang.enums.BusinessType;
import com.yelang.framework.web.controller.BaseController;
import com.yelang.framework.web.domain.AjaxResult;
import com.yelang.framework.web.page.TableDataInfo;
import com.yelang.project.extend.earthquake.domain.EarthquakeInfo;
import com.yelang.project.extend.earthquake.domain.crawler.CeicEarthquake;
import com.yelang.project.extend.earthquake.service.ICeicEarthquakeService;@Controller
@RequestMapping("/ceiceq/info")
public class CeicEarthquakeInfoController extends BaseController{private String prefix = "ceicearthquake/info";@Autowiredprivate ICeicEarthquakeService ceicEarthQuakeService;@RequiresPermissions("ceiceq:info:view")@GetMapping()public String index(){return prefix + "/index";}@RequiresPermissions("ceiceq:info:list")@PostMapping("/list")@ResponseBodypublic TableDataInfo list(CeicEarthquake earthquake){startPage();List<CeicEarthquake> list = ceicEarthQuakeService.getList(earthquake);return getDataTable(list);}@PostMapping("/detail/{pkId}")@ResponseBodypublic AjaxResult detail(@PathVariable("pkId")Long pkId){AjaxResult ar = AjaxResult.success();ar.put("data", ceicEarthQuakeService.getById(pkId));return ar;}
}

        到此,我们已经将相关的服务接口开发完成,同时完成了对数据库数据的访问和调用。在完成后端的应用开发之后,我们来进行前端可视化的开发。

二、前端预警可视化设计与实现

        为了在前端方便的对地震信息进行综合展示,我们计划将数据和底图使用Leaflet来进行集成。使用之前介绍过的预警信息实现方式。本小节主要是面向前端的设计与实现。

1、网页结构

        为了比较直观的展示信息,同时将列表和地图定位技术进行结合。我们决定采用栅格布局的模式,台网地震信息和地图分别占50%。在html的框架中大致采用如下的结构来展示:

<div class="row"><div class="col-sm-6"><div class="col-sm-12 search-collapse" style="display: none;"><form id="formId"><div class="select-list"><ul><li><label>发震位置:</label><input type="text" name="locationC"/></li><li><label>震级:</label><input type="text" name="m"/></li><li><a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a><a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a></li></ul></div></form></div><div class="btn-group-sm" id="toolbar" role="group"><a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="eq:info:export"><i class="fa fa-download"></i> 导出</a></div><div class="col-sm-12 select-table table-striped"><table id="bootstrap-table"></table></div></div><div class="col-sm-6"><!-- leaflet map元素 --><div id="mapid" style="width: 100%;"></div></div></div>

2、数据绑定

        在定义好网页框架结构之后,我们需要将列表和后台的接口进行对接,同时将地图和底图进行绑定。关于如何在Leaflet中进行底图绑定,应该很多朋友都比较了解了。这里不再进行过多的说明。这里仅说明如何进行table的绑定和预警可视化。

        table绑定:为了将地震信息,如震发地点、震级、地震深度、经纬度等信息在列表中展示出来。这里采用layui的table组件。数据绑定的关键代码如下:

var options = {url: prefix + "/list",exportUrl: prefix + "/export",modalName: "台网地震信息",columns: [{field: 'id',title: '',visible: false},{field: 'locationC',title: '震中位置',formatter: function(value, row, index) {return parseFloat(row.m) >= '6.0' ? "<font color='red'>"+ value +"</font>" : value;}},{field: 'epiLon',title: '经度',formatter: function(value, row, index) {return parseFloat(row.m) >= '6.0' ? "<font color='red'>"+ value +"</font>" : value;}},{field: 'epiLat',title: '纬度',formatter: function(value, row, index) {return parseFloat(row.m) >= '6.0' ? "<font color='red'>"+ value +"</font>" : value;}},{field: 'm',title: '震级',formatter: function(value, row, index) {return parseFloat(row.m) >= '6.0' ? "<font color='red'>"+ value +"</font>" : value;}},{field: 'epiDepth',title: '深度',formatter: function(value, row, index) {return parseFloat(row.m) >= '6.0' ? "<font color='red'>"+ value +"</font>" : value;}},{field: 'otime',title: '发震时间',formatter: function(value, row, index) {return parseFloat(row.m) >= '6.0' ? "<font color='red'>"+ value +"</font>" : value;}},{title: '操作',align: 'center',formatter: function(value, row, index) {var actions = [];actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="preview(\'' + row.pkId + '\')"><i class="fa fa-send-o"></i></a> ');return actions.join('');}}]};$.table.init(options);

        预警绑定:预警信息绑定是参考中国地震台网的信息,在列表中点击地震信息,在右边的地图中可以直接定位,同时点击预警点,可以把相应的主要信息以弹窗的形式展示出来。这里的主要逻辑就是通过ajax去后台查询台网地震信息详情。然后根据经纬度绑定marker,同时将marker在地图上进行展示。

function preview(pkId){$.ajax({  type:"post",  url:prefix + "/detail/" + pkId,  dataType:"json",  cache:false,processData:false,success:function(result){if(result.code == web_status.SUCCESS){var eqInfo = result.data;var content = "<strong>发震时间:</strong>"+eqInfo.otime + "<br/><strong>震中位置:</strong>"+eqInfo.locationC;content += "<br/><strong>震源深度(千米):</strong>"+eqInfo.epiDepth + "<br/><strong>震级:</strong>"+eqInfo.m;var marker = L.marker([eqInfo.epiLat, eqInfo.epiLon],{icon: L.icon.pulse({iconSize:[25,25],color:'#e50b3d',fillColor:"#e50b3d"})}).bindPopup(content).addTo(mymap);showLayerGroup.clearLayers();showLayerGroup.addLayer(marker);mymap.setView(showLayerGroup.getBounds().getCenter(),8);//同时设置中心位置和级别}},error:function(){$.modal.alertWarning("获取信息失败");}});}

        至此,前端的主要代码也编写完毕,最后我们将工程启动起来,然后进行前后台的联调。 展示最终的效果。

三、效果展示

        本小节主要展示基于SpringBoot和Leaflet的地震台网信息预警可视化效果。从列表搜索到地图定位,让大家对开发出来的效果有一个直观的感受。同时为了将大于(含)6级的地震信息进行醒目的提示,在列表中我们对这些数据进行标红。

默认系统功能界面

        默认情况下,列表的搜索功能是关闭的,如果您在使用过程中需要进行数据检索,可以点击搜索按钮打开检索栏。

系统检索支持页面

         在系统中,点击操作按钮栏中的定位功能。会自动实现当前地震信息在地图上的定位。

地震地图定位示意图 

台湾花莲某地地震 

青岛某地地震示意图 

四川某地地震示意图 

总结

        以上就是本文的主要内容, 本文即对采集回来的中国地震台网数据进行预警可视化进行深入讲解。首先讲解后台的代码和功能设计,然后基于L.Icon.Pulse进行地震预警展示,最后展示预警可视化效果。地址灾害不可预测,但是我们在灾后应该快速提供应急救援,将尽量减少人民群众的生命财产损失。行文仓促,定有不足之处,不管是批评或者指导,不妨来博文中指导一二,不胜感激。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件无线电系列——宽带中频带通采样(超外差接收体制)和射频直接带通采样定理(盲区采样定理)

本节目录 一、宽带中频带通采样(超外差接收体制) 1、宽带中频带通采样的原理 2、宽带中频带通采样的设计示例 二、射频直接带通采样定理 1、整带采样 2、射频直接带通采样本节内容 一、宽带中频带通采样(超外差接收体制) 1、宽带中频带通采样的原理 宽带中频带通采样(超外差接…

wstunnel (websocket模式ssh)

接上一篇 修改客户端运行参数 ssh -o ProxyCommand"./wstunnel client -L stdio://%h:%p ws://192.168.254.131:8080" 127.0.0.1 其中127.0.0.1为服务端的本地ssh访问&#xff0c;可以修改为通过服务端访问其他设备的ssh服务。例如&#xff1a; ssh -o ProxyComma…

Python框架:Django和Flask介绍应用场景和优缺点

Python框架&#xff1a;Django和Flask介绍应用场景和优缺点 Django 和 Flask 都是 Python 语言的 Web 框架&#xff0c;它们用于构建 Web 应用程序。以下是它们的基本介绍、使用方式、优点、缺点以及适用场景的对比。 Django 是什么 Django 是一个高级的 Web 框架&#xff0c…

三 SpringMVC返回数据以及RESTFul设计标准

SpringMVC返回数据 一 控制页面跳转 1.1 快速使用 开发模式回顾在 Web 开发中&#xff0c;有两种主要的开发模式&#xff1a;前后端分离和混合开发。前后端分离模式&#xff1a;[重点]指将前端的界面和后端的业务逻辑通过接口分离开发的一种方式。开发人员使用不同的技术栈和…

【Ajax-异步刷新技术】什么是Ajax之续章 !

文章目录 Ajax第五章1、layui的后台布局2、layui的数据表格1、在jsp页面中编写table2、在页面中引入文件3、编写代码4、参照文档修改表格属性 **3、最终效果** 第六章1、继续第五章内容1、layui组件2、添加数据3、查看数据4、修改数据5、删除数据 2、批量删除核心 3、数据表格重…

橡胶硫化机的单片机控制

/*** 2020 10 16 21:21硫化机控制程序 ***/ /****L971 CODE5035*********************/ #include <REG52.H> #include <intrins.h> #include <string.h> #include …

测试的分类(3)

目录 按照测试阶段测试 系统测试 冒烟测试和回归测试的区别 验收测试 单元测试, 集成测试, 系统测试, 回归测试之间的关系 是否按手工进行测试 手工测试 自动化测试 自动化测试和手工测试的优缺点 自动化测试优点 自动化测试缺点 手工测试优点 手工测试缺点 按照…

Python基础:【习题系列】列表、元组、字典和集合

在Python中,用于创建空列表的语法是什么?( A ) A.[] B.() C.{} D.None 答案:A 难易程度:易 答案解析:在Python中,空列表可以通过空方括号[]来创建。 知识点:列表;Python数据结构 在Python中,以下哪个方法用于向列表添加元素?( B ) A.insert B.append C.ad…

【SpringCloud】LoadBalance负载均衡服务调用快速入门

【SpringCloud】LoadBalance负载均衡服务调用快速入门 文章目录 【SpringCloud】LoadBalance负载均衡服务调用快速入门1. 概述2. 引入依赖3. 配置、验证3.1 配置3.2 验证 1. 概述 官网地址&#xff1a;点击跳转 Spring Cloud LoadBalancer 是由 SpringCloud 官方提供的一个开…

MemFire案例-政务应急物联网实时监测预警项目

客户背景 党的十八大以来&#xff0c;中央多次就应急管理工作做出重要指示&#xff1a;要求坚持以防为主、防抗救相结合&#xff0c;全面提升综合防灾能力&#xff1b;坚持生命至上、安全第一&#xff0c;完善安全生产责任制&#xff0c;坚决遏制重特大安全事故。 面对新形势…

部署zookeeper+kafka

目录 一、二进制安装 1.安装jdk &#xff08;1&#xff09;yum 安装 &#xff08;2&#xff09;二进制安装 2.部署 zookeeper 3.部署kafka 01.安装 02.常用命令 03.示例 创建topic 创建 Kafka 生产者 创建Kafka消费者 运行示例 二、 docker 安装 1.搭建zookeepe…

linux环境下的MySQL UDF提权

linux环境下的MySQL UDF提权 ##1. 背景介绍 ###UDF UDF&#xff08;user defined function&#xff09;用户自定义函数,是MySQL的一个扩展接口&#xff0c;称为用户自定义函数,是用来拓展MySQL的技术手段&#xff0c;用户通过自定义函数来实现在MySQL中无法实现的功能。文件…

LINUX基础培训三十之理论基础知识自测题(附答案)

一、单选题(50题) 1. Linux是一套类( )操作系统。 A、 POSIX B、 BSD C、 WINDOWS D、 UNIX 2. Linux系统中,所提供的安装软件包,默认格式为( )。 A、 .tar B、.tar.gz C、.rpm D、 .zip 3. Linux系统中,以下哪个是管道符( )。 A、| B、> …

Node.js -- 模块化

文章目录 1. 模块化介绍2. 模块化初体验3. 模块暴露数据4. 导入文件(夹)模块5. 导入模块的基本流程6. CommonJS 规范 这里是引用 1. 模块化介绍 之前我们所编写的文件都是单个文件&#xff0c;这就会出现一些问题&#xff1a; 变量不能重复命名&#xff1b;代码复用性差&…

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024)

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024) 会议简介 我们诚挚邀请您参加2024年大数据应用、智能控制和软件工程国际会议&#xff08;BDAICSE2024&#xff09;。这次会议将在美丽的长沙市举行。 本次大会旨在汇聚全球大数据应用、智能控制、软件工程等领…

【华为OD机试】生成哈夫曼树【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。 请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 …

云LIS系统概述JavaScript+前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS&#xff08;云实验室信息管理系统&#xff09;是一种结合了计算机网络化信息系统的技术&#xff0c;它无缝嵌入到云HIS&#xff08;医院信息系统&#xff09;中&#xff0c;用于连…

[iOS]CocoaPods安装和使用

1.了解brew、rvm、ruby、gem、cocaspods之间的关系 在 macOS 环境中&#xff0c;Brew、RVM、Ruby、Gem 和 CocoaPods 之间存在以下关系&#xff1a; Homebrew (Brew)&#xff1a;Homebrew 是 macOS 上的包管理器&#xff0c;用于安装和管理各种开源软件包。它使您能够轻松地从…

信息系统项目管理师0069:数据运维(5信息系统工程—5.2数据工程—5.2.3数据运维)

点击查看专栏目录 文章目录 5.2.3数据运维1.数据存储2.数据备份3.数据容灾4.数据质量评价与控制记忆要点总结5.2.3数据运维 数据开发利用的前提是通过合适的方式将数据保存到存储介质上,并能保证有效的访问,还要通过数据备份和容灾手段,保证数据的高可用性。数据质量管理是在…

Pytorch实用教程:Pytorch的nn.LSTM中参数的含义

文章目录 基本组成关键特性使用`nn.LSTM`的基本步骤注意事项Pytorch的nn.LSTM中参数的含义示例课外分享PyTorch的nn.LSTM模块是一个用于构建长短期记忆(LSTM)网络的类,它是一种特殊类型的循环神经网络(RNN),能够学习序列数据中的长期依赖关系。 LSTM网络被广泛用于时间序…