基于SpringBoot和PostGIS的应急运输事件影响分析-以1.31侧翻事故为例

目录

前言

一、技术实现路径

1、需要使用的数据

2、空间分析方法

二、相关模块设计与实现

1、运输路线重现开发

2、事故点影响范围实现

3、WebGIS可视化实现

三、讨论

1、界面结果展示

2、影响范围分析

四、总结


前言

        在交通运输发达的当今社会,应急运输事件的发生对社会的稳定和人民的生命财产安全带来了诸多挑战。如何及时、准确地分析此类事件的影响,为应急决策提供有力支持,成为了亟待解决的问题。而 2025 年 1 月 31 日发生在湖南永州零陵区的罐车侧翻事故,更是为我们敲响了警钟,也为我们提供了一个典型案例来展开深入研究。

        此次事故中,车牌为陕 E·F5115(挂车牌为陕 E·265C 挂)的过境罐车在零陵区康济大道和朝阳大道交会处发生侧翻,致使车内装载的 33.5 吨粗苯部分泄漏。事故幸未造成人员伤亡,但粗苯作为一种有毒有害物质,其泄漏引发了严重的环境风险,可能对周边的水资源、土壤以及居民健康造成严重影响。

        在对此次事故的影响分析中,SpringBoot 和 PostGIS 的结合应用展现出了独特的优势。SpringBoot 作为一个开源的 Java 开发框架,具有开发简单、快速、高效等特点,能够为我们搭建稳定、可靠的后端服务。PostGIS 则是 PostgreSQL 的空间数据库扩展,可以高效地处理地理空间数据,实现空间查询、分析等功能。通过 SpringBoot 和 PostGIS 的协同工作,我们可以将事故现场的地理信息、车辆运输数据、环境监测数据等进行整合与分析,直观地呈现事故的影响范围和程度,为应急救援、环境污染治理以及后续的事故调查等工作提供科学依据。

        接下来,本文将详细介绍基于 SpringBoot 和 PostGIS 的应急运输事件影响分析的具体方法和实践过程,深入剖析 1.31 侧翻事故中的数据采集、处理、分析以及可视化展示等各个环节,探讨该技术方案在应急事件中的应用价值和局限性,并对未来的发展方向进行展望,以期为提升我国应急管理水平和应急处置能力贡献一份力量。

一、技术实现路径

        本节将重点介绍本次分析中所需要使用到的相关数据,比如天地图资源、路网数据、风景区点数据、居民点数据、机场数据等。其次介绍具体的空间分析方法。

1、需要使用的数据

序号数据内容说明
1运输路线规划使用天地图的路径规划服务
2路网信息使用天地图服务
3风景区数据PostGIS空间表,biz_scenic_spot
4机场数据PostGIS空间表,biz_global_airport_info
5居民点数据PostGIS空间表,biz_village

2、空间分析方法

        本文重点需要展示两部分的信息,第一个是对运输路线进行还原和回放。第二个重要部分就是需要分析事故点附近的居民点、风景区即机场空间分布范围,由此为相关部门的决策提供一些辅助和支撑。因此这里的空间分析方法也分为两步:第一步是使用SpringBoot调用天地图的路径规划接口,对事故的运输路线进行还原;第二个是通过获取事故侧翻点的经纬度坐标,来分析该点附近1公里、2公里、3公里范围的居民区、景点和飞机场信息。在空间分析中空间的函数使用st_dwithin,具体的实现SQL如下:

with bp as ( select ST_GeomFromText(format('point(%s %s)',111.620623,26.198523),4326) as geom) select ta.* from ( select t.id pk_id,t.name,'scenicspot' as type,st_x(t.geom) lon,st_y(t.geom) lat,
st_distance(t.geom :: geography, bp.geom :: geography) dist from biz_scenic_spot t,bp 
where st_dwithin(t.geom :: geography,bp.geom :: geography,3000 ) 
union 
select t.pk_id,t.name_zh as name,'airport' as type,t.lon_wgs84 lon,t.lat_wgs84 lat,
st_distance(t.geom :: geography, bp.geom :: geography) dist from biz_global_airport_info t,bp where st_dwithin(t.geom :: geography,bp.geom :: geography,3000 )
union 
select t.id pk_id,t.village_name as name,'village' as type,st_x(t.geom) lon,st_y(t.geom) lat,st_distance(t.geom :: geography, bp.geom :: geography) dist from biz_village t,bp 
where st_dwithin(t.geom :: geography,bp.geom :: geography,3000 ) ) ta order by ta.dist 

        在数据库中执行以上语句后得到以下结果:

