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

news2024/11/15 20:01:39

目录

前言

一、后台接口研发

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";
	@Autowired
	private IProvinceService provinceService;
	@Autowired
	private IEarthquakeInfoService earthQuakeInfoService;
	@RequiresPermissions("eq:province:view")
    @GetMapping()
    public String map(){
        return prefix + "/map";
    }
	
    @RequiresPermissions("eq:province:list")
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(Province province){
        startPage();
        List<Province> list = provinceService.selectList(province);
        return getDataTable(list);
    }
    
    @RequiresPermissions("eq:province:geom")
    @GetMapping("/geojson/{id}")
    @ResponseBody
    public 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}")
    @ResponseBody
    public 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:3
	            lineWidth: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去发现更多有意思的分布情况吧。博文使用数据来源于互联网,如有错误,请指出,必将及时修正,欢迎在评论区留言指导,万分感谢。

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

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

相关文章

centos安装hadoop启动问题解决方案

1、出现了问题localhost: ERROR: JAVA_HOME is not set and could not be found. *解决方案尝试&#xff1a; 修改hadoop-env.sh&#xff08;在etc/hadoop&#xff09; sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh 将原本的JAVA_HOME 替换为绝对路径就可以了 #expo…

【C语言刷题】——初识位操作符

【C语言刷题】——初识位操作符 位操作符介绍题一、 不创建临时变量&#xff08;第三个变量&#xff09;&#xff0c;实现两个数的交换&#xff08;1&#xff09;法一&#xff08;2&#xff09;法二 题二、 求一个数存储在内存中的二进制中“一”的个数&#xff08;1&#xff0…

论文阅读:FCB-SwinV2 Transformer for Polyp Segmentation

这是对FCBFormer的改进&#xff0c;我的关于FCBFormer的论文阅读笔记&#xff1a;论文阅读FCN-Transformer Feature Fusion for PolypSegmentation-CSDN博客 1&#xff0c;整体结构 依然是一个双分支结构&#xff0c;总体结构如下&#xff1a; 其中一个是全卷积分支&#xff…

浏览器缓存 四种缓存分类 两种缓存类型

浏览器缓存 本文主要包含以下内容&#xff1a; 什么是浏览器缓存按照缓存位置分类 Service WorkerMemory CacheDisk CachePush Cache 按照缓存类型分类 强制缓存协商缓存 缓存读取规则浏览器行为 什么是浏览器缓存 在正式开始讲解浏览器缓存之前&#xff0c;我们先来回顾一…

【保姆级教程】JDK安装与环境变量配置

文章目录 第一步&#xff1a;下载JDK&#xff08;以1.8为例&#xff09;第二步&#xff1a;安装第三步&#xff1a;找到默认安装目录第四步&#xff1a;配置环境变量&#xff08;win10为例&#xff09; 大家可能会遇到的疑问&#xff1a;一个电脑可以安装多个版本的jdk没有问题…

头脑风暴法是什么?10个值得推荐的头脑风暴模板!

身处职场的你&#xff0c;想必对头脑风暴这个术语并不陌生&#xff0c;它可能是某个同事或者领导的口头禅&#xff0c;每当遇到需要给出方案的场景&#xff0c;头脑风暴或者“脑暴”就会从他们嘴里脱口而出&#xff0c;但你真的了解&#xff0c;头脑风暴是什么意思吗&#xff1…

力扣刷题日志-Day2 (力扣151、43、14)

151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开 思路&#xff1a;根据题目大意&#xff0c;空格之间的就是一个单词&#xff0c;所以我们需要利用…

Sui与数据平台ZettaBlock达成合作,为其公测提供数据

Sui一向以闪电般的速度、无限水平扩展著称&#xff0c;现已迅速成为DeFi活动的重要场所。近期&#xff0c;数据平台ZettaBlock宣布在其开创性的Web3数据平台发布中&#xff0c;选择Sui作为基础集成合作伙伴之一。在ZettaBlock的开放测试版发布之际&#xff0c;构建者和开发者将…

