基于SpringBoot和PostGIS的全球机场入库实践

举报
夜郎king 发表于 2024/12/30 13:08:47 2024/12/30
【摘要】 本文将首先介绍如何进行全球机场数据的整理,如何实现部分国内空数据的补齐等,最后基于SpringBoot将这些采集到的机场信息保存到PostGIS空间数据库中,为下一步深入研究打下坚实的基础。

 目录


前言

一、全球机场数据基础

1、通用运费网

2、全球机场基础数据 

二、数据清理及空间表设计

1、数据清理

2、空间表设计

3、空间数据入库及可视化

1、空间数据入库

2、全球机场可视化

四、总结



前言

        在全球化的大背景下,机场作为连接世界的桥梁,其空间分布对经济、文化和政治交流具有深远的影响。随着信息技术(IT)的不断进步,全球机场的空间分布正在经历一场革命性的变革。本文将探讨全球机场的空间分布,并将这些空间数据进行入空间库管理。全球机场的空间分布一直是航空业和地理学研究的热点。根据研究,美国和欧盟被视为全球民航的“发展极”,而亚太地区则是未来航空增长最具潜力的区域。

        IT技术在全球机场空间分布中扮演着越来越重要的角色。例如,通过深度学习技术,可以对全球开放数据库中的机场空间位置进行验证。这项技术通过融合多个数据集,提高了机场位置数据的准确性和完整性,为全球机场的空间分布研究提供了强有力的数据支持。此外,5G技术的应用也为全球机场空间分布带来了新的可能性。5G技术能够提供更快的数据传输速度和更低的延迟,这对于机场的运营效率和旅客体验至关重要。5G技术的应用案例包括智能行李跟踪、互联机库和数字停车等,这些都能实现高效的能效管理。随着5G技术的普及,我们可以预见,全球机场的空间分布将更加依赖于这些先进技术,以实现更高效的资源配置和旅客服务。

        在全球范围内,机场的空间分布也受到多机场区域发展的影响。研究表明,全球共有170个多机场区域,涉及479个重要机场,主要分布在北美、南亚。这些多机场区域的发展特征和内部竞争强度,对全球机场的空间分布有着重要影响。IT技术,如大数据分析和人工智能,可以帮助优化这些区域内部的航线和航班时刻资源,降低航班延误,提高区域容量。

        要想研究全球的交通格局,最基础的要搜集的数据就是全球的机场信息,有了全球的机场区位信息,再结合全球空间格局,通过交叉分析来实现全球大交通的空间格局构建将变得可行。因此本文将首先介绍如何进行全球机场数据的整理,如何实现部分国内空数据的补齐等,最后基于SpringBoot将这些采集到的机场信息保存到PostGIS空间数据库中,为下一步深入研究打下坚实的基础。

一、全球机场数据基础

        本节将介绍一些基础网站,上面有比较完整的全球机场数据,不仅有比较详细的机场信息简介,同时还包含机场位置信息。通过本节的知识介绍,大家可以通过这些网站来获取基础信息。

1、通用运费网

        通用运费网是一个包含交通元素的网站,尤其包含国际的航运比如航空、海运等相关的信息,旗下包含的信息如下所示:

        感兴趣的朋友可以在其官网网站上查看相应的信息,使用浏览器打开其官网网站后可以看到以下的界面,在其界面上就包含了上面罗列的这些信息,以美国为例。

        在上面的机场列表中,点击任意一个机场的超链接,打开机场信息详情,如下图所示:

        这里就包含了机场的经纬度信息。大家可以去获取这些位置信息,然后保存到数据库中。以此来完成全球机场的空间数据整理工作。

2、全球机场基础数据 

        如果大家想直接使用互联网上的数据,这样可以减少很多的工作量,这里分享一个知乎上网友分享的数据,经过验证,数据比较全,全球一共有大约9600条信息。感兴趣的朋友可以在知乎上找到原文链接:【9597条】全球机场大揭秘!2024年最新世界机场信息一网打尽,GIS必备!。这里将数据下载到了本地,数据源是Excel格式的,这里将展示部分下载后的数据。

        数据中包含的数据列包括:

序号 数据列 值示例
1 IATA/三字代码 CSX
2 中文名称 长沙黄花
3 英文名称 Changsha Huanghua
4 经度 113.21459
5 纬度 28.193336
6 城市 长沙
7 国家英文简称 CN
8 国家中文 中国内地

        在后续的空间数据库建库中,我们将按照这个表结构进行物理结构建模。