二、相关模块设计与实现

        本节将重点介绍相关的模块的设计与实现。分为前端和后端两个方面,重点是介绍运输路线的重现和事故点影响范围分析两点。通过本节的介绍,大家将掌握如何来进行相关空间分析的设计与实现。

1、运输路线重现开发

        运输路线的还原实现,主要是在后台使用Uniapi来调用天地图提供的官方服务。虽然在之前的系列文章中曾经介绍了天地图的uniapi调用,但是在之前的博文中。关于路径规划的调用只涉及到了两个参数,即起始点。而在本次博客的事故场景中,我们不仅要实现按照起始点的规划,同时还需要关联中间的转折点,比如本文的事故点,湖南省永州市零陵区康济大道和朝阳大道交汇处。需要在调用路径规划是传入中间的坐标点信息,关键代码如下:

@Override
public TdtResult benzeneTransportation(String lon,String lat) throws Exception {String origInfo = "111.277771,23.469545";//广西梧州String destInfo = "115.029602,35.753199";//河南濮阳 //String mid = "111.620623,26.198523";//湖南省永州市零陵区康济大道和朝阳大道交汇处String mid = lon + "," + lat;// 地图自助选点  26.196898, 111.6203// style 默认0 (0:最快路线,1:最短路线,2:避开高速,3:步行)// 这里选择避开高速String postStr = "%7B'orig':'" + origInfo + "','dest':'" + destInfo + "','mid':'" + mid  + "','style':'2'%7D" ;HttpResponse<String> resp = tdtOptionService.drivePlan(postStr,"search",TDT_SERVER_KEY);JAXBContext context = JAXBContext.newInstance(TdtResult.class);Unmarshaller unmarshaller = context.createUnmarshaller();TdtResult result = (TdtResult) unmarshaller.unmarshal(new StringReader(resp.getBodyResult()));return result;
}

在SpringBoot中实现的天地图uniapi接入示例代码如下:

package com.yelang.project.thridinterface;
import com.burukeyou.uniapi.http.annotation.HttpApi;
import com.burukeyou.uniapi.http.annotation.param.QueryPar;
import com.burukeyou.uniapi.http.annotation.request.GetHttpInterface;
import com.burukeyou.uniapi.http.core.response.HttpResponse;
@HttpApi(url = "http://api.tianditu.gov.cn/")
public interface TdtOptionService {@GetHttpInterface("geocoder")public HttpResponse<String> getGeocoder(@QueryPar("ds") String ds,@QueryPar("tk") String tk);@GetHttpInterface("drive")public HttpResponse<String> drivePlan(@QueryPar("postStr") String postStr,@QueryPar("type") String type,@QueryPar("tk") String tk);@GetHttpInterface("v2/search")public HttpResponse<String> searchV2(@QueryPar("postStr") String postStr,@QueryPar("type") String type,@QueryPar("tk") String tk);
}

        通过Controller的API返回给前端的接口数据如下所示:

        可以很明显的看到,运输路线的重现基本已经实现,在前端的控制台中已经实现对路线的调用。 下面就可以来对空间影响范围进行实现。

2、事故点影响范围实现

        对于事故点的影响范围实现主要是利用了空间数据库的空间查询函数,postgis空间函数的查询sql在前面的实现已经讲过,这里将sql加载到MybatisPlus中进行执行,其对应的Mapper类方法如下:

static final String FIND_EFFECT_LIST_SQL = "<script>"
+ " with bp as ( select ST_GeomFromText(format('point(%s %s)',#{lon},#{lat}),4326) as geom) "
+ " select ta.* from ( select t.id pk_id,t.name,'scenicspot' as type,st_x(t.geom) lon,st_y(t.geom) lat," 
+ " st_distance(t.geom :: geography, bp.geom :: geography) dist from biz_scenic_spot t,bp "
+ " where st_dwithin(t.geom :: geography,bp.geom :: geography,#{scenicspotDist} ) "
+ " union "
+ " select t.pk_id,t.name_zh as name,'airport' as type,t.lon_wgs84 lon,t.lat_wgs84 lat,"
+ " st_distance(t.geom :: geography, bp.geom :: geography) dist from biz_global_airport_info t,bp "
+ " where st_dwithin(t.geom :: geography,bp.geom :: geography,#{airportDist} )"
+ " union "
+ " select t.id pk_id,t.village_name as name,'village' as type,st_x(t.geom) lon,st_y(t.geom) lat,"
+ " st_distance(t.geom :: geography, bp.geom :: geography) dist from biz_village t,bp "
+ " where st_dwithin(t.geom :: geography,bp.geom :: geography,#{villageDist} ) "
+ " ) ta order by ta.dist "
+ "</script>";
/**
* - 查询指定坐标附近指定距离内的风景区、机场、居民点信息
* @param lon 经度
* @param lat 纬度
* @param scenicspotDist 风景区信息
* @param airportDist 机场信息
* @param villageDist 居民点信息
* @return
*/
@Select(FIND_EFFECT_LIST_SQL)
List<EarthQuakeEffectVo> findEffectList(@Param("lon") BigDecimal lon,@Param("lat") BigDecimal lat,@Param("scenicspotDist") Integer scenicspotDist,@Param("airportDist") Integer airportDist,@Param("villageDist") Integer villageDist);

        距离可以通过前端传给后台,也可以在Controller中直接指定。这里为了演示方便就在Controller中指定,在很多的业务实现场景中,完全是可以从前端传入,不过需要结合坐标参考类型来控制生成的空间对象范围不要太大。 Controller的示例方法如下:

