目錄
前言
一、技術實現路徑
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 的協同工作,我們可以將事故現場的地理信息、車輛運輸數據、環境監測數據等進行整合與分析,直觀地呈現事故的影響范圍和程度,為應急救援、環境污染治理以及后續的事故調查等工作提供科學依據。行文倉促,定有不足之處,歡迎各位朋友在評論區批評指正,不勝感激。