跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

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

基于 SpringBoot 和 PostGIS 构建应急运输事件影响分析系统,以 1.31 罐车侧翻事故为例。通过天地图 API 还原运输路线,利用 PostGIS 空间函数 ST_DWithin 查询事故点周边 1 至 3 公里范围内的居民区、风景区及机场分布。系统采用 Leaflet 实现 WebGIS 可视化,支持闪烁点标绘及影响范围评估,为应急救援决策提供科学依据。

灵魂伴侣发布于 2025/11/4更新于 2026/6/527 浏览
基于 SpringBoot 和 PostGIS 的应急运输事件影响分析 - 1.31 侧翻事故案例

前言

在交通运输发达的当今社会,应急运输事件的发生对社会的稳定和人民的生命财产安全带来了诸多挑战。如何及时、准确地分析此类事件的影响,为应急决策提供有力支持,成为了亟待解决的问题。而 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.*  ( 
     t.id pk_id,t.name,  type,st_x(t.geom) lon,st_y(t.geom) lat, st_distance(t.geom :: geography, bp.geom :: geography) dist 
     biz_scenic_spot t,bp  st_dwithin(t.geom :: geography,bp.geom :: geography, ) 
     
     t.pk_id,t.name_zh  name,  type,t.lon_wgs84 lon,t.lat_wgs84 lat, st_distance(t.geom :: geography, bp.geom :: geography) dist 
     biz_global_airport_info t,bp  st_dwithin(t.geom :: geography,bp.geom :: geography, ) 
     
     t.id pk_id,t.village_name  name,  type,st_x(t.geom) lon,st_y(t.geom) lat,st_distance(t.geom :: geography, bp.geom :: geography) dist 
     biz_village t,bp  st_dwithin(t.geom :: geography,bp.geom :: geography, ) 
) ta   ta.dist 
from
select
'scenicspot'
as
from
where
3000
union
select
as
'airport'
as
from
where
3000
union
select
as
'village'
as
from
where
3000
order
by

在数据库中执行以上语句后得到相应结果。

二、相关模块设计与实现

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

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 的协同工作,我们可以将事故现场的地理信息、车辆运输数据、环境监测数据等进行整合与分析,直观地呈现事故的影响范围和程度,为应急救援、环境污染治理以及后续的事故调查等工作提供科学依据。

目录

  1. 前言
  2. 一、技术实现路径
  3. 1、需要使用的数据
  4. 2、空间分析方法
  5. 二、相关模块设计与实现
  6. 1、运输路线重现开发
  7. 2、事故点影响范围实现
  8. 3、WebGIS 可视化实现
  9. 三、讨论
  10. 1、界面结果展示
  11. 2、影响范围分析
  12. 四、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 前端动画演进:为何不再推荐 jQuery animate
  • Axure 制作 AI 自动对话机器人原型教程
  • Obsidian 看板 + Copilot:项目管理与每日总结的自动化工作流
  • Kubernetes与AI推理服务最佳实践
  • Windows 平台零基础部署 Qwen1.5 大模型教程
  • Spring Cloud OpenFeign 远程调用最佳实践
  • C++ 各标准版本核心特性差异对比
  • TSW-30 浊度传感器技术原理及智能家居应用
  • Talker-Reasoner:基于双系统架构的 AI Agent 设计
  • GitHub Copilot、Trae 与 Cursor 三款 AI 编程工具对比分析
  • 生产级 AI Agent 框架设计与实战
  • Python Mode for Processing 创意编程使用指南
  • 深入辨析 PLC 编程语言:ST、STL 与 SCL 的区别
  • C++ 排序算法核心解析与 STL 实战
  • GitHub Copilot Java 重构实战:上下文感知与场景落地
  • Python 构建 GraphQL API:从原理到企业级实战
  • 大模型推理中的张量并行:详解 4 种通信计算重叠模式
  • Python 异步编程与协程详解
  • MySQL 数据库核心操作:创建、修改与备份恢复
  • C 语言 Web 开发:CGI、FastCGI 与 Nginx 深度解析

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online