二、数据清理及空间表设计

        在有了基础数据源之后,我们就需要对这些基础数据进行管理。以上述的Excel数据源为例,它的部分机场是缺乏空间经纬度坐标的。因此需要我们采用人工的方式进行补齐。本节我们重点讲解如何进行数据清理以及对应的空间表设计。

1、数据清理

        为了保障入库的数据的准确性,我们先来看一下数据有没有一些明显的问题,最起码得是要保证机场位置的坐标不能为空,而对于机场的名称是可以为空的。如果有为空的坐标点,我们需要对这些坐标点进行人工补齐。然后再进行空间入库。

        可以看到,以中国内地为例,有一些通用机场的位置是没有的。针对国内的数据,我们可以采用高德地图的API或者在线底图的方式进行采集。 如果是量小,使用手工采集的方式即可,如果量大,建议使用API的方式进行转化。​

        在控制台中可以获取对应的坐标,然后使用我们之前讲过的高德坐标转WGS84坐标的方式进行转换,最后得到准确的位置信息。 

2、空间表设计

        空间表的设计保持与Excel的一一对应,需要增加的是空间字段Geometry即可。表物理结构如下图所示:

         这里直接将空间表的物理结构贴出来:

CREATE TABLE "public"."biz_global_airport_info" (
  "pk_id" int8 NOT NULL,
  "iata_code" varchar(5) COLLATE "pg_catalog"."default" NOT NULL,
  "name_zh" varchar(100) COLLATE "pg_catalog"."default",
  "name_en" varchar(100) COLLATE "pg_catalog"."default",
  "lon_wgs84" numeric(18,11),
  "lat_wgs84" numeric(18,11),
  "city_name" varchar(30) COLLATE "pg_catalog"."default",
  "national_name_en_short" varchar(10) COLLATE "pg_catalog"."default",
  "national_name_zh" varchar(30) COLLATE "pg_catalog"."default",
  "geom" "public"."geometry",
  CONSTRAINT "pk_biz_global_airport_info" PRIMARY KEY ("pk_id")
);

CREATE INDEX "idx_biz_global_airport_info_geom" ON "public"."biz_global_airport_info" USING gist (
  "geom" "public"."gist_geometry_ops_2d"
);

COMMENT ON COLUMN "public"."biz_global_airport_info"."pk_id" IS '主键';
COMMENT ON COLUMN "public"."biz_global_airport_info"."iata_code" IS 'IATA三字码';
COMMENT ON COLUMN "public"."biz_global_airport_info"."name_zh" IS '中文名称';
COMMENT ON COLUMN "public"."biz_global_airport_info"."name_en" IS '英文名称';
COMMENT ON COLUMN "public"."biz_global_airport_info"."lon_wgs84" IS '经度-wgs84';
COMMENT ON COLUMN "public"."biz_global_airport_info"."lat_wgs84" IS '纬度-wgs84';
COMMENT ON COLUMN "public"."biz_global_airport_info"."city_name" IS '城市名称';
COMMENT ON COLUMN "public"."biz_global_airport_info"."national_name_en_short" IS '国家英文简称';
COMMENT ON COLUMN "public"."biz_global_airport_info"."national_name_zh" IS '国家/地区中文';
COMMENT ON TABLE "public"."biz_global_airport_info" IS '全球机场信息表,用于存储机场基本信息';

        以上就是如何进行空间数据清理以及空间表结构设计的主要内容,通过本小节可以掌握如何进行快速的空白数据补齐和空间表设计。

三、空间数据入库及可视化

        在设计了空间表之后,我们需要编写入库脚本实现将Excel数据导入到空间数据库中。本小节将重点讲解如何使用Java自动识别Excel数据,然后使用Mybatis-Plus进行空间数据入库,最后基于pgAmdin实现对空间数据的预览。

1、空间数据入库

        空间数据入库比较简单,主要的难点在于如何实现Excel的读取与将Excel的每一行转换成一个对象,最后将这些数据批量的导入的空间表中。实现Excel读取的工具使用POI的工具,这里的POI并不是兴趣点。在导入之前,需要先定义与Excel的对应关系,通过@Excel注解来进行标记。实体类的定义如下所示:

package com.yelang.project.transportation.flight.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yelang.framework.aspectj.lang.annotation.Excel;
import com.yelang.framework.handler.PgGeometryTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
 * - 全球机场信息表,用于存储机场基本信息
 * @author 夜郎king
 */
