R绘制中国航线分布夜景图_光环大数据培训

来源:互联网 由 光环IT学院 贡献 责任编辑:鲁倩  
http://hadoop.aura-el.com

R绘制中国航线分布夜景图_光环大数据培训

一、地图数据来源

地图所使用的数据均可以从网上下免费下载。

航线、机场坐标:http://openflights.org/data.html

机场:airports.dat

航线:routes.dat

板块地图、都市地图:http://www.naturalearthdata.com/downloads/

世界地图:ne_10m_admin_0_countries.shp

都市地图:ne_10m_urban_areas.shp

(注:都市地图是用来绘制灯光效果的。)

二、地图绘制所需的包

以下软件包均是绘制地图相关的,其中有一些可能没有被直接使用。

library(maptools)library(ggplot2)library(ggmap)library(maps)libra ry(rgeos)library(shapefiles)library(geosphere)library(plyr)library(sp )

在Linux下,R语言中与地理相关的包可能需要安装如下工具:

geos-devel-3.2.2

http://hadoop.aura-el.com

geos-3.2.2

这两个软件互相依赖,需要同时安装、更新。例如对于Linux CentOS 5.5,可以运行如下命令:

yum install geos-devel-3.2.2*.rpm geos-3.2.2*.rpm

三、数据处理

这一部分的主要工作是将shapefile文件转化为R可以识别的格式,然后建立数据与地图坐标间的关联。本文使用了航线频数来计算地图航线绘制的亮度。读者根据需要可以自行关联所需数据,例如成本,平均成本,旅客人次等,以达到不同的研究目的。

函数介绍:

readShapePoly():读取图形文件用,建议直接将解压后的图形文件放在工程环境中。

fortify():将地图数据转化为ggplot可以使用的格式。

gcIntermediate():模拟圆弧,将两点间连线圆弧化。

代码如下:

# 读取都市地图文件读取版图地图文件urbanareasin <- readShapePoly(\

http://hadoop.aura-el.com

read.table(\

\

里的data3.redu2s是我个人的航线数据# 读者可以用上文提到的航线数据routes.dat代替)lineinworld <- (data3.redu2s$AIRPORT_FROM_CODE %in% worldport$code) & (data3.redu2s$AIRPORT_TO_CODE %in% worldport$code)# 有243条航线无标识table(lineinworld)# colnames(data3.upro1)worldline <- data3.redu2s[lineinworld,

c(\

<- merge(flights.ag, worldport, by.x = \

flights.ll$AIRPORT_TO_CODE), ]flights.lf <- merge(flights.ag, worldport, by.x = \

flights.lf$AIRPORT_TO_CODE), ]# beijing.ll <-#

