基于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数据方法。如下表所示:

序号方法说明
1TableDataInfo list(WorldCountries wCountry)根据条件查询国家分页列表
2AjaxResult getGeojson(@PathVariable("id") Long id)根据id查询对应国家GeoJSON

        与国家Mapper操作实体一样的是,在机场Mapper实体也需要对应的操作方法。

序号方法说明
1GlobalAirportInfo findGeoJsonById(@Param("id")Long id)根据id查询对应机场GeoJSON
2List<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开发,同时可以从全球的视角来观察国家的航空格局,下一步,我们可以结合飞行网站的航班数据,进一步构建全球视角下的航空关联,为研究国际及区域的联系度进行准确的评估和支撑。行文仓促,定有许多不足之处,如有不足,还恳请各位专家博主在评论区留言指出,万分感谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956478.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MLMs之Agent:Phidata的简介、安装和使用方法、案例应用之详细攻略

MLMs之Agent&#xff1a;Phidata的简介、安装和使用方法、案例应用之详细攻略 目录 Phidata简介 Phidata安装和使用方法 1、安装 2、使用方法 (1)、认证 (2)、创建 Agent (3)、运行 Agent (4)、Agent Playground Phidata 案例应用 1、多工具 Agent 2、多模态 Agent …

【机器学习实战入门项目】使用深度学习创建您自己的表情符号

深度学习项目入门——让你更接近数据科学的梦想 表情符号或头像是表示非语言暗示的方式。这些暗示已成为在线聊天、产品评论、品牌情感等的重要组成部分。这也促使数据科学领域越来越多的研究致力于表情驱动的故事讲述。 随着计算机视觉和深度学习的进步&#xff0c;现在可以…

【ArcGIS微课1000例】0140:总览(鹰眼)、放大镜、查看器的用法

文章目录 一、总览工具二、放大镜工具三、查看器工具ArcGIS中提供了三种局部查看的工具: 总览(鹰眼)、放大镜、查看器,如下图所示,本文讲述这三种工具的使用方法。 一、总览工具 为了便于效果查看与比对,本实验采用全球影像数据(位于配套实验数据包中的0140.rar中),加…

从零搭建一套远程手机的桌面操控和文件传输的小工具

从零搭建一套远程手机的桌面操控和文件传输的小工具 --ADB连接专题 一、前言 前面的篇章中&#xff0c;我们确定了通过基于TCP连接的ADB控制远程手机的操作思路。本篇中我们将进行实际的ADB桥接的具体链路搭建工作&#xff0c;从原理和实际部署和操作层面上&#xff0c;从零…

ROS2 与机器人视觉入门教程(ROS2 OpenCV)

系列文章目录 前言 由于现有的ROS2与计算机视觉&#xff08;特别是机器人视觉&#xff09;教程较少&#xff0c;因此根据以往所学与积累的经验&#xff0c;对ROS2与机器人视觉相关理论与代码进行分析说明。 本文简要介绍了机器人视觉。首先介绍 ROS2 中图像发布者和订阅者的基…

JVM 面试八股文

目录 1. 前言 2. JVM 简介 3. JVM 内存划分 3.1 为什么要进行内存划分 3.2 内存划分的核心区域 3.2.1 核心区域一: 程序计数器 3.2.2 核心区域二: 元数据区 3.2.3 核心区域三: 栈 3.2.4 核心区域四: 堆 4. JVM 类加载机制 4.1 类加载的步骤 4.1.1 步骤一: 加载 4…

我的世界-与门、或门、非门等基本门电路实现

一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…

【2024年华为OD机试】 (B卷,100分)- 字符串分割(Java JS PythonC/C++)

一、问题描述 题目解析 问题描述 给定一个非空字符串 s&#xff0c;要求将该字符串分割成若干子串&#xff0c;使得每个子串的 ASCII 码值之和均为“水仙花数”。具体要求如下&#xff1a; 若分割不成功&#xff0c;则返回 0&#xff1b;若分割成功且分割结果不唯一&#x…

Elasticsearch 和arkime 安装

安装一定要注意版本号&#xff0c;不然使用不了 这里Ubuntu使用ubuntu-20.04.6-desktop-amd64.iso elasticsearch这里使用Elasticsearch 7.17.5 | Elastic arkime这里使用wget https://s3.amazonaws.com/files.molo.ch/builds/ubuntu-20.04/arkime_3.4.2-1_amd64.deb 大家想…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证。

MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作。 MySQL主从同步是基…

MySQL 主从复制原理及其工作过程的配置

一、MySQL主从复制原理 MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作…

多平台下Informatica在医疗数据抽取中的应用

一、引言 1.医疗数据抽取与 Informatica 概述 1.1 医疗数据的特点与来源 1.1.1 数据特点 医疗数据具有显著的多样性特点。从数据类型来看&#xff0c;涵盖了结构化数据&#xff0c;如患者的基本信息、检验检查结果等&#xff0c;这些数据通常以表格形式存储&#xff0c;便于…

智能创造的幕后推手:AIGC浪潮下看AI训练师如何塑造智能未来

文章目录 一、AIGC时代的算法与模型训练概览二、算法与模型训练的关键环节三、AI训练师的角色与职责四、AI训练师的专业技能与素养五、AIGC算法与模型训练的未来展望《AI训练师手册&#xff1a;算法与模型训练从入门到精通》亮点内容简介作者简介谷建阳 目录 《AI智能化办公&am…

有限元分析学习——Anasys Workbanch第一阶段笔记(13)网格单元分类、物理场与自由度概念

目录 0 序言 1 网格单元分类 2 各类单元的应用 3 massage与帮助和查看 4 物理场和自由度 4.1 各种单元自由度 4.2 结构自由度 0 序言 本章主要讲解网格单元的分类及物理场和自由度的相关概念。 1 网格单元分类 按单元的形状分类&#xff1a;实体单元、壳单元和杆梁单元…

RC2在线加密工具

RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法&#xff0c;它可作为DES算法的建议替代算法。RC2是一种分组加密算法&#xff0c;RC2的密钥长度可变&#xff0c;可以从8字节到128字节&#xff0c;安全性选择更加灵活。 开发调试上&#xff0c;有时候需要进行对…

深度学习笔记——循环神经网络RNN

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作原…

.NET周刊【1月第1期 2025-01-05】

国内文章 3款.NET开源、功能强大的通讯调试工具&#xff0c;效率提升利器&#xff01; https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具&#xff0c;旨在提高调试效率。这些工具包括LLCOM&#xff0c;提供串口调试和自动化处…

AT8870单通道直流电机驱动芯片

AT8870单通道直流电机驱动芯片 典型应用原理图 描述 AT8870是一款刷式直流电机驱动器&#xff0c;适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器&#xff0c;该驱动器由四个N-MOS组成&#xff0c;能够以高达3.6A的峰值电流双向控制电机。利用电流…

创建 pdf 合同模板

创建 pdf 合同模板 一、前言二、模板展示三、制作过程 一、前言 前段时间要求创建“pdf”模板&#xff0c;学会了后感觉虽然简单&#xff0c;但开始也折腾了好久&#xff0c;这里做个记录。 二、模板展示 要创建这样的模板 三、制作过程 新建一个“Word”&#xff0c;这里命…

【Go】Go数据类型详解—指针

1. 前言 在我看来&#xff0c;一门编程语言语法的核心就在于数据类型。而各类编程语言的基本数据类型大致相同&#xff1a;int整型、float浮点型、string字符串类型、bool布尔类型&#xff0c;但是在一些进阶数据类型上就有所不同了。本文将会介绍Go语言当中核心的数据类型——…