基于Java的地震震中附近城市分析實戰

目錄

前言

一、空間數據說明

1、空間查詢

二、Java后臺開發

1、模型層設計與實現

2、控制層設計與實現

三、Leaflet地圖開發

1、地震震中位置展示

2、附近城市展示

?3、成果展示

總結


前言

????????隨著全球氣候變化和地殼活動的不斷演變,地震作為一種自然災害,其發生的頻率和影響力日益受到人們的關注。當一個城市或地區遭受地震的威脅時,對其進行詳盡的分析顯得尤為必要。地震附近城市分析的必要性主要包含以下幾個方面:

????????一、了解地震風險,保障居民安全

????????地震附近城市的分析,首要目的是了解該城市的地震風險。通過對城市地質結構、地震歷史數據、地震活動頻率和強度等方面的深入研究,可以準確評估城市面臨的地震風險等級。這種評估對于城市規劃和防災減災措施的制定至關重要,能夠確保城市居民的生命財產安全。

????????二、指導城市規劃和建設

????????地震附近城市的分析還能夠為城市規劃和建設提供重要指導。在了解城市地震風險的基礎上,可以合理規劃城市布局,避免在地震活動頻繁或地質條件脆弱的區域進行重要建筑和基礎設施的建設。此外,分析結果還可以為建筑物的抗震設計提供科學依據,確保建筑物在地震發生時能夠保持相對穩定,減少倒塌和破壞的風險。

????????三、提高城市應急管理能力

????????地震災害的突發性和不可預測性要求城市必須具備高效的應急管理能力。地震附近城市的分析可以為城市的應急管理工作提供重要支持。通過對城市地震風險的評估,可以制定相應的應急預案和救援計劃,確保在地震發生后能夠迅速、有效地進行救援和恢復工作。同時,分析結果還可以幫助城市完善應急設施,提高應對地震災害的能力。

????????四、促進城市可持續發展

????????地震附近城市的分析不僅關注當前的地震風險,還著眼于城市的未來發展。通過深入分析城市的地質條件和地震活動規律,可以為城市的可持續發展提供重要支持。在規劃城市未來發展時,可以充分考慮地震風險因素,采取科學合理的措施來降低地震對城市的影響。這有助于實現城市的可持續發展,確保居民在享受城市帶來的便利和舒適的同時,也能夠享受到安全和穩定的生活環境。

????????本文基于中國地震臺網的數據,以及全國城市點位數據,通過分析地震震中位置100公里范圍內的城市列表,以及震中位置與城市的直線距離,為后面做空間分析打下堅實的基礎,通過本文,您可以了解到如何在PostGIS數據庫中進行空間范圍查詢,同時可以了解如何將查詢結果進行Web空間可視化的具體方法。

????????博文首先介紹空間數據的基本情況,即如何在空間數據中如何進行空間分析,然后講解如何使用Java進行后臺空間分析的應用,其次介紹如何在Leaflet對分析的結果進行Web可視化,最后給出實際的運行例子,讓大家知道程序最終的成果。

一、空間數據說明

????????本節將對空間數據結構和數據,100公里范圍的空間分析查詢進行簡單介紹。讓大家了解如何進行地震位置指定范圍城市查詢。

1、空間查詢

????????在空間數據庫中,要想實現100公里范圍內的指定目標查詢。采用的是我們熟悉的范圍查詢函數。st_dwithin ()? ,為了方便將兩個空間對象進行以米為單位的距離換算,? 我們將geometry對象轉換為geography類型。具體使用的查詢語句如下所示:

SELECT T.pk_id,T.NAME,T.pinyin,T.classz,T.bz,T.slx,st_x ( T.geom ) lon,st_y ( T.geom ) lat,st_distance ( T.geom :: geography, t1.geom :: geography ) dist 
FROMbiz_geographic_name T,biz_ceic_earthquake t1 
WHEREt1.pk_id = 1792871415574196226 AND st_dwithin ( T.geom :: geography, t1.geom :: geography, 100000 ) 
ORDER BYdist

????????將上述的sql語句在PostGIS數據庫中執行以后,可以看到以下的查詢結果:

????????通過這條sql語句就可以實現對空間數據的分析。大家請注意,在數據庫中我們將地震點存儲為Geometry數據,而在界面上我們需要進行經緯度的還原,因此我們采用直接獲取經緯度的方法,即:st_x ( T.geom ) lon,st_y ( T.geom ) lat

????????下面的章節將實現把上面的查詢結果進行Web應用開發,完全實現通過一個地震點來實時查詢地震點附件的城市列表分析。

