基于SpringBoot和PotsGIS的各省地震震发可视化分析

2024-03-11 22:12

本文主要是介绍基于SpringBoot和PotsGIS的各省地震震发可视化分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

一、后台接口研发

1、控制层实现

2、Mapper访问层

3、空间查询分析

 二、前端可视化展示

1、主体地图定义        

2、行政区划列表定义

3、行政区划定位

三、数据分析

1、北京市

2、广东省

3、青海省

 4、湖南省

总结


前言

        在之前的博文中,我们对全球地震信息进行了可视化展示。地震对人类的生命财产安全造成了严重的威胁,但目前又缺乏科学准确的预测。在无法准确预测的前提下,我们对现今发生的地震信息结合我国的行政区划进行统一展示。目前采集的数据是截止到2023年12月6日的。2023年12月6日以后的,暂时没有采集。

        本文使用SpringBoot框架进行开发,将深度分析全国各省的地震震发情况,按照省级行政区划的方式进行空间统计分析,空间数据库依然采用我们熟悉的PostGIS数据库。通过本文可以对全国各省的地震分布有一个大致的了解,快来看看你所在省份是否是地震高发区呢。跟着本文一起来看看吧。

一、后台接口研发

        本文后台采用SpringBoot开发框架,数据访问层采用Mybatis-Plus插件。下面将按照MVC开发模式对各层进行设计和实现。

1、控制层实现

        控制层主要提供三个方法,第一个方法是跳转到具体的地图展示页面,第二个方法是根据行政区划code查询地震信息列表,第三个方法是查询行政区划的geojson边界数据。关键代码如下:

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.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.Province;
import com.yelang.project.extend.earthquake.service.IEarthquakeInfoService;
import com.yelang.project.extend.earthquake.service.IProvinceService;
@Controller
@RequestMapping("/eq/province")
public class ProvinceController extends BaseController{private String prefix = "earthquake/province";@Autowiredprivate IProvinceService provinceService;@Autowiredprivate IEarthquakeInfoService earthQuakeInfoService;@RequiresPermissions("eq:province:view")@GetMapping()public String map(){return prefix + "/map";}@RequiresPermissions("eq:province:list")@PostMapping("/list")@ResponseBodypublic TableDataInfo list(Province province){startPage();List<Province> list = provinceService.selectList(province);return getDataTable(list);}@RequiresPermissions("eq:province:geom")@GetMapping("/geojson/{id}")@ResponseBodypublic AjaxResult getGeojson(@PathVariable("id") Long id){Province province = provinceService.findGeoJsonById(id, null);return AjaxResult.success().put("data", province.getGeomJson());}@RequiresPermissions("eq:province:statview")@GetMapping("/statview")public String statview(){return prefix + "/statview";}@RequiresPermissions("eq:province:quakelist")@GetMapping("/quakelist/{code}")@ResponseBodypublic AjaxResult quakelist(@PathVariable("code") String code){List<EarthquakeInfo> list = earthQuakeInfoService.findListByPcode(code);AjaxResult ar = AjaxResult.success();ar.put("data", list);return ar;}}

2、Mapper访问层

        系统的业务层比较简单,只是将控制层的参数传递到数据库中。因此这里不对业务层代码进行深度介绍,由于Mapper访问层是对空间数据库的访问,有必要在此进行一些介绍,让广大朋友知道空间分析函数的基本使用方法。

package com.yelang.project.extend.earthquake.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yelang.project.extend.earthquake.domain.EarthquakeInfo;/*** 地震信息数据操作接口* @author wuzuhu**/
public interface EarthQuakeInfoMapper extends BaseMapper<EarthquakeInfo>{static final String FIND_LISTBY_PCODE = "<script>"+ "select t.* from biz_province p,biz_earthquake_info t where p.code = #{code} "+ "and _st_contains(p.geom, ST_GeomFromText(format('point(%s %s)',t.eq_lng,t.eq_lat),4326)) "+ "</script>";/*** 根据省级行政区划查询对应的地震信息发生列表* @param code 省份编码* @return 对应的地震信息列表*/@Select(FIND_LISTBY_PCODE)List<EarthquakeInfo> findListByPcode(@Param("code")String code);
}

