目录
前言
一、空间数据简介
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开发,同时可以从全球的视角来观察国家的航空格局,下一步,我们可以结合飞行网站的航班数据,进一步构建全球视角下的航空关联,为研究国际及区域的联系度进行准确的评估和支撑。行文仓促,定有许多不足之处,如有不足,还恳请各位专家博主在评论区留言指出,万分感谢。