二、Java后臺開發

????????在了解了空間數據查詢的SQL具體的寫法之后,我們來開發針對性的后臺。開發語言采用我們熟悉的Java開發語言。Java在GIS開發當中其實也是能實現很多需求的。當學會這門語言之后,用起來就會比較爽,這里不多說,無意與其它語言進行對比,不喜勿噴。

1、模型層設計與實現

????????在模型層,我們主要介紹實體類的代碼實現和Mapper即數據庫訪問層的設計與實現。實體類主要用來將數據庫查詢的結果集綁定到對象中。而Mapper則實現對PostGIS空間數據庫的綁定和設置。下面我們將分別對這兩個主要的類進行編碼,在進行OOP設計時,我們發現可以直接利用原始的實體類,只需要擴展出經緯度兩個屬性即可,因此我們采用視圖對象(VO)的方式來實現。

package com.yelang.project.extend.earthquake.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yelang.framework.aspectj.lang.annotation.Excel;
import com.yelang.framework.handler.PgGeometryTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@TableName(value ="biz_geographic_name",autoResultMap = true)
public class GeographicName implements Serializable{private static final long serialVersionUID = -3694849578429480952L;@TableId(value = "pk_id")@Excel(name = "序號")private Long pkId;@Excel(name = "城市名稱")private String name;@Excel(name = "城市漢語拼音")private String pinyin;@Excel(name = "類別")private String classz;@Excel(name = "備注")private String bz;private String slx;public GeographicName(String name, String pinyin, String classz, String bz, String slx, String geom) {super();this.name = name;this.pinyin = pinyin;this.classz = classz;this.bz = bz;this.slx = slx;this.geom = geom;}@TableField(typeHandler = PgGeometryTypeHandler.class)private String geom;@TableField(exist=false)private String geomJson;  @TableField(exist=false)@Excel(name = "城市距離(單位:米)")private BigDecimal dist;//距離
}
package com.yelang.project.extend.earthquake.domain;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/*** 城市地名視圖對象* @author yelangking*/
@Data
@EqualsAndHashCode(callSuper=false)
public class GeographicNameVo extends GeographicName implements Serializable{private static final long serialVersionUID = -7161733218138543509L;private String lon;//經度private String lat;//緯度
}

?

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.GeographicNameVo;
public interface GeographicNameMapper extends BaseMapper<GeographicName>{static final String FIND_LIST_BY_EARTHID = "<script>"
+"select t.pk_id,t.name,t.pinyin,t.classz,t.bz,t.slx,st_x(t.geom) lon,st_y(t.geom) lat, "
+" st_distance(t.geom :: geography, t1.geom :: geography) dist from biz_geographic_name t,biz_ceic_earthquake t1 "
+ " where t1.pk_id= #{eqId} and st_dwithin(t.geom :: geography,t1.geom :: geography,100000 )  order by dist "
+ "</script>";@Select(FIND_LIST_BY_EARTHID)List<GeographicNameVo> findListByEarthId(@Param("eqId") Long eqId);
}

2、控制層設計與實現

????????業務層比較簡單,不進行詳細說明。在這個實例當中,業務層的實現比較簡單。這里將控制層的代碼實現進行說明。這里僅實現頁面的跳轉和一個ajax接口,關鍵代碼如下:

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.ui.ModelMap;
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.aspectj.lang.annotation.Log;
import com.yelang.framework.aspectj.lang.enums.BusinessType;
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.GeographicNameVo;
import com.yelang.project.extend.earthquake.domain.crawler.CeicEarthquake;
import com.yelang.project.extend.earthquake.service.ICeicEarthquakeService;
import com.yelang.project.extend.earthquake.service.IGeographicNameService;
import com.yelang.project.extend.scenicspot.domain.ScenicSpotDistVo;
import com.yelang.project.extend.scenicspot.service.IScenicSpotService;
@Controller
@RequestMapping("/ceiceq/info")
public class CeicEarthquakeInfoController extends BaseController{private String prefix = "ceicearthquake/info";@Autowiredprivate IGeographicNameService geoNameService;//跳轉附近城市頁面,用get請求@RequiresPermissions("ceiceq:info:nearbycities")@GetMapping("/nearbycities/{pkId}")public String nearbyCities(@PathVariable("pkId")Long pkId,ModelMap mmap){mmap.put("pkId", pkId);CeicEarthquake earthQuake = ceicEarthQuakeService.getById(pkId);mmap.put("earthQuake", earthQuake);List<GeographicNameVo> dataList = geoNameService.findListByEarthId(pkId);mmap.put("dataList", dataList);return prefix + "/nearbycities";}/*** 獲取附近城市列表數據,用post* @param pkId* @return*/@PostMapping("/nearbycities/{pkId}")@ResponseBodypublic AjaxResult nearbycities(@PathVariable("pkId")Long pkId){AjaxResult ar = AjaxResult.success();List<GeographicNameVo> dataList = geoNameService.findListByEarthId(pkId);ar.put("data", dataList);return ar;}
}