3、空间查询分析

        在本文的需求中,我们需要对省级行政区划内的地震震发信息进行可视化统计,需要使用到st_contains函数。这里需要判断点是否在面数据中,使用数据库客户端来验证一下:

select t.* from biz_province p,biz_earthquake_info t where p.code = '110000'
and st_contains(p.geom, ST_GeomFromText(format('point(%s %s)',t.eq_lng,t.eq_lat),4326));

        其中,110000是北京市的行政编号,通过行政编码来进行行政区划的过滤。执行上述sql语句后可以看到,北京市的震发数量是18条数据。

 二、前端可视化展示

        前端空间数据展示使用Leaflet组件展示,静态标注使用Leaflet.canvaslabel.js,图例组件采用leaflet.legend.js。下面来看看前端可视化代码的具体实现过程。

1、主体地图定义        

//矢量文本标签渲染器var canvasLabel = new L.CanvasLabel({defaultLabelStyle: {collisionFlg: true,scale: 1.1,//strokeStyle: "#000",strokeStyle: "red",fillStyle: "#fff",//lineWidth:3lineWidth:15}});$("#mapid").height($(window).height());//动态设置高度L.CRS.CustomEPSG4326 = L.extend({}, L.CRS.Earth, {code: 'EPSG:4326',projection: L.Projection.LonLat,transformation: new L.Transformation(1 / 180, 1, -1 / 180, 0.5),scale: function (zoom) {return 256 * Math.pow(2, zoom - 1);}});var showGroup = L.layerGroup();var quakeGroup = L.layerGroup();//限制地图的拖动范围是正负90到正负180,这样才合理。var maxBounds = L.latLngBounds(L.latLng(-90, -180), L.latLng(90, 180)); //构建视图限制范围 第一个参数是左上角经纬度 第二个参数是右下点经纬度var mymap = L.map('mapid',{renderer: canvasLabel,crs:L.CRS.CustomEPSG4326,maxBounds:maxBounds,attributionControl:false}).setView([29.052934, 104.0625], 5);var showLayerGroup =L.featureGroup().addTo(mymap);
L.tileLayer('http://192.168.31.64:8086/data/basemap_nowater/1_10_tms/{z}/{x}/{y}.jpg', {minZoom:1,maxZoom: 16,id: 'baseMap-nowater',tileSize: 256,zoomOffset: -1}).addTo(mymap);//标签L.tileLayer('http://192.168.31.64:8086/data/basemap_nowater/1-10label/{z}/{x}/{y}.png', {maxZoom: 10,minZoom:1,id: 'mapbox/label',tileSize: 256,zoomOffset: -1}).addTo(mymap);

2、行政区划列表定义