c(worldport$lon[worldport$code=='PEK'],

worldport$lan[worldport$code=='PEK'])rts <- gcIntermediate(flights.lf[,

c(\

as(rts, \

航线信息与航线坐标信息关联flights.ll$id <-

http://hadoop.aura-el.com

as.character(c(1:nrow(flights.ll)))table(gcircles$freq)gcircles <-

merge(rts.ff, flights.ll, all.x = T, by = \

如代码中的注释所述,data3.redu2s这个变量可以从routes.dat读取得到,

过程如下:

data3.redu2s <- read.table(\

FALSE)colnames(data3.redu2s)[c(3, 5)] <- c(\

四、地图旋转

这一步是对地图进行坐标变换,设置中国为世界中心,这里做了简单的坐标

加减运算。代码如下:

r <- 115# 航线坐标计算中心距离gcircles$long.recenter <-

ifelse(gcircles$long < center - 180, gcircles$long + 360,

gcircles$long)# shift coordinates to recenter worldmap worldmap# <-

map_data ('world') 地图坐标偏移worldmap$long.recenter <-

ifelse(worldmap$long < center - 180, worldmap$long + 360,

worldmap$long)urbanareas$long.recenter <- ifelse(urbanareas$long <

center - 180, urbanareas$long + 360, urbanareas$long

由于地图是图形数据,若是简单移动,地图会被切割,绘制时会出现图形变

形等错误,故需要对地图数据进行再处理。该过程分为两步:

处理1:图形切割后,切割图形重分组。

处理2:重分组后,非闭合图形,闭合处理。

http://hadoop.aura-el.com

1. 切割图形重分组

在参考文献中提到的方法如下:

RegroupElements <- function(df, longcol, idcol) { g <- rep(1,

length(df[, longcol])) if (diff(range(df[, longcol])) > 300)

{ # check if longitude within group differs more than # 300

deg, ie if element was split # we use the mean to help us separate

the extreme values d <- df[, longcol] > mean(range(df[, longcol])) # some marker for parts that stay in place # (we cheat here a little,

as we do not take into account concave polygons) g[!d] <- 1 g[d] <- 2 # parts that are moved } # attach to id to create unique

group variable for the dataset g <- paste(df[, idcol], g, sep = \

df$group.regroup <- g df}gcircles.rg <- ddply(gcircles, .(id), RegroupElements, \

以上方法,计算少量图形数据时(如gcircles)效果尚可。但一旦数据量

级提高,其计算效率将极低。笔者电脑(10G内存)运行 urbanareas 数据,内

存占用一度爆表,而且40多分钟未出结果。所以笔者重写了该算法,重写后占

用内存可忽略,10秒内计算完成。

改进算法如下:

# 开始写原始算法替换函数世界地图重分组worldmap.mean <- aggregate(x = worldmap[, c(\

list(worldmap$group), FUN = mean)worldmap.min <- aggregate(x = worldmap[,

c(\

以下内容为系统自动转化的文字版,可能排版等有问题,仅供您参考:

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com R 绘制中国航线分布夜景图_光环大数据培训

一、地图数据来源

地图所使用的数据均可以从网上下免费下载。 航线、机场坐标:http://openflights.org/data.html

机场:airports.dat 航线:routes.dat

板块地图、都市地图:http://www.naturalearthdata.com/downloads/

世界地图:ne_10m_admin_0_countries.shp 都市地图:ne_10m_urban_areas.shp

(注:都市地图是用来绘制灯光效果的。 ) 二、地图绘制所需的包

以下软件包均是绘制地图相关的,其中有一些可能没有被直接使用。

library(maptools)library(ggplot2)library(ggmap)library(maps)libra ry(rgeos)library(shapefiles)library(geosphere)library(plyr)library(sp )

在 Linux 下,R 语言中与地理相关的包可能需要安装如下工具:

geos-devel-3.2.2

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com geos-3.2.2

这两个软件互相依赖,需要同时安装、更新。例如对于 Linux CentOS 5.5, 可以运行如下命令:

yum install geos-devel-3.2.2*.rpm geos-3.2.2*.rpm

三、数据处理

这一部分的主要工作是将 shapefile 文件转化为 R 可以识别的格式, 然后建 立数据与地图坐标间的关联。本文使用了航线频数来计算地图航线绘制的亮度。 读者根据需要可以自行关联所需数据,例如成本,平均成本,旅客人次等,以达 到不同的研究目的。

函数介绍:

readShapePoly():读取图形文件用,建议直接将解压后的图形文件放 在工程环境中。 fortify():将地图数据转化为 ggplot 可以使用的格式。 gcIntermediate():模拟圆弧,将两点间连线圆弧化。

代码如下:

# 读取都市地图文件

读 取 版 图 地 图 文 件 urbanareasin <<-

readShapePoly("ne_10m_urban_areas.shp")worldmapsin

readShapePoly("ne_10m_admin_0_countries.shp")# 以下为格式转化 worldmap <fortify(worldmapsin)urbanareas <-

fortify(urbanareasin)gpclibPermit()# 开 始 抽 取 机 场 数 据 airports <-

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com read.table("airports.dat", sep = ",", header = FALSE)worldport <airports[airports$V5 "V9")]names(worldport) "att")worldport$lan as.numeric(as.character(worldport$lan))worldport$lon != "", <c("V3", c("city", "V5", "code", "V7", "lan", "V8", "lon", <<-

as.numeric(as.character(worldport$lon))# 找出所有航线有标识的机场(这 里的 data3.redu2s 是我个人的航线数据 # 读者可以用上文提到的航线数据 routes.dat 代替) lineinworld <- (data3.redu2s$AIRPORT_FROM_CODE %in% worldport$code) worldport$code)# 有 & 243 (data3.redu2s$AIRPORT_TO_CODE 条 航 线 无 标 识 <%in%

table(lineinworld)#

colnames(data3.upro1)worldline c("AIRPORT_FROM_CODE", ddply(worldline,

data3.redu2s[lineinworld, <-

"AIRPORT_TO_CODE")]flights.ag

c("AIRPORT_FROM_CODE",

"AIRPORT_TO_CODE"),

function(x) count(x$AIRPORT_TO_CODE))# 计算三字码映射到机场 flights.ll <- merge(flights.ag, worldport, by.x = "AIRPORT_TO_CODE", "code", all.x = T)flights.ll by.y = <-

flights.ll[order(flights.ll$AIRPORT_FROM_CODE, flights.ll$AIRPORT_TO_CODE), ]flights.lf <- merge(flights.ag, worldport, by.x = "AIRPORT_FROM_CODE", by.y = "code", all.x = T)flights.lf <-

flights.lf[order(flights.lf$AIRPORT_FROM_CODE, flights.lf$AIRPORT_TO_CODE), ]# beijing.ll <-#

c(worldport$lon[worldport$code=='PEK'], worldport$lan[worldport$code=='PEK'])rts <- gcIntermediate(flights.lf[, c("lon", "lan")], flights.ll[, c("lon", "lan")], 100,

breakAtDateLine = FALSE,

addStartEnd = TRUE, sp = TRUE)# rts.ff <-#

fortify.SpatialLinesDataFrame(rts)flights.lf[,c('lon', 'lan')]rts <as(rts, "SpatialLinesDataFrame")# 航线坐标数据 rts.ff <- fortify(rts)# 航 线 信 息 与 航 线 坐 标 信 息 关 联 flights.ll$id <-

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com as.character(c(1:nrow(flights.ll)))table(gcircles$freq)gcircles merge(rts.ff, flights.ll, all.x = T, by = "id") <-

如代码中的注释所述, data3.redu2s 这个变量可以从 routes.dat 读取得到, 过程如下:

data3.redu2s <- read.table("routes.dat", sep = ",", header = FALSE)colnames(data3.redu2s)[c(3, "AIRPORT_TO_CODE") 5)] <c("AIRPORT_FROM_CODE",

四、地图旋转

这一步是对地图进行坐标变换,设置中国为世界中心,这里做了简单的坐标 加减运算。代码如下:

center <- 115# 航 线 坐 标 计 算 中 心 距 离 gcircles$long.recenter <ifelse(gcircles$long < center 180, gcircles$long + 360,

gcircles$long)# shift coordinates to recenter worldmap worldmap# <map_data ('world') 地 图 坐 标 偏 移 worldmap$long.recenter <-

ifelse(worldmap$long < center worldmap$long)urbanareas$long.recenter

180, worldmap$long + 360, <ifelse(urbanareas$long <

center - 180, urbanareas$long + 360, urbanareas$long

由于地图是图形数据,若是简单移动,地图会被切割,绘制时会出现图形变 形等错误,故需要对地图数据进行再处理。该过程分为两步:

处理 1:图形切割后,切割图形重分组。 处理 2:重分组后,非闭合图形,闭合处理。

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com

1. 切割图形重分组

在参考文献中提到的方法如下:

RegroupElements <- function(df, longcol, idcol) { length(df[, longcol])) {

g <- rep(1,

if (diff(range(df[, longcol])) > 300) # 300

# check if longitude within group differs more than

deg, ie if element was split the extreme values

# we use the mean to help us separate

d <- df[, longcol] > mean(range(df[, longcol])) # (we cheat here a little, g[!d] <- 1

# some marker for parts that stay in place

as we do not take into account concave polygons) g[d] <- 2 # parts that are moved }

# attach to id to create unique

group variable for the dataset df$group.regroup <- g

g <- paste(df[, idcol], g, sep = ".")

df}gcircles.rg <- ddply(gcircles, .(id),

RegroupElements, "long.recenter", "id")

以上方法,计算少量图形数据时(如 gcircles)效果尚可。但一旦数据量 级提高,其计算效率将极低。笔者电脑(10G 内存)运行 urbanareas 数据,内 存占用一度爆表,而且 40 多分钟未出结果。所以笔者重写了该算法,重写后占 用内存可忽略,10 秒内计算完成。

改进算法如下:

# 开 始 写 原 始 算 法 替 换 函 数 世 界 地 图 重 分 组 worldmap.mean <aggregate(x = worldmap[, c("long.recenter")], by =

list(worldmap$group), FUN = mean)worldmap.min <- aggregate(x = worldmap[, c("long.recenter")], by = list(worldmap$group), FUN =

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com min)worldmap.max <- aggregate(x = worldmap[, c("long.recenter")], by = list(worldmap$group), FUN = max)worldmap.md <- cbind(worldmap.mean, worldmap.min[, 2], worldmap.max[, 2])colnames(worldmap.md) <-

c("group", "mean", "min", "max")worldmapt <- join(x = worldmap, y = worldmap.md, by = c("group"))worldmapt$group.regroup <-

1worldmapt[(worldmapt$max > 180) & (worldmapt$min < (worldmapt$long.recenter 2worldmapt$group.regroup worldmapt$group.regroup, 地 图 重 分 组 > 180), <-

180) & <-

c("group.regroup")]

paste(worldmapt$group,

sep = ".")worldmap.rg <- worldmapt# 都市 <= aggregate(x = urbanareas[, FUN =

urbanareas.mean by

c("long.recenter")],

list(urbanareas$group),

mean)urbanareas.min <- aggregate(x = urbanareas[, c("long.recenter")], by = list(urbanareas$group), FUN = min)urbanareas.max <- aggregate(x = urbanareas[, c("long.recenter")], by = list(urbanareas$group), FUN 2],

= max)urbanareas.md <- cbind(urbanareas.mean, urbanareas.min[,

urbanareas.max[, 2])colnames(urbanareas.md) <- c("group", "mean", "min", "max")urbanareast <- join(x = urbanareas, y = urbanareas.md, by =

c("group"))urbanareast$group.regroup <- 1urbanareast[(urbanareast$max > 180) & (urbanareast$min < c("group.regroup")] paste(urbanareast$group, ".")urbanareas.rg <- urbanareast <180) & (urbanareast$long.recenter > 180), 2urbanareast$group.regroup urbanareast$group.regroup, sep <=

2. 闭合曲线

闭合曲线原文也存在算法效率低缺陷,直接上重写的算法:

#

线

worldmap.rg

<-

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com worldmap.rg[order(worldmap.rg$group.regroup, worldmap.rg$order), ]worldmap.begin <]worldmap.end

worldmap.rg[!duplicated(worldmap.rg$group.regroup), <TRUE),

worldmap.rg[c(!duplicated(worldmap.rg$group.regroup)[-1], ]worldmap.flag <& (worldmap.begin$long.recenter (worldmap.begin$lat == == <-

worldmap.end$long.recenter)

worldmap.end$lat)table(worldmap.flag)worldmap.plus

worldmap.begin[!worldmap.flag, ]worldmap.end[!worldmap.flag, ]worldma p.plus$order <- worldmap.end$order[!worldmap.flag] + 1worldmap.cp <rbind(worldmap.rg, worldmap.plus)worldmap.cp <-

worldmap.cp[order(worldmap.cp$group.regroup, worldmap.cp$order), ]urbanareas.rg <-

urbanareas.rg[order(urbanareas.rg$group.regroup, urbanareas.rg$order), ]urbanareas.begin <-

urbanareas.rg[!duplicated(urbanareas.rg$group.regroup), ]urbanareas.e nd <urbanareas.rg[c(!duplicated(urbanareas.rg$group.regroup)[-1], ]urbanareas.flag <(urbanareas.begin$long.recenter & (urbanareas.begin$lat == == <-

TRUE),

urbanareas.end$long.recenter)

urbanareas.end$lat)table(urbanareas.flag)urbanareas.plus urbanareas.begin[!urbanareas.flag, ]urbanareas.plus$order <-

]urbanareas.end[!urbanareas.flag, +

urbanareas.end$order[!urbanareas.flag]

1urbanareas.cp <- rbind(urbanareas.rg, urbanareas.plus)urbanareas.cp <urbanareas.cp[order(urbanareas.cp$group.regroup, urbanareas.cp$order), ]

五、绘制图像

数据齐全了, 该绘制图像了。 本文绘制图像使用了 ggplot 函数, 由于 ggplot2

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com 的参考书籍较多,因此相关函数就不一一介绍。地图的设计是可通过调节放大系 数以输出不同品质的图像,主要分两步: 1. 绘制背景

背景是点线地图,而且精度较高,夜景图边界线意义不大,因此处理起来较 简单。代码如下:

wrld <- geom_polygon(aes(long.recenter, lat, group = group.regroup), size = 0.1, colour = "#090D2A", fill = "#090D2A", worldmap.cp)urb group.regroup), <geom_polygon(aes(long.recenter, alpha = 1, data = lat, group =

size = 0.3, color = "#FDF5E6", fill = "#FDF5E6",

alpha = 1, data = urbanareas.cp)

2. 绘制航线

航线是由线组成的,放大时线的宽度、光晕宽度变化比例与图形变化比例不 一致,需要分开调节。根据图形知识,该变化应是函数关系。这里给出一种较美 观的函数关系,有兴趣的同学可以继续优化该函数。另外本文与原地图的一个不 同之处是增加了光晕效果,图片十分绚丽。其原理是使用高透明度的辅助线。线 的光晕亮度和航线频率相关,相关的代码如下:

# 放大系数 bigmap <- 1airline <- geom_line(aes(long.recenter, lat, group = group.regroup, * alpha = max(freq)^0.6 * freq^0.4, color = 0.9 data =

max(freq)^0.6 * freq^0.4), size = 0.2 * bigmap,

gcircles.rg)airlinep <- geom_line(aes(long.recenter, lat, group = group.regroup, "#FFFFFF", alpha = 0.04 * max(freq)^0.6 * freq^0.4), color = size = 2 * bigmap, data = gcircles.rg)#

table(gcircles.rg$freq)airlinepp <- geom_line(aes(long.recenter, lat,

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com group = group.regroup, color = "#ECFFFF", alpha = 0.02 * max(freq)^0.6 * freq^0.4), size = 4 * bigmap, data = gcircles.rg)airlineppp alpha =

<- geom_line(aes(long.recenter, lat, group = group.regroup, 0.01 * max(freq)^0.6 * freq^0.4), color = "#ECFFFF",

size = 8 * bigmap,

data = gcircles.rg)airlinepppp <- geom_line(aes(long.recenter, lat, group = group.regroup, color = "#BBFFFF", alpha = 0.005 * max(freq)^0.6 * freq^0.4), size = 16 * bigmap, data =

gcircles.rg)gcircles.rg[gcircles.rg$group.regroup == 1.1, ]# plot 画图 到文件 plot2.pngpng(6000 * (bigmap^0.8), 2000 * (bigmap^0.8), file = "plot2.png", bg = "white")ggplot() + wrld + urb + airline + = 1)) "#D9FFFF", + high = "#ECFFFF") + + # # #

scale_colour_gradient(low scale_alpha(range = c(0,

airlineppp

scale_alpha_discrete(range = c(0.001, 0.005)) + scale_alpha(range = c(0.005, 0.015))+

airlinepp + airlinep +

scale_alpha(range = c(0.015, 0.08)) +# geom_polygon(aes(long,lat,group = group), size = 0.2,# fill = '#f9f9f9', colour = 'grey65', data =

worldmap) +# geom_line(aes(long.recenter,lat,group = group.regroup, color = freq,# theme( color = alpha = freq), size = 0.4, data = gcircles.rg) + panel.background = element_rect(fill = "#00001C", "#00001C"), panel.grid = element_blank(),

axis.ticks = element_blank(), axis.text = element_blank(),

axis.title = element_blank(), legend.position = "none") ) +

ylim(-65, 75) + coord_equal()dev.off()

为什么大家选择光环大数据!

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com 大数据培训、 人工智能培训、 Python 培训、 大数据培训机构、 大数据培训班、 数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请大数据 领域具有多年经验的讲师,提高教学的整体质量与教学水准。讲师团及时掌握时 代的技术,将时新的技能融入教学中,让学生所学知识顺应时代所需。通过深入 浅出、通俗易懂的教学方式,指导学生较快的掌握技能知识,帮助莘莘学子实现 就业梦想。

光环大数据启动了推进人工智能人才发展的“AI 智客计划” 。光环大数据专注国内 大数据和人工智能培训,将在人工智能和大数据领域深度合作。未来三年,光环大数据 将联合国内百所大学,通过“AI 智客计划” ,共同推动人工智能产业人才生态建设,培 养和认证 5-10 万名 AI 大数据领域的人才。

参加“AI 智客计划” ,享 2000 元助学金!

【报名方式、详情咨询】 光环大数据网站报名:http://hadoop.aura-el.com 手机报名链接:http:// hadoop.aura-el.com /mobile/

光环大数据 http://hadoop.aura-el.com


  • 与《R绘制中国航线分布夜景图_光环大数据培训》相关:
  • R绘制中国航线分布夜景图_光环大数据培训机构
  • R语言学习路线图_光环大数据培训
  • 大数据培训班_光环大数据分享大数据学习路线图
  • 用R软件绘制中国分省市地图_光环大数据培训
  • R语言完整学习路线图_光环大数据培训机构
  • R语言学习路线图及R数据挖掘包_光环大数据培训机构
  • 机器学习路线图_深圳光环大数据培训
  • Python数据分析和数据挖掘学习路线图_光环大数
  • 中国大数据整体市场趋势预测_光环大数据培训
  • Python数据挖掘学习路线图_光环大数据 Pyt
  • 本站网站首页首页教育资格全部考试考试首页首页考试首页职业资格考试最近更新儿童教育综合综合文库22文库2建筑专业资料考试首页范文大全公务员考试首页英语首页首页教案模拟考考试pclist学路首页日记语文古诗赏析教育教育资讯1高考资讯教育头条幼教育儿知识库教育职场育儿留学教育高考公务员考研考试教育资讯1问答教育索引资讯综合学习网站地图学习考试学习方法首页14托福知道备考心经冲刺宝典机经真题名师点睛托福课程雅思GREGMATSAT留学首页首页作文
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.xue63.com All Rights Reserved