????????以上代碼即給出了后臺Java實現的關鍵代碼。通過以上代碼即完成了空間數據分析查詢接口開發。下面通過Leaflet組件來進行地圖可視化開發。

三、Leaflet地圖開發

????????作為WebGIS的典型組件之一,Leaflet以其良好的生態和豐富的插件和示例應用開發。這里我們同樣采取熟悉的Leaflet作為web開發組件。本小節主要講解如何使用Leaflet進行空間可視化展示開發。

1、地震震中位置展示

????????在進行地震及附件城市列表可視化展示時,首先需要對震中位置進行展示。關鍵的代碼如下所示。

var lon = [[${earthQuake.epiLon}]];  
var lat = [[${earthQuake.epiLat}]];
var cityInfo = [[${earthQuake.locationC}]];
$(function() {var marker = L.circleMarker(new L.LatLng(lat, lon), {radius: 8,labelStyle: {text: cityInfo,rotation: 0,zIndex: 2,strokeStyle :"red"},color : "red"}).addTo(mymap);});

????????這時我們來看一下實際的效果:

2、附近城市展示

????????把震中位置展示出來之后,還要把地震100公里附近的城市也展示出來。關鍵代碼如下:

function showDistance(){$.ajax({  type:"post",  url:prefix + "/nearbycities/" + [[${pkId + ''}]],  dataType:"json",  cache:false,processData:false,success:function(result){if(result.code == web_status.SUCCESS){var strokeStyleSet = "green";for(var i=0;i<result.data.length;i++){var dataInfo = result.data[i];var dist = dataInfo.dist;if(parseFloat(dist) <= 30000){strokeStyleSet = "red";}if(parseFloat(dist) > 30000 && parseFloat(dist) <= 60000 ){strokeStyleSet = "orange";}if(parseFloat(dist) >= 60000){strokeStyleSet = "green";}var _dist = parseFloat(dataInfo.dist / 1000).toFixed(2);var content = "<strong>城市名稱:</strong>"+dataInfo.name + "<br/><strong>震中位置:</strong>"+ cityInfo;content += "<br/><strong>距離(千米):</strong>"+_dist;var marker = L.circleMarker(new L.LatLng(dataInfo.lat, dataInfo.lon), {radius: 8,labelStyle: {text: dataInfo.name,rotation: 0,zIndex: i,strokeStyle :strokeStyleSet},color : strokeStyleSet}).addTo(mymap);marker.bindPopup(content);    L.polyline([[[lat, lon],[dataInfo.lat, dataInfo.lon]]], {labelStyle: {text:dataInfo.name + ":"  + _dist + "千米",zIndex: 0,collisionFlg: false,textAlign:'center',strokeStyle :strokeStyleSet},color : strokeStyleSet}).addTo(mymap);}}},error:function(){$.modal.alertWarning("獲取信息失敗");}});}

????????右邊的附近城市列表展示代碼如下:

 <table class="table table-bordered white-bg" ><thead><tr><th width="50%">城市名稱</th><th>城市級別</th><th>距離(公里)</th></tr></thead><tbody><tr th:each="data,itemStat:${dataList}"><td >[[${itemStat.count}]]、[[${data.name}]]</td><td>[[${data.bz}]]</td><td th:text="${#numbers.formatDecimal((data.dist / 1000 ), 1, 2)}"></td></tr></tbody></table>

?3、成果展示

????????下面展示幾個具體的地震點的附近城市信息:

2024-05-19 03:35:44?山西大同市陽高縣 3.9級地震 震源深度13米 附近城市示意圖

2024-05-10 09:37:24?臺灣花蓮縣 4.6級 震源深度10米 附近城市分布示意圖?

2024-04-30 07:52:46?陜西漢中市洋縣 2.8級 震源深度10米 附近城市分布示意圖

?2018-10-01 13:09:07?湖南常德市鼎城區 3.1級 震源深度 7米 附近城市分布示意圖

