最近,有一种说法:“中国经济发展的命脉就是石油和航线”。因此,航线的重要性不言而喻。
近年来,中国的航运业发展迅速,不仅带来了经济效益和社会效益,也带来了就业岗位。
因此,我们有必要分析航线分布状况。
为了更好地帮助客户进行航运业务、航线设计、港口定位等决策研究,我们使用基于R语言地理信息系统的中国航线分布可视化。
该方法利用地理信息系统的空间数据库管理功能,对中国各航线进行统计和分析,并基于R语言统计分析工具,对分析结果进行可视化处理,生成中国航线的空间分布图。
读取地图绘制所需的包
以下软件包均是绘制地图相关的 。
library(maptools)
library(ggplot2)
library(ggmap)
library(maps)
library(rgeos)
library(shapefiles)
library(geosphere)
library(plyr)
获取地图数据来源
航线、机场坐标
机场: airports.dat
航线: routes.dat
板块地图、都市地图
世界地图: ne_10m_admin_0_countries.shp
都市地图: ne_10m_urban_areas.shp
# 读取都市地图文件 读取版图地图文件
urbanareasin <- readShapePoly("ne_0m_uranareas.shp")
worldmapsin <- readShapePol("ne_1_admin_0_countries.shp")
# 以下为格式转化
worldmap <- fortifyworldapsin)
这一部分的主要工作是将shapefile文件转化为R可以识别的格式,然后建立数据与地图坐标间的关联。本文使用了航线频数来计算地图航线绘制的亮度。读者根据需要可以自行关联所需数据,例如成本,平均成本,旅客人次等,以达到不同的研究目的。
# 开始抽取机场数据
airports <- rea.table("airorts.dat", sep = ",", header = FALSE)
worldport <- airports[airpot$V5 != "", c("V3", "V5",
"V7", "V8", "V9")]
names(worldprt) <- c("city", "code", "lan", "lon", "att")
有453条航线无标识
table(lineinworld)
summary(worldline)
统计部分国内站点的出发的航班信息
#北京出发航班
head(worldline[worldline$AIRPORT_FROCODE=="PEK",] )
随时关注您喜欢的主题
排序
e$AIRPORT_TOCDE)[2,],
decreasing = TRUE)))
北京到达航班
head(worldline[worldine$AIRPORT_TOCODE=="PEK",] )
上海出发航班
head(worldline[worlline$AIRPORTFROM_CODE=="SHA",] )
上海到达航班
head(worldline[worldline$AIRPOT_T_CODE=="SHA",] )
香港出发航班
head(worldline[worldline$ARPORT_FRO_CODE=="SHA",] )
地图旋转
这一步是对地图进行坐标变换,设置中国为世界中心,这里做了简单的坐标加减运算。
center <- 115
# 航线坐标计算中心距离
gcircles$long.reenter <- ielse(gcicles$long < center -
由于地图是图形数据,若是简单移动,地图会被切割,绘制时会出现图形变形等错误,故需要对地图数据进行再处理。该过程分为两步:
切割图形重分组算法
处理 1 :图形切割后,切割图形重分组。
处理 2 :重分组后,非闭合图形,闭合处理。
检查组内不同经度300度以上的坐标,作为极端值,然后对数据进行平均 。然后分别对极端值分组标号为一组,将低于300的坐标作为一组。
闭合曲线
分别计算世界点图每个航线的起始点 终点,和航线的曲线数据 . 找到曲线数据中不连续的数据即为没有闭合的曲线 , 然后 , 将断点数据重新赋值 , 进行连接 , 得到闭合的航线曲线 .
g <- rep(1, length(df[, longcol]))
if (diff(rage(df[, lngcol])) > 300) {
d <- df[, longcol] > mean(range(df[, longcol]))
开始写原始算法替换函数 世界地图重分组
#计算世界地图的经纬度的均值
worldmp.men <- agregate(x = wrldmap[, ("long.recenter")],
by = list(worldmap$group), FUN = mean)
#计算世界地图的经纬度的最小值
worldma.min <- aregate( = wrldmap[, c("longrecenter")],
by = list(worldmap$group), FUN = min)
#计算世界地图的经纬度的最大值
woldmap.ma <- aggregate(x worldmap[, c("long.recenter")],
by = list(wormap$group) FUN = max)
worldmap.md <- cbind(worldma.mea, worldap.in[,
2], worldap.max[, 2])
#给数据的变量名命名
colnames(worldmpmd) <- c("group", mean", "min" "max")
worldmapt <- join(x = worldmap, y = wolmap.md, b = c("group"))
# 闭合曲线
worlmap.rg <- orldmap.rg[order(woldm$goup.regroup,
worldmap.rg$order), ]
最后得到世界航线的曲线和坐标 (wrld) 以及城市航线的坐标 (urb), 并使用geom_polygon和geom_line函数进行设置 . 其颜色 粗细等。最后使用ggplot函数进行绘制。
urb <- geom_polygon(aes(long.recenter, lat, group = group.regroup),
size = 0.3, color = "#FDF5E6", fill = "#FDF5E6",
alpha = 1, data = urbanareas.cp)
# 放大系数
bigmap <- 1
geom_polygon(aes(lon,lat,grop = group), size = 0.2,
fill = '#f9f9', colou = 'grey6, data = worldmap) +
geom_line(aes(long.recete,lat,grup = grop.regroup, clor = freq,
alpha = freq), sie = 0.4, dat = gcicles.rg)
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!