最近,有一种说法:“中国经济发展的命脉就是石油和航线”。因此,航线的重要性不言而喻。 近年来,中国的航运业发展迅速,不仅带来了经济效益和社会效益,也带来了就业岗位。因此,我们有必要分析航线分布状况。 为了更好地帮助客户进行航运业务、航线设计、港口定位等决策研究,我们使用基于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 ![](http://image109.360doc.com/DownloadImg/2023/02/2816/261665314_1_20230228042431147.png)
# 读取都市地图文件 读取版图地图文件 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)
![](http://image109.360doc.com/DownloadImg/2023/02/2816/261665314_2_20230228042431225.png)
summary(worldline)
![](http://image109.360doc.com/DownloadImg/2023/02/2816/261665314_3_20230228042431319.png)
统计部分国内站点的出发的航班信息 #北京出发航班 head(worldline[worldline$AIRPORT_FROCODE=="PEK",] )
![](http://image109.360doc.com/DownloadImg/2023/02/2816/261665314_4_20230228042431538.png)
排序 e$AIRPORT_TOCDE)[2,], decreasing = TRUE)))
![](http://image109.360doc.com/DownloadImg/2023/02/2816/261665314_5_20230228042431741.png)
北京到达航班head(worldline[worldine$AIRPORT_TOCODE=="PEK",] )
![](http://pubimage.360doc.com/wz/default.gif)
上海出发航班head(worldline[worlline$AIRPORTFROM_CODE=="SHA",] )
![](http://pubimage.360doc.com/wz/default.gif)
上海到达航班head(worldline[worldline$AIRPOT_T_CODE=="SHA",] )
![](http://pubimage.360doc.com/wz/default.gif)
香港出发航班head(worldline[worldline$ARPORT_FRO_CODE=="SHA",] )
![](http://pubimage.360doc.com/wz/default.gif)
地图旋转这一步是对地图进行坐标变换,设置中国为世界中心,这里做了简单的坐标加减运算。 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)
![](http://pubimage.360doc.com/wz/default.gif)
|