function initSidebar(){//初始化sidebar页面var sidebar = L.control.sidebar('sidebar', {position: 'right'}).addTo(mymap);//默认sidebar打开,并展示一个tab页sidebar.open();$("#xz_info").addClass("active");$("#home").addClass("active");//初始化行政区划表格initHnTownTable();}function initHnTownTable(){var options = {url: prefix + "/list",createUrl: prefix + "/add",updateUrl: prefix + "/edit/{id}",modalName: "乡镇行政区划",columns: [{field: 'id',title: '',visible: false},{field: 'name',title: '省份'},{field: 'type',title: '类别'},{title: '操作',align: 'center',formatter: function(value, row, index) {var actions = [];actions.push('<a class="btn btn-success btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="previewTown(\'' + row.id + '\',\''+row.code+'\')"><i class="fa fa-dot-circle-o"></i>查看</a>');return actions.join('');}}]};$.table.init(options);}

3、行政区划定位

        在地图右侧列表中,点击定位按钮,可以展示当前省级行政区域的空间范围,同时可以查看对应行政区划范围内的地震震发情况。

 function initEarthInfo(code){$.ajax({type: "get",url: prefix + "/quakelist/"+ code,data: {},success: function(rsData) {quakeGroup.clearLayers();var earthData = rsData.data;for (var i = 0; i < earthData.length; i++) {var info = earthData[i];var eqLevel = info.eqLevel;var strokeStyleSet = "green";if(parseFloat(eqLevel) > 3.5 && parseFloat(eqLevel) <= 5.0){strokeStyleSet = "yellow";}if(parseFloat(eqLevel) > 5.0){strokeStyleSet = "red";}var marker = L.circleMarker(new L.LatLng(info.eqLat, info.eqLng), {radius: 8,labelStyle: {text: info.eqLevel+'级'+info.eqLocation,rotation: 0,zIndex: i,strokeStyle :strokeStyleSet}});var content = "<strong>发震时间:</strong>"+info.eqTime + "<br/><strong>震中位置:</strong>"+info.eqLocation;content += "<br/><strong>震源深度(千米):</strong>"+info.eqDepth + "<br/><strong>震级:</strong>"+info.eqLevel;marker.bindPopup(content);quakeGroup.addLayer(marker);}mymap.addLayer(quakeGroup);}});}

三、数据分析

        经过后台相关接口的开发,以及前端webgis的界面开发,基本已经完成整个各省行政区划内震发数据的可视化过程,下面结合各省份进行分别说明。由于省份信息众多,这里不全部展开,分别按照区域进行选取一些典型省份进行数据分型说明。

1、北京市

        北京市是国家首都,首先来看一下北京市的震发情况,点击操作栏中的查看按钮,地图会自动定位到北京市的行政区划范围,同时将北京市内的所有震发点进行展示。

 可以看到,北京的地震震发情况比较少,而且震级也不高。一共是18次(以数据库中发布的地震信息为准,仅供参考),最高的震级是3.6级。整体来说,安全系数还是比较高。

2、广东省

        广东省是我们国家的经济大省,也是南方的城市。来看一下南方城市的地震震发情况如何,首先来看一下总体情况。

         截止2023年12月6日,广东的地震次数是61次,最大的震级是4.3级。震级不是很高,还算是比较小的。可以看到在省会附近地震震发很少。

3、青海省

        看完北部的省份和南方的城市,再来看一下西部的城市,这里选取青海省作为示例。相信从地图上就可以一眼直观的看到地震震发较多。同时通过图例可以知道,红色是大于5级的地震,在青海省超过5级的地震就有好几个。最大是青海果洛州玛多县的7.4级地震

        通过在后台查询,青海省的地震次数有466次,比南方和北方省份多了不少。 通过下图可以看到,这附近的大地震还不少。

 4、湖南省

        最后来看一下中部省份湖南省的地震情况。地震震发情况如下:

         可以看到,作为中部省份,湖南省的地震情况是非常少的。有一些是矿震引起的,不是地质运动引起的。在数据中可以查到一共有8条地震信息,其中最大的震级是3.4级,发生在湖南娄底市双峰县。

        通过gis发现了一些时空分布的规律,当我们把地震活动和空间分析结合在一起,就可以发现,在我们国家的西部地区,也就是喜马拉雅一带,地震活动比较频繁,这也与世界地震带分布有对应关系。

总结

        以上就是本文的主要内容,本文使用SpringBoot框架进行开发,将深度分析全国各省的地震震发情况,按照省级行政区划的方式进行空间统计分析,空间数据库依然采用我们熟悉的PostGIS数据库。通过本文可以对全国各省的地震分布有一个大致的了解,快来看看你所在省份是否是地震高发区呢?通过gis可视化,对我们理解地理分布和活动规律有更多的参考和指导。让我们一起用gis去发现更多有意思的分布情况吧。博文使用数据来源于互联网,如有错误,请指出,必将及时修正,欢迎在评论区留言指导,万分感谢。

这篇关于基于SpringBoot和PotsGIS的各省地震震发可视化分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/799243

相关文章

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用