【JAVA】HashMap扩容性能影响及优化策略

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在软件开发中&#xff0c;HashMap是一种常用的数据结构&#xff0c;但在处理大量数据时&#xff0c;其扩容…

11、设计模式之享元模式(Flyweight)

一、什么是享元模式 享元模式是一种结构型的设计模式。它的主要目的是通过共享对象来减少系统种对象的数量&#xff0c;其本质就是缓存共享对象&#xff0c;降低内存消耗。 享元模式将需要重复使用的对象分为两个部分&#xff1a;内部状态和外部状态。 内部状态是不会变化的&…

进电子厂了,感触颇多...

作者&#xff1a;三哥 个人网站&#xff1a;https://j3code.cn 本文已收录到语雀&#xff1a;https://www.yuque.com/j3code/me-public-note/lpgzm6y2nv9iw8ec 是的&#xff0c;真进电子厂了&#xff0c;但主人公不是我。 虽然我不是主人公&#xff0c;但是我经历的过程是和主…

【2024-03-12】设计模式之模板模式的理解

实际应用场景&#xff1a;制作月饼 过程描述&#xff1a; 一开始&#xff0c;由人工制作月饼&#xff0c; 第一个&#xff1a;根据脑子里面月饼的形状&#xff0c;先涅出月饼的形状&#xff0c;然后放入面粉和馅料把开口合并起来。 第二个&#xff1a;根据脑子里面月饼的形状&…

短剧小程序系统:打造沉浸式短剧体验,开启短剧新纪元

随着移动互联网的迅猛发展&#xff0c;短剧作为一种新兴的内容形式&#xff0c;正逐渐受到广大用户的喜爱和追捧。为了满足用户对短剧内容的需求和观看体验的提升&#xff0c;短剧小程序系统应运而生&#xff0c;为用户带来了更加便捷、沉浸式的短剧观看体验。 短剧小程序系统…

如何在Linux本地搭建Tale网站并实现无公网ip远程访问

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale&#xff0c;Tale…

【Python】科研代码学习:八 FineTune PretrainedModel (用 trainer,用 script);LLM文本生成

【Python】科研代码学习&#xff1a;八 FineTune PretrainedModel [用 trainer&#xff0c;用 script] LLM文本生成 自己整理的 HF 库的核心关系图用 trainer 来微调一个预训练模型用 script 来做训练任务使用 LLM 做生成任务可能犯的错误&#xff0c;以及解决措施 自己整理的 …

8块硬盘故障的存储异常恢复案例一则

关键词 华为存储、硬盘域、LUN热备冗余、重构、预拷贝 oracle rac、多路径 There are many things that can not be broken&#xff01; 如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; 一、问题现象 近期遇到的一个案例&#xff0c;现象是一套oracl…

PXI8540高速数据采集卡

XI高速数据采集卡&#xff0c;PXI8540卡是一种基于PXI总线的模块化仪器&#xff0c;可使用PXI系统&#xff0c;在一个机箱内实现一个综合的测试系统&#xff0c;构成实验室、产品质量检测中心等各种领域的数据采集、波形分析和处理系统。也可构成工业生产过程监控系统。它的主要…

ThreeWayBranch 优化阅读笔记

1. 优化目的 通过重排三分支的 BB 块减少比较指令的执行次数 代码路径: bolt/lib/Passes/ThreeWayBranch.cpp2. 效果 优化前&#xff1a; 注&#xff1a; 黄色数字表示BB块编号&#xff0c; 紫色表示该分支跳转的次数&#xff0c;绿色是代码里BB块的变量名 ThreeWayBranc…

P6327 区间加区间 sin 和 (线段树+数学)

传送门https://www.luogu.com.cn/problem/P6327 比较板子的一题&#xff0c;主要考察公式 //sin(ax)sinxcosasinacosx //cos(ax)cosacosx-sinasinx 直接贴代码吧 // Problem: // P6327 区间加区间 sin 和 // // Contest: Luogu // URL: https://www.luogu.com.cn/pr…