@RequiresPermissions("edu:tdt:routing:phhmap")
@GetMapping("/phhmap")
public String phhmap(){return prefix + "/phhmap";
}/**
*	- 苯运输路线重现
* @return
*/
@PostMapping("/phhtrans")
@ResponseBody
public AjaxResult phhtrans() throws Exception{AjaxResult ar = AjaxResult.success();String lon = "111.620623";String lat = "26.198523";TdtResult result = tdtRoutingService.benzeneTransportation(lon, lat);ar.put("data", result);return ar;
}/**
*- 获取泄漏点影响信息列表,用post
* @return
*/
@PostMapping("/phheffect")
@ResponseBody
public AjaxResult effect(){AjaxResult ar = AjaxResult.success();String lon = "111.620623";String lat = "26.198523";List<EarthQuakeEffectVo> dataList = tdtRoutingService.findEffectList(new BigDecimal(lon),new BigDecimal(lat),3000,3000,3000);ar.put("data", dataList);return ar;
}

3、WebGIS可视化实现

        这里使用的WebGIS展示插件采用Leaflet,为了让展示的效果更加符合实际的需要。我们在进行事故点的标绘时,加入了闪烁的功能和影响范围的中文标绘信息。这些知识点在之前的系列博客都曾经介绍过,这里不再赘述。这里介绍主要使用的对象,首先是需要定义一个闪烁点、第二是按照1、2、3公里生成影响评估面,第三是路径规划的路线信息,第四是在影响范围内的风景区、居民区、机场的点位信息。这里有一个地方需要注意的是,在展示闪烁点的时候,不要将闪烁点跟受影响居民点等信息放到一个方法中,否则会影响正常的展示,下面是写在一个方法的代码中的效果:

        可以很明显的看到事故点有一个黑色的外环,这样的效果不好,需要改进。 将代码复制到影响范围后效果就很明显:

        初步怀疑是都生成marker时,对具体的对象样式产生了一定的影响。所谓距离产生美,分开就没有这种问题了。

三、讨论

        下面对功能进行一个简单的展示,也对本次事故的受影响范围进行一个分析和讨论。

1、界面结果展示

        上图是本次运输过程的重现,从广西梧州到河南濮阳的全称路线规划,出现闪烁点的位置是在湖南永州市。这是一张路线的展示。 

        上图是该事故点3公里、2公里、1公里范围内的居民点、风景区、机场分布信息。 

2、影响范围分析

        从本次影响范围来看,在事发点三公里范围的相关点位总共有15处,其中距离事发地最近的是沙沟湾社区,只有170米,其次是诸葛庙村,距离396米。距离1000到2000的有两个地点,一个是居委会,另外是一个旅游景点。其中南津渡社区居委会距离1137米,而永州零陵永州之野-异蛇世界距离1441.96061182。

        这些距离事故点越近的居民点,在进行应急风险评估是,其受的伤害一定是最直接和最重的,因此非常有必要按照距离来进行风险等级评估。 

四、总结

        以上就是本文的主要内容,在对此次事故的影响分析中,SpringBoot 和 PostGIS 的结合应用展现出了独特的优势。SpringBoot 作为一个开源的 Java 开发框架,具有开发简单、快速、高效等特点,能够为我们搭建稳定、可靠的后端服务。PostGIS 则是 PostgreSQL 的空间数据库扩展,可以高效地处理地理空间数据,实现空间查询、分析等功能。通过 SpringBoot 和 PostGIS 的协同工作,我们可以将事故现场的地理信息、车辆运输数据、环境监测数据等进行整合与分析,直观地呈现事故的影响范围和程度,为应急救援、环境污染治理以及后续的事故调查等工作提供科学依据。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫(20)Python爬虫数据存储技巧:二进制格式(Pickle/Parquet)性能优化实战

