目录
前言
一、技术实现路径
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 的协同工作,我们可以将事故现场的地理信息、车辆运输数据、环境监测数据等进行整合与分析,直观地呈现事故的影响范围和程度,为应急救援、环境污染治理以及后续的事故调查等工作提供科学依据。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。