基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
目录前言一、PostGIS空间求解1、相邻的求解二、后台程序实现1、数据查询的实现2、API接口实现三、WebGIS可视化实现1、空间面展示2、增加面标注3、图例展示4、与缅甸距离较近的区县信息四、总结前言云南这个位于中国西南边陲的省份以其独特的地理位置和丰富的民族文化而闻名。作为中国连接东南亚和南亚的重要门户云南拥有长达四千多公里的边境线与缅甸、老挝和越南三国接壤。这条边境线不仅是中国对外开放的前沿也是维护国家安全和地区稳定的关键地带。随着全球化的深入发展和区域合作的不断加强云南边境线的战略地位日益凸显。云南的边境线总长达到4060公里是中国边境线最长的省份之一。这条边境线没有天然物理屏障地势错综复杂、犬牙交错有的是山高林密、荆棘丛生沼泽密布、河水湍急。云南与缅甸、老挝和越南三国接壤边境线交错纵横展现出云南的边境线地域广阔。其中与缅甸接壤的边境线长达1960公里与老挝的边境线长约475公里与越南的边境线长约1180公里。云南的边境线上374个边境村寨如同一颗颗明珠闪耀着无尽的光芒呈现出“边民富、边关美、边境稳、边防固”的美丽新画卷。边境线上的茶叶、咖啡、草果等农产品依托边境口岸走出深山走向世界。在云南的边境线上有无数隐姓埋名的边防战士守卫着边境的安全。他们顶着湿热寒冷忍着蚊虫叮咬守卫在边境。这些守边人无论是边防战士、移民管理警察、民兵还是自发巡逻的村民都在默默地守护着国境线。边境线上的守边人生活条件艰苦他们住帐篷、睡木板、劈柴烧饭生烟驱蚊、居边而眠、沿边而巡。他们面对的不仅是自然环境的挑战还有蛇鼠毒虫的骚扰以及各种健康风险。相信前几年一个令人闻风丧胆的地方-缅北。让大家闻言就不仅害怕这里是犯罪的天堂电信诈骗无数人倾家荡产。而我们的祖国作为守卫我们安全的最强大后盾在我们的背后默默的守候。当缅国内出现动荡的时候许多的边民来到口岸要求进入我国庇护。为了人民的安全我们的工作人员与战士、警察构筑了一道坚固的防线。云南边防是我们的安全防线。在信息技术迅猛发展的今天地理信息系统GIS已经成为管理和决策的重要工具。WebGIS作为GIS技术与互联网技术结合的产物以其强大的空间数据管理和分析能力为用户提供了一个全新的视角来观察和理解地理空间信息。云南的千里边境线WebGIS项目正是在这样的背景下应运而生旨在通过先进的WebGIS技术为云南边境线的管理和开发提供科学、高效的解决方案。文章首先介绍如何进行空间距离求解然后结合PgAdmin来进行空间查询实践最后使用SpringBoot框架结合PostGIS来详细说明如何进行云南的边防线WebGIS可视化实战。如果您也有兴趣不妨来这里看看。一、PostGIS空间求解在进行云南边境线区县WebGIS求解时首选需要正确的计算边界信息。由于我们拿到的国家边界信息与云南省的曲线面数据准确性有一定的问题。因此这里的数据仅供参考文章重点讲解这种实现思路。如何通过空间函数来求解相邻问题。1、相邻的求解在进行相邻的空间计算求解时需要用到的数据有两份。首先是国家信息即缅甸的面数据。这里的数据采用从osm中采集的全球国家信息。然后与云南省的区县数据进行空间计算。区县信息来源于互联网。但是缅甸与云南区县的空间范围还是有一定的问题这与原始的数据有直接的关系。这里我们首先采用PgAdmin来看一下具体的展示效果。在PgAdmin中查询空间数据的sql如下select -1 dist,1 id, province_code,province_name, city_code, city_name, area_code,缅甸 area_name,国家 as type,st_asgeojson(geom) as geomJson from biz_world_country where short_chinese_name 缅甸 union SELECT ta.dist,ta.id,ta.province_code,ta.province_name,ta.city_code,ta.city_name, ta.area_code,ta.area_name,ta.type,st_asgeojson(geom) as geomJson FROM ( WITH ynarea AS ( SELECT * FROM biz_area WHERE province_name 云南省 ) SELECT st_distance ( cinfo.geom :: geography, ynarea.geom :: geography ) dist, ynarea.* FROM biz_world_country cinfo, ynarea WHERE short_chinese_name 缅甸 ORDER BY dist DESC ) ta WHERE dist 10000;将缅甸的国家边界同时查询出来也是为了在WebGIS中重点展示边界的情况。在SQL中增加了一个求解面的距离信息这里设置一个阈值即10公里。假设两个面距离10公里内的就算是相邻这只是一种模拟情况实际情况中还是需要标准的边界矢量地图来进行计算。执行完查询语句之后可以看到以下的查询结果。然后再点击空间数据预览按钮对空间数据进行预览整体效果如下咋一看没有什么问题。仔细将边界拉进后可以看到边界的接边情况比较毛躁。如下图标红的地方。在上图中也具体的展示了边界的情况下面我们会在Leaflet当中对上述空间信息进行空间展示。二、后台程序实现在了解了空间函数计算和空间数据的问题之后我们基于空间数据库的查询结果来进行后台应用程序的设计为前端提供可视化查询接口。本小节主要介绍Mapper数据库查询与API接口的实现。1、数据查询的实现在应用程序后台我们基于Mybatis-Plus来进行空间数据库的查询操作。根据上一节中的空间相邻计算规则将查询SQL写入到Mapper对象中。关键代码如下static final String COUNTRY_NEIGHBOR_BYPROVINCE_SQL select -1 dist,1 id, province_code,province_name, city_code, city_name, area_code,#{country_name} area_name,国家 as type,st_asgeojson(geom) as geomJson from biz_world_country where short_chinese_name #{country_name} union select ta.dist,ta.id,ta.province_code,ta.province_name,ta.city_code,ta.city_name, ta.area_code,ta.area_name,ta.type,st_asgeojson(geom) as geomJson from ( with ynarea as ( select * from biz_area where province_name #{province_name} ) select st_distance(cinfo.geom::geography, ynarea.geom ::geography) dist,ynarea.* from biz_world_country cinfo,ynarea where short_chinese_name #{country_name} order by dist desc ) ta where dist #{max_distance} ; Select(COUNTRY_NEIGHBOR_BYPROVINCE_SQL) ListAreaNeighborVo findNeihborByProvince(Param(province_name)String provinceName, Param(country_name)String countryName,Param(max_distance)Double maxDistance);这个查询相邻的方法有三个参数第一个参数是目标省份比如云南省第二个参数是国家中文简称第三个参数的距离参数。求解相应的国家和对应的省份的面距离最后根据距离值来进行识别。在求解面和面的距离时需要注意的是两个面的最短距离时计算最近的两个点的位置。2、API接口实现有了基础查询函数之后我们可以对外开放一个列表查询接口和页面跳转方法。关键的代码如下RequiresPermissions(eq:miandianyn:map) GetMapping(/miandianyn) public String miandianyn(){ return prefix /miandianyn; } RequiresPermissions(eq:miandianyn:list) GetMapping(/miandianyn/list) ResponseBody public AjaxResult miandianynList(){ ListAreaNeighborVo countries areaService.findNeihborByProvince(云南省, 缅甸, 10000D); return AjaxResult.success().put(data, countries); }到此基础数据库查询类与API查询类均已开发完成。下面我们可以使用Leaflet来进行WebGIS空间数据展示。三、WebGIS可视化实现有了空间查询函数以及后台的查询接口之后下面我们就可以使用Leaflet来开发WebGIS可视化效果。1、空间面展示在进入到页面中时首先先对空间面数据进行展示。这里使用Leaflet来展示GeoJSON数据。同时结合自定义面颜色。关键代码如下function getYunnanData(){ $.ajax({ type:get, url:prefix /miandianyn/list, data:{}, dataType:json, cache:false, processData:false, success:function(result){ if(result.code web_status.SUCCESS){ showLayerGroup.clearLayers(); var legendData new Array(); for(var i 0;i result.data.length;i){ var areaData result.data[i]; var color ccolor getRandomColor(); var areaLayer L.geoJSON(JSON.parse(areaData.geomJson),{style: {color:ccolor,fillColor:ccolor,weight:3,opacity:0.65, fillOpacity: 0.65 }}).addTo(mymap); } }, error:function(){ $.modal.alertWarning(获取空间信息失败); } }这里先将所有的面数据进行集中展示这一步的效果如下所示2、增加面标注为了方便用户在地图上直观的看到各个块表示的区县或者国家信息。可以在地图上增加自定义的名字标绘。这里使用DivMarker的方式进行展示关键代码如下var myIcon L.divIcon({ iconSize: null, className: , popupAnchor:[5,5], shadowAnchor:[5,5], html: buildShowInfo(i,color,areaData) }); //中心点位 L.marker(areaLayer.getBounds().getCenter(), { icon: myIcon}).addTo(showLayerGroup); function buildShowInfo(index,color,data){ var result div classmarsBlackPanel stylebackground: color ; animation-spaceInDowndiv classmarsBlackPanel-text (index 1) 、 data.areaName 【 data.type 】span classtemperature/span/div; result div classmarsBlackPanel-textdata.cityNamespan classtemperature/span/div; result /div; return result; }增加了文字标注后的效果如下3、图例展示最后为了在地图上直接展示不同的颜色表示的地区信息即图例展示。还可以在系统中增加动态图例的功能。legendData.push({ label: ??areaData.areaName, type: rectangle, radius: 12, color: color, fillColor: color, fillOpacity: 0.8, weight: 2}); function initLegend(legendData){ const legend L.control.Legend({ position: bottomright, collapsed: false, symbolWidth: 35, opacity: 1, title:图例, column: 2, legends: legendData }).addTo(mymap); }加上了图例后的效果如下在这里我们可以在Leaflet当中查看缅甸与云南省各区县的相邻关系将地图放大后可以看到接面的信息如下图中红色框中的标识所示4、与缅甸距离较近的区县信息为了方便大家对距离缅甸较近的云南省区县信息有一个直观的展示这里将空间数据库中的查询结果直接贴出来方便大家进行查询。city_name area_name type 西双版纳傣族自治州 勐腊县 县 普洱市 孟连傣族拉祜族佤族自治县 自治县 保山市 龙陵县 县 德宏傣族景颇族自治州 芒市 县级市 怒江傈僳族自治州 福贡县 县 临沧市 沧源佤族自治县 自治县 西双版纳傣族自治州 勐海县 县 西双版纳傣族自治州 景洪市 县级市 德宏傣族景颇族自治州 瑞丽市 县级市 保山市 腾冲市 县级市 普洱市 西盟佤族自治县 自治县 临沧市 耿马傣族佤族自治县 自治县 怒江傈僳族自治州 泸水市 市辖区 普洱市 澜沧拉祜族自治县 自治县 德宏傣族景颇族自治州 陇川县 县 临沧市 镇康县 县 怒江傈僳族自治州 贡山独龙族怒族自治县 自治县 德宏傣族景颇族自治州 盈江县 县一共有这19个区县。四、总结以上就是本文的主要内容文章首先介绍如何进行空间距离求解然后结合PgAdmin来进行空间查询实践最后使用SpringBoot框架结合PostGIS来详细说明如何进行云南的边防线WebGIS可视化实战。千里边防线漫漫感谢为我们守护安全的那些人。行文仓促难免有许多不足之处如有不足还恳请各位专家朋友在评论区留言批评指正不胜感激。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2413756.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!