目录 背景介绍一、二进制存储的核心优势二、Python Pickle&#xff1a;轻量级对象序列化1. 基本介绍2. 代码示例3. 性能与局限性 三、Apache Parquet&#xff1a;列式存储的工业级方案1. 基本介绍2. 代码示例&#xff08;使用PyArrow库&#xff09;3. 核心优势 四、性能对比与选…

C++从入门到实战(十三)C++函数模板与类模板初阶讲解

C从入门到实战&#xff08;十三&#xff09;C函数模板与类模板初阶讲解 前言一、为什么需要模板1. 函数重载的问题2. 泛型编程和模板的作用 二、函数模板2.1 函数模板格式2.2 函数模板的原理2.3 函数模板的实例化&#xff08;1&#xff09;隐式实例化&#xff1a;&#xff08;2…

游戏引擎学习第261天:切换到静态帧数组

game_debug.cpp: 将ProfileGraph的尺寸初始化为相对较大的值 今天的讨论主要围绕性能分析器&#xff08;Profiler&#xff09;以及如何改进它的可用性展开。当前性能分析器已经能够正常工作&#xff0c;但我们希望通过一些改进&#xff0c;使其更易于使用&#xff0c;特别是在…

《Python星球日记》 第36天:线性代数基础

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏:《Python星球日记》,限时特价订阅中ing 目录 一、标量、向量、矩阵的基本概念1. 标量2. 向量3. 矩阵二、矩阵运算1. 矩阵加法2. 矩阵乘法3. 矩…

【SF顺丰】顺丰开放平台API对接(注册、API测试篇)

1.注册开发者账号 注册地址&#xff1a;顺丰企业账户中心 2.登录开发平台 登录地址&#xff1a;顺丰开放平台 3.开发者对接 点击开发者对接 4.创建开发对接应用 开发者应用中“新建应用”创建应用&#xff0c;最多创建应用限制数量5个 注意&#xff1a;需要先复制保存生产校验…

【Linux】进程地址空间

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲进程地址空间&#xff1a; &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习笔记&#xff0c;C语言入门基础…

【Java学习】反射

目录 反射类 一、泛型参数 二、反射类类型 三、实例化 1.实例化材料 2.结构信息可使用化 四、使用 1.Class —类完整结构信息 1.1Class<类>实例化 1.2Class<类>实例获取 1.2.1Class类静态获取&#xff1a; 1.2.2信息类静态获取 1.2.3信息类非静态获取 …

MVC、MVP、MVVM三大架构区别

1、MVC架构 M&#xff08;Model&#xff09;&#xff1a;主要处理数据的存储、获取、解析。 V&#xff08;View&#xff09;&#xff1a;即Fragement、Activity、View等XML文件 C&#xff08;Controller&#xff09;&#xff1a;主要功能为控制View层数据的显示&#xff0c;…

科创大赛——知识点复习【c++】——第一篇

目录 输入 一、cin 二、scanf 三、gets 四、getchar 五、fgets 输出 一、cout 二、printf 基本数据类型 一&#xff0c;数据类型有哪些&#xff1f; 二&#xff0c;整型&#xff08;Integer Types&#xff09; 1&#xff0c;修饰符 2&#xff0c;整型数据的数据范…

java学习之数据结构:四、树(代码补充)

这部分主要是用代码实现有序二叉树、树遍历、删除节点 目录 1.构建有序二叉树 1.1原理 1.2插入实现 2.广度优先遍历--队列实现 3.深度优先遍历--递归实现 3.1先序遍历 3.2中序遍历 3.3后序遍历 4.删除 4.1删除叶子节点 4.2删除有一棵子树的节点 4.3删除有两棵子树的节…

基于 HTML 和 CSS 实现的 3D 翻转卡片效果

一、引言 在网页设计中&#xff0c;为了增加用户的交互体验和视觉吸引力&#xff0c;常常会运用一些独特的效果。本文将详细介绍一个基于 HTML 和 CSS 实现的 3D 翻转卡片效果&#xff0c;通过对代码的剖析&#xff0c;让你了解如何创建一个具有立体感的卡片&#xff0c;在鼠标…

PHP数组排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的适用场景与性能对比

在PHP开发中&#xff0c;数组排序是日常操作的核心技能之一。无论是处理用户数据、产品列表&#xff0c;还是分析日志信息&#xff0c;合理的排序方法能显著提升代码的效率和可维护性。PHP提供了多种数组排序函数&#xff08;如 sort()、rsort()、asort() 等&#xff09;&#…