總結

????????以上就是本文的主要內容,本文基于中國地震臺網的數據,以及全國城市點位數據,通過分析地震震中位置100公里范圍內的城市列表,以及震中位置與城市的直線距離,為后面做空間分析打下堅實的基礎,通過本文,您可以了解到如何在PostGIS數據庫中進行空間范圍查詢,同時可以了解如何將查詢結果進行Web空間可視化的具體方法。行文倉促,難免有不足之處,如果您發現有問題,歡迎各路朋友在評論區留下寶貴意見,萬分感謝。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14935.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14935.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14935.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第十三節:帶你梳理Vue2 : watch偵聽器

官方解釋:> 觀察 Vue 實例變化的一個表達式或計算屬性函數。回調函數得到的參數為新值和舊值。表達式只接受監督的鍵路徑。對于更復雜的表達式&#xff0c;用一個函數取代<br/>## 1. 偵聽器的基本使用偵聽器可以監聽data對象屬性或者計算屬性的變化watch是觀察屬性的…

現代C++ 如何使用 Lambda 使代碼更具表現力、更容易理解?

使用 Lambda 使代碼更具表現力 一、Lambda VS. 仿函數二、總結 一、Lambda VS. 仿函數 Lambda 是 C11 中最引人注目的語言特性之一。它是一個強大的工具&#xff0c;但必須正確使用才能使代碼更具表現力&#xff0c;而不是更難理解。 首先&#xff0c;要明確的是&#xff0c;…

向npm發布自己寫的vue組件,使用vite創建項目

向npm發布自己寫的vue組件&#xff0c;使用vite創建項目 創建項目 pnpm create vite輸入項目名稱 由于我的組件是基于 ant-design-vue和vue的&#xff0c;需要解析.vue文件&#xff0c;我又安裝了下面4個。 然后執行 pnpm i安裝依賴 vite.config.ts import { defineC…

防范TOCTOU競態條件攻擊

防范TOCTOU競態條件攻擊 在軟件開發過程中&#xff0c;我們常常會遇到需要在使用資源之前檢查其狀態的情況。然而&#xff0c;如果資源的狀態在檢查和使用之間發生了變化&#xff0c;那么檢查的結果可能會失效&#xff0c;導致軟件在資源處于非正常狀態時執行無效操作。這種時…

[datawhale202405]從零手搓大模型實戰:TinyAgent

結論速遞 TinyAgent項目實現了一個簡單的Agent智能體&#xff0c;主要是實現了ReAct策略&#xff08;推理調用工具的能力&#xff09;&#xff0c;及封裝了一個Tool。 項目實現有一定的疏漏。為了正確運行代碼&#xff0c;本次對代碼Agent部分進行了簡單修改&#xff08;完善…

windows安裝rocketmq

1.下載連接 https://rocketmq.apache.org/download/ 2.解壓到D盤下&#xff08;其他位置也可以&#xff09; 3.配置環境變量 需要有jdk環境 新建ROCKETMQ_HOME&#xff0c;剛剛解壓的位置 編輯Path&#xff0c;新增%ROCKETMQ_HOME%\bin 4.啟動mqnameserver 進入安裝bin目錄下…

ERC314協議

314協議功能詳解 這兩天花時間研究了一下314協議&#xff0c;總體感覺還不錯&#xff0c;有創新。 功能亮點 314協議作為一種創新的代幣標準&#xff0c;致力于降低用戶交易成本與簡化授權流程&#xff0c;通過“轉賬即交易”模式革新傳統Swap體驗。此協議簡化了買賣代幣的過程…

什么是react

React 是一個用于構建用戶界面的 JavaScript 庫&#xff0c;由 Facebook&#xff08;現在的 Meta&#xff09;開發和維護。它首次發布于2013年&#xff0c;并迅速成為最受歡迎的前端庫之一。React 的主要目標是提供一種高效、靈活的方式來構建用戶界面&#xff0c;特別是在大型…

gc和gccgo編譯器

Go 語言有兩個主要的編譯器&#xff0c;分別是 Go 編譯器&#xff08;通常簡稱為 gc&#xff09;和 GCCGO。它們之間有一些重要的異同點&#xff1a; gc 編譯器&#xff1a; gc 是 Go 語言的官方編譯器&#xff0c;由 Go 語言的開發團隊維護。它是 Go 語言最常用的編譯器&#…

PHP代碼審計前期準備

