基于SpringBoot和Leaflet的区域冲突可视化-以伊以冲突为例_leaflet实现态势
目录
前言
一、相关空间要素
1、区域冲突目标查询
2、域外第三国势力查询
二、前后端应用实现
1、后台查询实现
2、前端Leaflet可视化
三、成果分析
1、冲突双方
2、域外势力
四、总结
前言
在当今全球化时代,地区局势成为国际社会关注的焦点。其中,以色列与伊朗之间的冲突持续多年,局势复杂且影响深远。这种冲突不仅关乎两国人民的安危,还对地区稳定、国际能源、政治格局等诸多方面产生剧烈冲击。如何能直观、高效地呈现伊以冲突的态势,为冲突分析、预防及应对提供有力支持,是一个亟待解决的问题。传统上,冲突信息主要以文字报道、统计图表等形式传播。然而,这些方式在展现冲突的地理分布、动态变化等方面存在诸多局限。比如,文字描述难以让人清晰把握冲突发生的准确位置及其周边环境;统计图表虽能呈现数据,但缺乏地理空间上的直观关联。因此,构建一个可视化系统来呈现区域冲突,显得尤为关键。
在众多可视化技术中,SpringBoot 与 Leaflet 的组合展现出独特优势。SpringBoot 是 Java 领域的开源框架,它简化了基于 Spring 应用的初始搭建以及开发过程,能快速搭建稳定、高效的后端服务。其内置的 Tomcat 容器,方便项目部署,强大的依赖管理机制使得开发者能专注于业务逻辑实现,为处理冲突数据的存储、分析及传输提供了坚实基础。Leaflet 则是轻量级的 JavaScript 地图库,它具有出色的跨浏览器兼容性,能实现流畅的地图交互。Leaflet 支持多种地图图层,可轻松加载地理数据,如矢量数据、栅格瓦片等,通过简单的 API 就能实现地图的缩放、平移、标记等功能,为在地图上精准展示冲突事件创造了有利条件。
本研究旨在通过整合 SpringBoot 与 Leaflet 技术,以伊以冲突为典型案例,构建一个可视化系统。这不仅能为研究人员、政策制定者等提供直观的态势图,还能为后续深入分析成因、发展规律及影响提供可视化支撑,助力寻找和平解决的可能途径。接下来,本文将详细介绍系统的架构设计、数据处理流程、可视化实现等内容,以展现这一创新解决方案在区域冲突可视化领域的应用潜力。
一、相关空间要素
本节将重点讲解如何使用PostGIS来进行相关信息的查询,比如涉及的双方以及主要城市信息,在之前的内容中,我们仅使用大概的中心位置来进行标注,而在大多情况下是需要使用首都等主要城市作为关键位置标记的。同时在展示的同事需要同时展示第三方的势力。本节将从以下两个方面来进行说明,首先介绍如何对区域冲突的目标及其主要城市进行空间查询,接着介绍如何介绍域外第三国的实例覆盖。
1、区域冲突目标查询
首先需要对涉及的冲突目标进行查询,同时为了在地图上准确的使用首都位置进行标注,因此还需要将对应的首都信息进行标注。这里需要使用的有三张表,分别是全球主要城市信息表,国家首都信息关系表,国家信息表。查询国家信息及其对应的首都城市信息的sql如下:
-- 查询伊朗、以色列的国家及首都信息select p.name,p.name_zh nameZh,p.latitude lat ,p.longitude lon,p.max_perkm maxPerkm,wc.full_chinese_name fullChineseName,wc.short_english_name shortEnglishNamefrom biz_ne_10m_populated_places p,biz_country_capital ca,biz_world_country wcwhere ca.country_id = wc.pk_idand ca.places_id = p.pk_idand wc.short_chinese_name in (\'以色列\',\'伊朗\');
在Navicat中执行上述的sql语句后,可以在客户端中看到以下结果:
namenamezhlatlonmaxperkmfullchinesenameshortenglishnameTehran德黑兰35.67388951.422398245伊朗伊斯兰共和国IranTel Aviv特拉维夫32.08193734.768066386以色列Israel
2、域外第三国势力查询
同样,为了在可视化的时候展示域外第三国的势力,以伊朗为例,我们来查询距离伊朗最近的10个域外基地信息。因此,这里必须会使用到的数据库表有国家信息表、第三方基地信息表。在查询域外第三国势力的时候,最核心的就是对距离进行求解,这里完全使用PostGIS的空间距离函数进行查询。查询SQL语句如下:
-- 查询距离伊朗最近的美国基地select usa.en_name enName,usa.cn_name cnName,st_x(usa.geom) lat,st_y(usa.geom) lon,st_distance(usa.geom :: geography, polygons.geom :: geography) / 1000.0 distancefrom biz_usa_military_base as usa,(select geom from biz_world_country t where t.short_chinese_name = \'伊朗\') polygonsorder byusa.geom polygons.geomlimit 20;
同样在Navicat中查看一下SQL语句执行的结果,查询结果如下所示:
ennamecnnamelatlondistanceNSA Bahrain (Fujairah Aviation Unit)56.3425.13121.21369354597NSA Bahrain (Aviation Unit Muharraq)50.647505555555526.2670055555556192.26232592418Seeb MPT阿曼SEEB MPT空军基地58.1923.67208.86581048105NSA Bahrain (Dependent School)50.555481980199926.0905320697823213.86842170652NSA Bahrain (Banz Wrhs Compound)50.558529018820926.0729379111567215.5180516366NSA Bahrain (Mina Sulman Pier Area)50.557466538360625.9230863441519230.79819439464998NSA Bahrain美国海军支援基地50.755238278408825.6638820082909251.39996333488Al Udeid AB乌迪德空军基地51.306472222222225.1158805555556265.64442185614Ascension Auxiliary Airfield42.994484422060342.2067069497732302.35311786157996Batman Air Base土耳其蝙蝠洞空军基地41.1337.89273.45916025612996Masirah Island MPT56.173038229376318.3259557344064825.29732910215Yumurtalik Petroleum Prod Storage Annex35.7836.77759.58853505713Incirlik Air Base Adana因吉利克空军基地35.418437.0059916666667786.30702616774Thumrait MPTThumrait机场54.0917.02983.67664579451Ankara Administration Office32.8539.93962.3276559015101Cigli Air Base奇利空军基地31.074446680080537.05030181086521163.80933528397NAVMEDRSCHU Three Cairo Egypt31.2530.061404.82435410338Mus Air Base29.264285714285737.48659959758551306.09482339896Izmir Storage Annex No 227.1538.431467.3545099223Izmir Air Station伊兹密尔空军基地27.1538.431467.3545099223
以上就是两个最重要的空间要素及使用PostGIS来进行相关查询的实例。通过这两个实例基本满足我们的查询需要。
二、前后端应用实现
经过前面的空间要的查询实现,下面就可以基于上面的结果来进行前后端应用的开发与实现。这种主要分后台的查询实现和前端Leaflet的可视化实现。通过本节,相信大家对如何进行空间开发有一定简单的认识。
1、后台查询实现
后端的实现比较简单,这里重点介绍一下在PostGIS中进行空间位置的距离计算时,使用了一个近邻函数,因此在这里重点介绍,其它的方法都比较简单,不再进行赘述。
static final String FIND_MILITARYBASE= \"\"+ \" select usa.en_name enName,usa.cn_name cnName,st_x(usa.geom) lon,st_y(usa.geom) lat, \"+ \" st_distance(usa.geom :: geography, polygons.geom :: geography) / 1000.0 distance \"+ \" from biz_usa_military_base as usa, \"+ \" (select geom from biz_world_country t where t.short_chinese_name = #{short_chinese_name} ) polygons \"+ \" <![CDATA[ order by usa.geom polygons.geom ]]> \"+ \" limit #{limitNum} \"+ \"\";/*** -查询距离最近的limitNum基地列表* @param 国家名称* @return 对应的基地信息列表*/@Select(FIND_MILITARYBASE)List findMilitaryBase(@Param(\"short_chinese_name\") String short_chinese_name,@Param(\"limitNum\")Integer limitNum);
在上面的例子中,眼尖的朋友一定发现了,在上面的sql语句编写中,我们加上了特殊符号处理,,如果在SQL中进行转义或设置,在执行SQL语句时就一定会出错的,因此十分要注意。除了在空间SQL查询中需要注意以上特殊处理外,剩下就是在查询国家时及其首都信息时,我们需要使用in查询函数,在MybatisPlus中使用自定义sql的方式如何执行呢?这里也给出具体的修改方法,如下所示:
final static String FIND_COUNTRY = \"\"+ \" select p.name,p.name_zh nameZh,p.latitude lat ,p.longitude lon,p.max_perkm maxPerkm \" + \" ,wc.full_chinese_name fullChineseName,wc.short_english_name shortEnglishName,st_asgeojson(wc.geom) geomJson \"+ \" from biz_ne_10m_populated_places p,biz_country_capital ca,biz_world_country wc \"+ \" where ca.country_id = wc.pk_id and ca.places_id = p.pk_id \"+ \" and wc.short_chinese_name in \"+ \" \" + \" #{id} \" + \"\" + \"\";/*** - 根据国家中文简称查询国家信息列表* @return*/@Select(FIND_COUNTRY)List findCountryList(@Param(\"short_chinese_names\") List short_chinese_names);
请注意在上面的实例中,在@Select子句中,我们嵌入了一个foreach,通过这个foreach能接受外部的参数,这样就能实现动态in查询了。这是数据访问层mapper的重点函数,接下来看一下实际的调用方法,代码如下:
@RequiresPermissions(\"eq:iranisraelconflict:list\")@GetMapping(\"/iranisraelconflict/list\")@ResponseBodypublic AjaxResult iranisraelconflictData(){ List short_chinese_names = new ArrayList(); short_chinese_names.add(\"以色列\"); short_chinese_names.add(\"伊朗\"); List countries = wCountryService.findCountryList(short_chinese_names); List militaries = usaMilitaryBaseService.findMilitaryBase(\"伊朗\", 10); //一次性返回 return AjaxResult.success().put(\"data\", countries).put(\"militaries\", militaries);}
2、前端Leaflet可视化
有了后端的相关服务之后,接下来就可以基于Leaflet来构建前端交互界面,这里除了将冲突目标及其域外国家的点位和位置展示。这里在进行空间展示时,需要考虑重叠的关系,因此在展示的时候一定要主要进行避让的设置。设置的方法如下:
首先要引入相关的组件和依赖,方法如下:
然后在页面中对相关的空间实体元素进行空间可视化,关键方法如下:
function showConflict(){ $.ajax({ type:\"get\", url:prefix + \"/iranisraelconflict/list\", data:{}, dataType:\"json\", cache:false, processData:false, success:function(result){ if(result.code == web_status.SUCCESS){ showLayerGroup.clearLayers(); for(var i = 0;i< result.data.length;i++){ var countryData = result.data[i]; var color = countryData.fullChineseName == \"伊朗伊斯兰共和国\" ? \"#0c8f2e\" : \"#e91212f7\"; var areaLayer = L.geoJSON(JSON.parse(countryData.geomJson),{style: {color:color,weight:6,\"opacity\":0.85}}).addTo(mymap); var myIcon = L.divIcon({ iconSize: null, className: \'\', popupAnchor:[5,5], shadowAnchor:[5,5], html: \"\" + countryData.fullChineseName+\"\"+countryData.shortEnglishName + \"\\t首都:\"+ countryData.nameZh+\"\" }); showLayerGroup.addLayer(areaLayer); //中心点位 L.marker(L.latLng(countryData.lat, countryData.lon), { icon: myIcon}).addTo(showLayerGroup); } for(var i = 0;i< result.militaries.length;i++){ var military = result.militaries[i]; var color = \"#c5bf16\"; var cnName = military.cnName != null && military.cnName != undefined ? military.cnName : \"\"; var myIcon = L.divIcon({ iconSize: null, className: \'\', popupAnchor:[5,5], shadowAnchor:[5,5], html: \"\"+ (i + 1) +\"、\"+ military.enName + cnName +\"\"+ \"美军基地,距离:\"+ military.distance.toFixed(2)+\"千米\" }); //中心点位 L.marker([military.lat, military.lon], { icon: myIcon}).addTo(collisionLayer); } collisionLayer.addTo(mymap); //showLayerGroup.addLayer(collisionLayer); mymap.fitBounds(showLayerGroup.getBounds()); } }, error:function(){ $.modal.alertWarning(\"获取空间信息失败\"); } });
到此,基于Leaflet的前端可视化构建就基本完成了。下面的内容将一起来看一下最后的效果。
三、成果分析
最后来看一下系统的成果,是如何从多个角度来进行冲突的展示和讲述。
1、冲突双方
首先来看一下冲突的双方,在地图中可以直观的看到冲突的双方如下图所示:
通过这里可以看到两个冲突的对象,比如以色列和伊朗,在两者中间其实还隔着其它的国家。 比较明显容易看到的是两个国家相隔较远,同时从国土面积来说,以色列的国土面积比伊朗小多了。从首都的位置可能,伊朗更偏向于领土的内部,以色列的特拉维夫,是比较靠海和空间位置不太有利的地方。
2、域外势力
大家如果看新闻的话,应该记得在冲突后,伊朗是选择对漂亮国的基地进行了打击。因此我们使用PostGIS查询了距离较近的10个基地信息,具体的基地信息列表在第一节第二小节已经进行了分析和结果展示。这里主要来看一下这些基地的空间分布情况是什么样子的?首先来看一下域外基地位置信息。
可以看到,在波斯湾周围,伊朗于基地的距离最短的只有121千米,这么一点距离,使用常规手段就足以发挥出相应的价值。 紧随其后的192千米。再从一个基地的数量看来,在巴林居然同时拥有多个基地,如下图:
除了巴林以外,在卡塔尔也是进行多个基地的部署。卡塔尔分布如下所示:
四、总结
以上就是本文的主要内容, 本研究旨在通过整合 SpringBoot 与 Leaflet 技术,以伊以冲突为典型案例,构建一个可视化系统。这不仅能为研究人员、政策制定者等提供直观的态势图,还能为后续深入分析成因、发展规律及影响提供可视化支撑,助力寻找和平解决的可能途径。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。