[LR]用R绘制上海地铁

4

使用Leaflet绘制上海地铁地图

直接上代码,如下:

library(leaflet)
library(data.table)
library(dplyr)
stations <- fread('https://raw.githubusercontent.com/jeevanyue/jeevanyue.github.io/master/data/stations.csv',encoding='UTF-8')

stations <- arrange(stations,line,line_id)
#地铁颜色,从上海地铁官网获取
lines_color <- data.frame("line"=c(1:13,16),"color"=c("#ED3229","#36B854","#FFD823","#320176","#823094","#CF047A","#F3560F","#008CC1","#91C5DB","#C7AFD3","#8C2222","#007a61","#ec91cc","#32D2CA"))

pal <- colorFactor(as.character(lines_color$color), domain = stations$line)

Shanghai <- leaflet() %>% 
  setView(lng = 121.468888888889, lat = 31.2358333333333, zoom = 10) %>% 
  addProviderTiles("CartoDB.Positron")

## 辅助函数绘制线路
draw_line_add <- function(l_no,line_s_id=NULL){
  line_color <- lines_color[lines_color$line==l_no,]$color
  line_data <- stations[stations$line==l_no,]
  if(is.null(line_s_id)){
  draw_lines <- Shanghai %>%
    addPolylines(lat=line_data$gps_lat,lng=line_data$gps_lon,color=line_color)
  }else{
    draw_lines <- Shanghai %>%
      addPolylines(lat=line_data$gps_lat[line_s_id],lng=line_data$gps_lon[line_s_id],color=line_color)
  }
  return(draw_lines)
}

for(l in unique(stations$line)){
  line_length <- nrow(stations[stations$line==l,])
  if(l==4){
    #由于4号线为环线,需将首尾相连
    Shanghai <- draw_line_add(l_no=l)
    Shanghai <- draw_line_add(l_no=l,line_s_id=c(1,line_length))
  }else if(l==10){
    #由于10号线在龙溪路站以后分为两条线路,需分两端绘制
    Shanghai <- draw_line_add(l_no=l,line_s_id=c(1:(line_length-3)))
    Shanghai <- draw_line_add(l_no=l,line_s_id=c(24,(line_length-2):line_length))
  }else if(l==11){
    #由于11号线在嘉定新城站以后分为两条线路,需分两端绘制
    Shanghai <- draw_line_add(l_no=l,line_s_id=c(1:(line_length-7)))
    Shanghai <- draw_line_add(l_no=l,line_s_id=c(28,(line_length-6):line_length))
  }else{
    Shanghai <- draw_line_add(l_no=l)
  }
}

stations_no <- nrow(stations)
for (i in 1:stations_no) {
  s <- stations$station[i]
  stations$lines[i] <- paste(stations[stations$station==s,]$line,sep="",collapse="/")
}
#添加地铁站名
Shanghai <- Shanghai %>%
  addCircleMarkers(stations$gps_lon, stations$gps_lat, popup =paste(stations$station,stations$lines,sep=","),color = pal(stations$line), radius=1.5) %>%
  addLegend(pal=pal,values = stations$line)
Shanghai

详见:上海地铁

shmetro

你可能感兴趣的

HarryZhu · 2016-08-08

题主数据可以共享到GitHub上吗?然后类似下面这样读取会不会好点。

library(data.table)
mydat <- fread('http://www.stats.ox.ac.uk/pub/datasets/csb/ch11b.dat')

+1 回复

JeevanYue 作者 · 2016-08-08

数据放在_rmd/data中,坐标数据分GPS坐标、Google坐标和百度坐标,做了如下修改。

library(data.table)
stations <- fread('https://raw.githubusercontent.com/jeevanyue/jeevanyue.github.io/master/_rmd/data/stations.csv',encoding='UTF-8')

+1 回复

sinpen · 2016-08-10

不知道是不是R版本的问题,我使用的是Microsoft R Open 3.3.0。在for循环添加线完成后,所有的线是首尾相连的。但是,当我按照线路(stations$line)一条一条画时,是正常的。另外,对stations数据进行排序的操作中,order中的data.frame索引在我的版本中并不适用,需要使用$取列,但如果只有两列(变量)时,比如数据lines_color,采用[ind1, ind2]的索引格式是可以运行的。

回复

JeevanYue 作者 · 2016-08-10

用fread()读取后数据格式变为data.table,我这里也发现order和stations[,2]不对。还是用read.csv()读取数据吧,它也可以直接从网上读取数据。

回复

sinpen · 2016-08-10

原来是data.table,这个地方没有看清,受教了。 另外一个问题,就是添加的地铁线的问题,是首尾相连的,而且颜色也不对。但是最后,添加的地铁站的颜色是正确的

回复

JeevanYue 作者 · 2016-08-11

应该是3、4号线的并轨导致重合部分的线路颜色是两者颜色的叠加,换乘站也都有这个问题

回复

载入中...