1 php代碼審計的意義 1.1 什么是代碼審計 就是獲取目標的代碼&#xff0c;這個目標可以是一個網站&#xff0c;也可以是一個手機app 1.2 黑盒測試與白盒測試的區別 在代碼審計中黑盒和白盒的主要區別就在于是否可以拿到源代碼&#xff0c;黑盒是拿不到源代碼的&#xff0c;…

交叉編譯——

什么是交叉編譯 交叉編譯 是在一個平臺上生成臨海一個平臺可執行代碼. eg.在windows上面編寫C51代碼&#xff0c;并編譯生成可執行代碼。如xx.hex 我們在Ubuntu上編寫樹莓派的代碼&#xff0c;并編譯成可執行代碼。a.out. 是在樹莓派上運行&#xff0c;不在Ubuntu Linux上面運…

便攜式iv測試儀特點

TH-PV30便攜式IV測試儀是一種用于測量半導體器件電學特性的設備&#xff0c;它具有體積小、重量輕、便于攜帶等特點&#xff0c;廣泛應用于半導體行業、科研實驗室以及教育領域。 該測試儀的工作原理基于四探針法&#xff0c;通過在半導體器件表面放置四個金屬探針&#xff0c…

【vs2022】安裝copilot和reshaper

直接安裝新版vs 17.10 自帶集成的copilot支持安裝resharper 可以跳過市場里的reshper安裝好后依然可以直接使用vs。 resharper 2024.1.2 市場里還是i老版本&#xff1a; copilot 不兼容,這個是之前市場安裝的版本 官方建議用vs intall 安裝 安裝 GitHub Copilot GitHub.Co…

詳解http協議

什么是HTTP協議 定義 Http協議即超文本傳送協議 (HTTP-Hypertext transfer protocol) 。 它定義了瀏覽器&#xff08;即萬維網客戶進程&#xff09;怎樣向萬維網服務器請求萬維網文檔&#xff0c;以及服務器怎樣把文檔傳送給瀏覽器。從層次的角度看&#xff0c;HTTP是面向&am…

第四十一天 | 62.不同路徑 63.不同路徑|| 343.整數拆分 96.不同的二叉搜索樹

題目&#xff1a;62.不同路徑 1.二維dp數組dp[i][j]含義&#xff1a;到達&#xff08;i&#xff0c;j&#xff09;位置有dp[i][j]種方法。 2.動態轉移方程&#xff1a;dp[i][j] dp[i - 1][j] dp[i][j - 1] 3.初始化&#xff1a;dp[0][j] 1, dp[i][0] 1 &#xff08;第一…

Vue3設置緩存:storage.ts

在vue文件使用&#xff1a; import { Local,Session } from //utils/storage; // Local if (!Local.get(字段名)) Local.set(字段名, 字段的值);// Session Session.getToken()storage.ts文件&#xff1a; import Cookies from js-cookie;/*** window.localStorage 瀏覽器永…

uniapp 安卓 Pc端真機瀏覽器調試

下載插件:真機模擬瀏覽器 1. 安裝, 每次啟用時使用usb 線連接電腦, 并且打開手機或者POS (調試設備)開發者模式, 比如我的是pos 機 則在系統設置中找到版本號,點擊多次就會觸發開發者模式 2.打開真機模擬軟件,打開后會打開一個瀏覽器,如果想要模擬google的瀏覽器則 在瀏覽器地…

精準鍵位提示,鍵盤盲打輕松入門

在說明精準鍵位提示之前&#xff0c;我們先來看一張圖&#xff1a; 這是一張標準的基準鍵位圖&#xff0c;也就是打字時我們雙手的8個手指放在基準鍵位上&#xff0c;在打不同的字母時&#xff0c;我們的手指以基準鍵位為中心&#xff0c;或上、或下、或左、或右&#xff0c;在…

202109青少年軟件編程(Python)等級考試試卷(四級)

第 1 題 【單選題】 執行如下 Python 代碼后, 結果是?( ) def inverse(s,n=0): while s:n = n * 10 + s % 10s = s // 10return nprint

《拯救大學生課設不掛科第二期之Windows11下安裝VC6.0(VC++6.0)與跑通Hello,World!程序教程》【官方筆記】

背景與目標人群&#xff1a; 大學第一次學C語言的時候&#xff0c;大部分老師會選擇VC6這個編輯器。 但由于很多人是新手&#xff0c;第一次上大學學C語言。 老師要求VC6.0&#xff08;VC6.0&#xff09;寫C語言跑程序可能很多人還是第一次接觸電腦。 需要安裝VC6這個編輯器…