@TableName(value = "biz_global_airport_info", autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class GlobalAirportInfo implements Serializable {
	private static final long serialVersionUID = -8118898216856489475L;
	@TableId(value = "pk_id")
	private Long pkId;// 主键
	@TableField(value = "iata_code")
	@Excel(name = "IATA/三字代码")
	private String iataCode;// IATA三字码
	@TableField(value = "name_zh")
	@Excel(name = "中文名称")
	private String nameZh;// 中文名称
	@TableField(value = "name_en")
	@Excel(name = "英文名称")
	private String nameEn;// 英文名称
	@TableField(value = "lon_wgs84")
	@Excel(name = "经度")
	private BigDecimal lonWgs84;// 经度-wgs84
	@TableField(value = "lat_wgs84")
	@Excel(name = "纬度")
	private BigDecimal latWgs84;// 纬度-wgs84
	@TableField(value = "city_name")
	@Excel(name = "城市")
	private String cityName;// 城市名称
	@TableField(value = "national_name_en_short")
	@Excel(name = "国家英文简称")
	private String nationalNameEnShort;// 国家英文简称
	@TableField(value = "national_name_zh")
	@Excel(name = "国家中文")
	private String nationalNameZh;// 国家/地区中文
	@TableField(typeHandler = PgGeometryTypeHandler.class)
	private String geom;
	@TableField(exist = false)
	private String geomJson;
	public GlobalAirportInfo(String iataCode, String nameZh, String nameEn, BigDecimal lonWgs84, BigDecimal latWgs84,
			String cityName, String nationalNameEnShort, String nationalNameZh, String geom) {
		super();
		this.iataCode = iataCode;
		this.nameZh = nameZh;
		this.nameEn = nameEn;
		this.lonWgs84 = lonWgs84;
		this.latWgs84 = latWgs84;
		this.cityName = cityName;
		this.nationalNameEnShort = nationalNameEnShort;
		this.nationalNameZh = nationalNameZh;
		this.geom = geom;
	}
}

        然后使用Mybatis-Plus的批量操作API实现数据批量入库,考虑到大家对Mybatis-Plus的相关操作比较熟悉,因此对于Mapper的定义和Servcie层的代码开发不再进行赘述。入库的详细代码如下:

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestBlobalAirportInfo2Db {
	@Autowired
	private IGlobalAirportInfoService airportInfoService;
	@Test
	public void save2PostGIS() {
		try {
			File file = new File("path/2024年最新世界机场信息表(已解压补全).xlsx");
			FileInputStream fis = new FileInputStream(file);
			ExcelUtil<GlobalAirportInfo> util = new ExcelUtil<GlobalAirportInfo>(GlobalAirportInfo.class);
			List<GlobalAirportInfo> dataList = util.importExcel(fis);
			for(GlobalAirportInfo info : dataList) {
				String geom = "SRID=" + 4326 +";POINT (" + info.getLonWgs84() + " " + info.getLatWgs84() + ")";//拼接srid,实现动态写入
				info.setGeom(geom);
			}
			//数据入库 
			airportInfoService.saveBatch(dataList, 300);
			System.out.println("finished...");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

        以上就实现将Excel批量读取到List集合中,然后调用Mybatis-Plus的相关API进行批量入库。

2、全球机场可视化

        为了验证上面的程序是否可以运行,我们需要对上述管理的数据进行可视化。由于篇幅有限,这里不重点进行可视化的介绍。后续会着重对可视化进行讲解,这里仅以pgAdmin来验证数据是否全部入库,首先打开pgAdmin之后,在query tools中打开查询窗口,输入以下的sql语句:

        然后在数据输出页面中可以看到以下的结果:

        在查询结果中的最后一列,可以都看到一个预览的眼睛,可以实现对空间数据的预览。 我们来看一下所有数据的空间展示效果。

        大家可以很明显的看到,美国、欧洲的机场数据都是非常密集的。中国的机场密度也挺大。 后面我们可以针对不同国家的机场数据做一次深入的分析。以此来评估全球的民航市场和潜力。

四、总结

        以上就是本文的主要内容,本文将首先介绍如何进行全球机场数据的整理,如何实现部分国内空数据的补齐等,最后基于SpringBoot将这些采集到的机场信息保存到PostGIS空间数据库中,为下一步深入研究打下坚实的基础。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区留言批评指正,不甚感谢。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。