基于SpringBoot和PostGIS的各国及所属机场信息检索及可视化实现
目录
前言
一、空间数据简介
1、全球国家信息表
2、机场信息表
3、国家机场检索实现
二、SpringBoot后台实现
1、模型层实现
2、控制层实现
三、WebGIS可视化实现
1、Leaflet界面实现
2、国家及其机场可视化成果
3、全球机场数量排行榜
四、总结
前言
新春佳节即将来临,辛苦了一年,很多人都已经在准备打包行李,即将踏上回家的路程。生活不易,在此预祝大家春节愉快,全家兴趣。随着时代的进步以及交通方式的变革,现如今人们出行的方式也是多种多样,以前传统的火车,在没有高铁的年代,在春运开启时,各个火车站的售票点都是人头攒动,那一张小小的车票,毕竟联系着归家的思念。绿皮车是多少游子的归家主要交通方式,除了火车,还有私家汽车,还有一些云贵地区的打工人,他们选择和妻子一起骑摩托车回家,为了节约一些交通的成本。想想以前,航空出行绝对是大多数人轻易不会选择的出行方式,不仅其成本较高,同时航空出行所能携带的行李较少。现在我们国家的机场与铁路、汽车站的关联越来越紧密,有的更是形成了一个结合体,比如上海的虹桥机场和虹桥高铁站就在一起,不论是通过高铁出行还是飞机出行,在这个综合体里面也是可以实现快速的换乘。而其它的城市,在传统的交通出行里面,大多选择的是机场大巴,或者打的前往,现在很多都修建了地铁,还有的地方有磁悬浮,比如运行在湖南长沙南高铁站到长沙黄花国际机场的中低速磁悬浮专线,除了有专门的磁悬浮以外,还有地铁6号线直通机场航站楼。这是我国的机场交通及其联系紧密程度的一个缩影。下图是我国的机场空间分布情况示意图:
对于我国和外国的联系而言,航空作为一种快速便捷的交通方式,比航航更加人性化,在人员的流动当中具有先天的优势。相对与货轮或者商船在茫茫的大洋上的慢慢航程,乘坐飞机将大大的加快了国与国之前的旅程。因此,不论是研究国内的航空布局或者飞行格局、交通方式优化,还是研究国内外的联系程度,在疫情的时候,对相关的涉疫国家进行及时的管控,对于切断疫情的传播有非常大的帮助。因此,研究世界各国的机场规模及空间布局也是一个重要的课题。虽然在之前的系列博客中,曾经对飞行格局以及机场的数据处理进行一定的介绍和讲解,如:基于SpringBoot和PostGIS的全球机场入库实践和基于SpringBoot和Leaflet的全球机场空间分布可视化实战,在这两篇文章中,我们侧重是讲了数据的采集和数据的入库、检索、空间可视化,但是缺乏从国家这个维度来进行展示和分析。
有一些朋友通过留言和其他方式进行联系,表示希望可以结合国家信息和机场信息来进行综合的展示实现讲解。本文重点讲解如何基于SpringBoot和PostGIS来进行国家和所属机场的WebGIS可视化实践。通过本文,您不仅可以学习到如何进行SpringBoot和PostGIS进行WebGIS开发,同时可以从全球的视角来观察国家的航空格局,下一步,我们可以结合飞行网站的航班数据,进一步构建全球视角下的航空关联,为研究国际及区域的联系度进行准确的评估和支撑。
一、空间数据简介
本节重点介绍空间数据涉及的两张表,第一张是全球国家信息表,第二张是全球机场信息表。国家信息表与机场信息表是一对多的关系。这两表在之前的博客中虽然有所提及,但是为了第一次看博客的朋友们对空间数据表有一定的认识,这里仍然占用一点篇幅来进行讲解,如果看过期之前的博客内容的朋友可以看剩下的其它内容。
1、全球国家信息表
全球国家信息表主要包含:英文全称、英文简称、最简名称、中文全称、中文简称、所属大洲、大洲详情、空间Geom等八个字段。
使用SQL语句来查询一下数据:
select * from biz_world_country;
在客户端中可以看到以下返回:
2、机场信息表
机场信息表主要包含:IATA三字码、中文名称、英文名称、经度-wgs84、纬度-wgs84、城市名称、国家英文简称、国家/地区中文、Geom空间字段信息。其表结构如下图所示:
同样使用SQL语句查询机场信息可以看到以下信息,
关于国家信息以及机场信息,大家可以在互联网上找到,需要注意的是,对于国家和地区的矢量边界数据,涉及一些特殊地区的,请使用标准地图,自己学习使用无关,不可用于商业。
3、国家机场检索实现
在空间中进行数据的包含查询,一般采用空间函数st_contains来进行,虽然在之前的机场信息表中预留了国家信息,但是该字段我们仅用来进行展示使用,在进行空间包含查询时,以两张空间表的Geom字段作为关联字段。查询的SQL语句如下:
select mb.* from biz_world_country tc,biz_global_airport_info mb
where st_contains(tc.geom, mb.geom) and tc.pk_id = 1843094044926840833;
执行上述的语句之后,在数据库客户端中可以看到如下的执行结果:
可以看到,我国的机场数量已经纳入到数据库中的有317条(数据来源于互联网分享),如有不准,还请各位私信联系。 关于其它国家的机场数量,这列暂且不表,最后我们会对全球的航空机场数量进行一个排名。以上就是本节的空间数据的简介。希望对大家理解有所帮助。
二、SpringBoot后台实现
本节将详细讲解如何使用SpringBoot进行后台功能的实现,主要包含两个方面的内容。第一个是模型层的实现,第二个是控制层的实现。
1、模型层实现
与上一节介绍的空间信息表对应,模型层也包含两个方面的内容。即全球国家实体类以及数据库操作Mapper类、机场实体类和数据库操作Mapper类。其主要内容如下图中的思维导图所示:
在国家信息模型与机场信息模型中,信息实体指的就是实体类,与对应的空间数据表拥有逐一对应的关系,而数据操作实体主要是基于实体类的数据操作。比如数据的新增、修改、查询检索等。在国家的信息检索中,需要提供一个按照国家中文简称的查询,以及根据国家id返回其对应的国家空间范围GeoJSON数据方法。如下表所示:
序号 | 方法 | 说明 |
1 | TableDataInfo list(WorldCountries wCountry) | 根据条件查询国家分页列表 |
2 | AjaxResult getGeojson(@PathVariable("id") Long id) | 根据id查询对应国家GeoJSON |
与国家Mapper操作实体一样的是,在机场Mapper实体也需要对应的操作方法。
序号 | 方法 | 说明 |
1 | GlobalAirportInfo findGeoJsonById(@Param("id")Long id) | 根据id查询对应机场GeoJSON |
2 | List<GlobalAirportInfo> findAirportListByCountryId(@Param("countryId") Long countryId,@Param("name") String name) | 根据国家id和机场名称查询满足条件的机场列表 |
来看下具体的Java实现代码,这里以GlobalAirportInfoMapper.java为例:
package com.yelang.project.transportation.flight.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.transportation.flight.domain.GlobalAirportInfo;
public interface GlobalAirportInfoMapper extends BaseMapper<GlobalAirportInfo>{static final String FIND_GEOJSON_SQL="<script>"+ "select st_asgeojson(geom) as geomJson from biz_global_airport_info "+ "where pk_id = #{id} "+ "</script>";@Select(FIND_GEOJSON_SQL)GlobalAirportInfo findGeoJsonById(@Param("id")Long id);static final String FIND_AIRPORTLIST_BY_COUNTRYID_SQL = "<script>"+ "select mb.* from biz_world_country tc,biz_global_airport_info mb "+ "where st_contains(tc.geom, mb.geom) and tc.pk_id = #{countryId} "+ "<if test='null != name'> and name_zh like concat('%', #{name}, '%')</if>"+ "</script>";@Select(FIND_AIRPORTLIST_BY_COUNTRYID_SQL)List<GlobalAirportInfo> findAirportListByCountryId(@Param("countryId") Long countryId,@Param("name") String name);
}
2、控制层实现
控制层是对外提供web服务的核心处理类,所有与外部交互的方法都将定义在这一层。对于需要展示国家及其机场的列表而言,在我们的界面上,需要同时展示两个列表,有两个查询条件,需要展示不同的GeoJSON数据,还需要进行关联查询。比如机场的信息列表,在切换国家后,需要进行及时的改变。关于国家信息管理的API来说,比较简单,这里将机场信息接口的API开发进行示例说明。
/*** - 获取机场信息列表* @param * @return
*/
@PostMapping("/allairport")
@ResponseBody
public AjaxResult allairport(Long countryId){List<GlobalAirportInfo> list = airportInfoService.findAirportListByCountryId(countryId,null);AjaxResult ar = AjaxResult.success();ar.put("data", list);return ar;
}
/*** 分页获取国家机场信息列表
*/
@RequiresPermissions("trans:flight:airportinfo:countrymap:pagelist")
@PostMapping("/pagelist/bycountry")
@ResponseBody
public TableDataInfo databycountry(Long countryId,String airportName){startPage();List<GlobalAirportInfo> list = airportInfoService.findAirportListByCountryId(countryId,airportName);return getDataTable(list);
}
上述的代码中,对于机场的信息列表和分页列表,为了方便,我们使用两个接口来进行实现,其实可以做合并实现,或者将数据的展示转换成WMS或者其它的矢量瓦片底图展示。这样的话就可以大大的减少系统接口的冗余,在大规模的数据场景中也能提高访问性能。 以上就是SpringBoot后台的实现。
三、WebGIS可视化实现
Web界面作为应用层,是我们系统的门户,系统所有的功能都需要使用界面的形式为用户提供服务。本节将重点介绍如何在WebGIS中来实现相应的国家和机场信息的展示。在WebGIS当中,我们需要实现的功能有,使用siderbar进行国家和机场信息的列表展示,同时支持两个列表的信息查询,国家中文名称以及机场中文名称的检索;支持国家和机场信息的联动。即国家信息切换后,机场信息列表也会自动同步切换。
1、Leaflet界面实现
为了方便的在界面上进行搜索和展示,我们将使用siderbar来分别展示国家信息列表和机场信息列表。左边的siderbar展示国家信息,右边的siderbar展示机场信息。在左边的国家列表点击机场按钮,右边的机场列表将自动刷新,重新请求后台,实现机场信息的查询。关于如何在若依中进行双表格查询参数的绑定和实现,请参考之前的博客。为了在界面中最大的展示地图界面,我们使用点击机场信息后,缩进国家信息表格的方式。关键代码如下:
function initSidebar(){//初始化sidebar页面sidebar = L.control.sidebar('sidebar', {position: 'left'}).addTo(mymap);//默认sidebar打开,并展示一个tab页sidebar.open();$("#xz_info").addClass("active");$("#home").addClass("active");//初始化行政区划表格initWorldCountryTable();rightSidebar = L.control.sidebar('sidebar-right', {position: 'right'}).addTo(mymap);initAirportTable();
}
对于在Leaflet当中进行GeoJSON数据的展示以及地图的展示,在此不再赘述,如果需要具体的代码的,可以私信联系,可以交流。
2、国家及其机场可视化成果
在实现了数据WebGIS展示之后,我们来看下不同的国家的机场信息分布情况,以此来检验一下系统的实现是否满足了我们的预期。
美国及机场分布概况图
美国阿拉斯加地区的机场分布示意图
南非及其机场分布示意图
巴西及其机场分布示意图
印度以及机场分布示意图
以上就是一些国家及其机场的分布示意图,当然这些国家仅仅是一些列举的国家,如果有大家感兴趣又没有展示出来的,可以私信,将空间分布示意图发给大家。
3、全球机场数量排行榜
最后我们来看一下全球国家机场的数量排行榜,这里我们取TOP10的排名列表展示。查询SQL学下所示,实现的逻辑就是将国家和机场细信息进行关联查询,同样是采用空间包含的函数,然后根据国家进行分组,求解机场的数量。查询SQL如下:
select distinct count(1),max(tc.full_chinese_name) cname from biz_world_country tc,biz_global_airport_info mb
where st_contains(tc.geom, mb.geom) group by tc.pk_id order by count desc limit 10;
在客户端中可以看到如下输出:
count cname
2112 美利坚合众国
597 澳大利亚
484 加拿大
354 巴西
333 巴布亚新几内亚
317 中华人民共和国
204 俄罗斯联邦
195 印度尼西亚共和国
151 哥伦比亚
141 印度
从上表可以看出,美国的机场数量是一骑绝尘,名列榜首。排在第二名的是澳大利亚,第三名是加拿大,第四名是巴西。
四、总结
以上就是本文的主要内容,本文重点讲解如何基于SpringBoot和PostGIS来进行国家和所属机场的WebGIS可视化实践。通过本文,您不仅可以学习到如何进行SpringBoot和PostGIS进行WebGIS开发,同时可以从全球的视角来观察国家的航空格局,下一步,我们可以结合飞行网站的航班数据,进一步构建全球视角下的航空关联,为研究国际及区域的联系度进行准确的评估和支撑。行文仓促,定有许多不足之处,如有不足,还恳请各位专家博主在评论区留言指出,万分感谢。
相关文章:

