R:使用ggmap映射多个路由

时间:2015-04-11 03:52:44

标签: r ggplot2 ggmap

本周我一直试图让这个lovely flowing data visualization有所不同,但在最后的实施中仍然遇到了障碍。

以下是data set我正在使用的内容。我把它融合到一个框架中,其中包含我要显示的三个关键信息:startinglatlong,endinglatlong和trip of trips。

我最接近使用posted here的想法,但有两个在两个项目上遇到了障碍:

1)根据行程数改变线的大小 2)获取google api允许我调用这么多行(我的数据集中有55,704个)。

counts是我的完整df的名称,看起来像这样:

head(counts)
  X from_station_id.x to_station_id.x From_Station_Lat From_Station_Long    End_Station_Lat End_Station_Long   n                   eichel     
1 1                 5               5         41.87396         -87.62774        41.87396        -87.62774 275 41.87395806 -87.62773949  
2 2                 5              13         41.87396         -87.62774        41.93250        -87.65268   1 41.93250008 -87.65268082    
3 3                 5              14         41.87396         -87.62774        41.85809        -87.65107  12     41.858086 -87.651073
4 4                 5              15         41.87396         -87.62774        41.85645        -87.65647  19     41.856453 -87.656471
5 5                 5              16         41.87396         -87.62774        41.91033        -87.67252   7     41.910329 -87.672516
6 6                 5              17         41.87396         -87.62774        41.90332        -87.67273   5       41.90332 -87.67273
                thomas
1 41.87395806 -87.62773949
2 41.87395806 -87.62773949
3 41.87395806 -87.62773949
4 41.87395806 -87.62773949
5 41.87395806 -87.62773949
6 41.87395806 -87.62773949

然后我开始为想法帖子中的函数制作一个更简单的df,la:

start<-c(counts[1:10,9])
dest<-c(counts[1:10,10])

我想我可能会在函数中添加数字,所以我在n上标记(可能不是最好的命名约定,但在这里坚持我)。

n <- c(counts[1:10, 8])

然后是路径搜索功能:

leg <-function(start, dest){
     r<- route(from=start,to=dest,mode = c("bicycling"),structure = c("legs"))  
     c<- geom_leg(aes(x = startLon, y = startLat, xend = endLon, yend = endLat),
                  alpha = 2/4, size = 2, data = r, colour = 'blue') 

     return (c)
 }

基本地图:

a<-qmap('Chicago', zoom = 12, maptype="roadmap", color="bw") 

现在神奇了:

for (n in 1:10){
     #l<-leg(start[n], dest[n])  
     l<-leg(as.character(df[n,1]), as.character(df[n,2]))  

    a<-a+l
 }
a

这很有用。

不幸的是,当我尝试在更大的子集上运行它时会运行一点然后去:

Information from URL : http://maps.googleapis.com/maps/api/directions/json?   origin=41.88871604+-87.64444785&destination=41.87395806+-87.62773949&mode=bicycling&units=metric&alternatives=false&sensor=false
Error: (list) object cannot be coerced to type 'integer'

我从搜索此处和其他地方了解到这可能是由于谷歌门控api呼叫,所以尝试添加Sys.sleep(1),但这会破坏,所以去了Sys.sleep(1.5)并且坦率地说似乎还是。即使这是一个非常昂贵的电话,因为对于+ 55k行,你会看到+23小时的电话。我的代码是:

for (n in 1:30){
 #l<-leg(start[n], dest[n])  

 l<-leg(as.character(df[n,1]), as.character(df[n,2]))  
 Sys.sleep(1.5)     
a <- a + l
a}

这似乎在运行,但是当我进入&#34; a&#34;我得到了:

Error in eval(expr, envir, enclos) : object 'startLon' not found

最后如上所述,我想为更多使用的路线想象更粗的线条。通常我会通过aes执行此操作并执行以下操作:

geom_path(
aes(x = lon, y = lat),  colour = 'red', size = n/100,
data = df, lineend = 'round'
  )

因此它将读取列n并根据路由数量授予大小。为了在这里工作,我需要将这个数字绑定到路线路线,所以我写了第二个这样的函数:

leg <-function(start, dest, n){

 r<- route(from=start,to=dest,mode = c("bicycling"),structure = c("route"))  
 c<- geom_leg(aes(x = startLon, y = startLat, xend = endLon, yend = endLat),
              alpha = 2/4, size = n/10, data = r, colour = 'blue') 

 return (c)
}

for (n in 1:55704){
#l<-leg(start[n], dest[n])  

l<-leg(as.character(df[n,1]), as.character(df[n,2]), as.numeric(df[n,3]))  
Sys.sleep(1)       
a <- a+l       
  }

这跑了一分钟然后因错误而死:

Error: (list) object cannot be coerced to type 'integer'

但是较短的版本非常接近:

for (n in 2:6){
#l<-leg(start[n], dest[n])  

l<-leg(as.character(df[n,1]), as.character(df[n,2]), as.numeric(df[n,3]))  
Sys.sleep(1)       
a <- a+l       
}
据我所知,它起作用了,但仅仅是30个。可悲的是,较长的版本只是耗尽了。基本上我认为,如果我能够通过我几乎在那里的错误消息,我就不想花费数天来运行查询。欢迎所有帮助和投入。谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

好的,所以经过大量的涂鸦和修改以上内容后我终于找到了有效的循环解决方案:

leg <-function(start, dest, n){

    r<- route(from=start,to=dest,mode = c("walking"),structure = c("route"))  
    c<- geom_path(aes(x = lon, y = lat),
             alpha = 2/4, size = as.numeric(n)/500, data = r, colour = 'blue') 
    Sys.sleep(runif(1, 3.0, 7.5))
    return (c)
}

a <- qmap('Chicago', zoom = 12, maptype = 'road', color="bw")

for (n in 101:200){
    l<-leg(as.character(df[n,1]), as.character(df[n,2]),as.character(df[n,3])) 

    a<-a+l
}

a

这很有效。唯一的障碍是谷歌api拒绝接听电话。在我添加随机变量sys.sleep后,它顺利工作。也就是说,我仍然没有尝试超过150次(为了便于视觉和功能,限制了我对前10%路线样本的映射)。经过一些快乐的插画家时间后,我最终得到了一张好看的地图。感谢社区的兴趣和提供循环的想法。