基于SpringBoot和PostGIS的各国及所属机场信息检索及可视化实现
目录 前言 一、空间数据简介 1、全球国家信息表 2、机场信息表 3、国家机场检索实现 二、SpringBoot后台实现 1、模型层实现 2、控制层实现 三、WebGIS可视化实现 1、Leaflet界面实现 2、国家及其机场可视化成果 3、全球机场数量排行榜 四、总结 前言 新春佳节即将…...

python http server运行Angular 单页面路由时重定向,解决404问题
问题 当Angular在本地ng server运行时候,可以顺利访问各级路由。 但是运行ng build后,在dist 路径下的打包好的额index.html 必须要在服务器下运行才能加载。 在服务器下我们第一次访问路由页面时是没有问题的,但是尝试刷新页面或手动输入路…...
GPT-4o背后的语音技术
GPT-4o背后的语音技术 GPT-4o是一个any2any的多模态模型,能够接受文本、音频、图像、视频等多模态输入,也能够生成包含文本、语音、图像和视频等混合内容的多模态输出。本文主要谈语音多模态的实现,并分享一些对于语音研究未来发展的看法。 GPT-4o (“o” 代表 “omni”) …...

微透镜阵列精准全检,白光干涉3D自动量测方案提效70%
广泛应用的微透镜阵列 微透镜是一种常见的微光学元件,通过设计微透镜,可对入射光进行扩散、光束整形、光线均分、光学聚焦、集成成像等调制,进而实现许多传统光学元器件难以实现的特殊功能。 微透镜阵列(Microlens Array&#x…...
Spring boot框架下的RocketMQ消息中间件
1. RocketMQ 基础概念 1.1 核心概念 以下是 RocketMQ 核心概念在 Spring Boot 的 Java 后端代码中的实际使用方式: Producer(生产者) 定义:Producer 是负责发送消息到 RocketMQ 的组件。它可以将消息发送到指定的 Topic。 实…...

记录一次 centos 启动失败
文章目录 现场1分析1现场2分析2搜索实际解决过程 现场1 一次断电,导致 之前能正常启动的centos 7.7 起不来了有部分log , 关键信息如下 [1.332724] XFS(sda3): Internal error xfs ... at line xxx of fs/xfs/xfs_trans.c [1.332724] XFS(sda3): Corruption of in-memory data…...

C++学习第五天
创作过程中难免有不足,若您发现本文内容有误,恳请不吝赐教。 提示:以下是本篇文章正文内容,下面案例可供参考 一、构造函数 问题1 关于编译器生成的默认成员函数,很多童鞋会有疑惑:不实现构造函数的情况下…...

openharmony标准系统方案之瑞芯微RK3568移植案例
标准系统方案之瑞芯微RK3568移植案例 本文章是基于瑞芯微RK3568芯片的DAYU200开发板,进行标准系统相关功能的移植,主要包括产品配置添加,内核启动、升级,音频ADM化,Camera,TP,LCD,…...
深入理解 SSH 端口转发:本地 vs 远程 vs 动态转发
🌟 简介 SSH 端口转发(SSH Port Forwarding)作为一种强大而灵活的技术,不仅可以帮助我们安全地访问远程服务,还能轻松突破网络限制。本文将带你深入了解 SSH 端口转发的原理、类型和实战应用。 🌈 目录 &a…...

postman请求参数化
postman界面介绍 一、使用环境变量(Environment Variables)进行参数化 1、在请求中使用环境变量 在请求的url、请求头(Headers)、请求体(Body)等部分都可以使用环境变量。 URL 部分示例 点击 Postman 界面右上角的 “眼睛” 图标(Environment Quick Look)打开环境管理…...
基于 WEB 开发的汽车养护系统设计与实现
标题:基于 WEB 开发的汽车养护系统设计与实现 内容:1.摘要 本文介绍了基于 WEB 开发的汽车养护系统的设计与实现。文章首先阐述了系统的背景和目的,即随着汽车保有量的增加,汽车养护需求日益增长,传统的汽车养护方式已经无法满足人们的需求&…...
Nginx正向代理配置
Nginx 正向代理默认只支持 http 协议,不支持 https 协议,需借助 "ngx_http_proxy_connect_module" 模块实现 https 正向代理,详情请参考: https://github.com/chobits/ngx_http_proxy_connect_module 安装Nginx某些模块…...

本地仓库管理之当前分支内的操作
以刚搭建好的git仓库为例,刚搭建完的仓库只有master分支,使用git branch查看当前的分支情况。 elfubuntu:~/work/example/hello$ git branch *所在分支为当前分支,即master分支 当前分支进行源码修改时简单流程图如下: 在当前分…...
《内网穿透:网络拓展与安全防护的平衡艺术》
一、引言:开启内网穿透的大门 在当今数字化浪潮席卷全球的时代,网络已成为人们生活和工作中不可或缺的一部分。我们日常使用的网络,如同一个庞大而复杂的生态系统,其中内网和外网犹如两个相互关联却又有所区别的世界。 想象一下…...
【python写个可以运行的2048小游戏】
写一个完整的2048小游戏在Python中是一个相对复杂的任务,因为它涉及到用户界面、事件处理、游戏逻辑等多个方面。为了简化这个过程,我们可以使用Python的图形库,比如pygame。下面是一个简单的2048游戏的实现。 首先,确保你已经安…...

【Flink系列】9. Flink容错机制
9. 容错机制 在Flink中,有一套完整的容错机制来保证故障后的恢复,其中最重要的就是检查点。 9.1 检查点(Checkpoint) 9.1.1 检查点的保存 1)周期性的触发保存 “随时存档”确实恢复起来方便,可是需要我…...
DETR论文阅读
1. 动机 传统的目标检测任务需要大量的人工先验知识,例如预定义的先验anchor,NMS后处理策略等。这些人工先验知识引入了很多人为因素,且较难处理。如果能够端到端到直接生成目标检测结果,将会使问题变得很优雅。 2. 主要贡献 提…...

关于vite+vue3+ts项目中env.d.ts 文件详解
env.d.ts 文件是 Vite 项目中用于定义全局类型声明的 TypeScript 文件。它帮助开发者向 TypeScript提供全局的类型提示,特别是在使用一些特定于 Vite 的功能时(如 import.meta.env)。以下是详细讲解及代码示例 文章目录 **1. env.d.ts 文件的…...

如何优化Elasticsearch大文档查询?
记录一次业务复杂场景下DSL优化的过程 背景 B端商城业务有一个场景就是客户可见的产品列表是需要N多闸口及各种其它逻辑组合过滤的,各种闸口数据及产品数据都是存储在ES的(有的是独立索引,有的是作为产品属性存储在产品文档上)。 在实际使用的过程中&a…...

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正
Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正 1 添加依赖2 测试代码3 测试结果 在OpenCV中,仿射变换(Affine Transformation)和透视变换(Perspective Transformation)是两种常用的图像几何变换方法。 变换方…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...