2017-07-21 21 views
1

我有一个位置列表,可以输入到Google Places API中。一些地点有超过20个结果。我在下面提供了一个这样的位置的例子。要获得超出前20名的结果,您必须向Google Places添加额外的API调用,并从第一次Google Places API调用中获取额外的“令牌”参数。Sapply功能中的多个Google Places API调用

使用下面的有缺陷的函数,我试图执行额外的API调用,基于是否有额外的结果需要获得。当前函数产生NULL值。任何帮助纠正这个功能将不胜感激。

清单送入Sapply:

LatLongList <- as.list("42.36354942,-71.06396087") 

Sapply功能:

library(RCurl) 
library(tidyjson) 
library(magrittr) 
library(dplyr) 

PullFromPlaces <- function(x) { 

    url = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&key=",key) 
    payload_json <- getURL(url) 

    next_page_token <- payload_json %>%   
     as.tbl_json %>% 
     enter_object("next_page_token") 
     next_page_token <- as.character(attr(next_page_token,"JSON")) 

     if (length(next_page_token) != 0) { 

     url = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&pagetoken=",next_page_token,"&key=",key) 
     payload_json <- getURL(url) 

     } 
} 

Sapply执行:

Output <- sapply(LatLongList, PullFromPlaces) 

回答

0

我想通了。以下是进入sapply或lapply的功能。半径,类型和关键参数是预定义的。

library(jsonlite) 
library(RCurl) 
library(tidyjson) 
library(magrittr) 
library(stringr) 
library(plyr) 
library(dplyr) 

PullFromPlaces <- function(x) { 

     url = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&key=",key) 
     payload_json <- getURL(url) 

     next_page_token <- payload_json %>%   
     as.tbl_json %>% 
     enter_object("next_page_token") 
     next_page_token <- as.character(attr(next_page_token,"JSON")) 

     if (length(next_page_token) == 0) { 

     payload_json <- data.frame(payload_json,stringsAsFactors = FALSE) 

     } else { 
     Sys.sleep(2) 
     url2 = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&pagetoken=",next_page_token,"&key=",key) 
     payload_json2 <- getURL(url2) 

     next_page_token <- payload_json2 %>%   
      as.tbl_json %>% 
      enter_object("next_page_token") 
     next_page_token <- as.character(attr(next_page_token,"JSON")) 

     if (length(next_page_token) == 0) { 

      payload_json <- rbind_pages(list(data.frame(payload_json,stringsAsFactors = FALSE),data.frame(payload_json2,stringsAsFactors = FALSE))) 

     } else { 
      Sys.sleep(2) 
      url3 = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&pagetoken=",next_page_token,"&key=",key) 
      payload_json3 <- getURL(url3) 

      payload_json <- rbind_pages(list(data.frame(payload_json,stringsAsFactors = FALSE),data.frame(payload_json2,stringsAsFactors = FALSE),data.frame(payload_json3,stringsAsFactors = FALSE))) 

     } 

     } 
    }  
1

我有这样一个查询的例子vignette of my googleway package

library(googleway) 


api_key <- 'your_api_key' 

myLocation <- c(42.36354942, -71.06396078) 

myPlaces <- google_places(location = myLocation, 
         radius = 500, 
         key = api_key) 

nextPlaces <- google_places(location = myLocation, 
          radius = 500, 
          page_token = myPlaces$next_page_token, 
          key = api_key) 


myPlaces$results$name 
# [1] "Boston"            "Kimpton Onyx Hotel"         
# [3] "Holiday Inn Express Hotel & Suites Boston Garden" "Wyndham Boston Beacon Hill"       
# [5] "The Boxer Boston Hotel"        "Whole Foods Market"         
# [7] "The Liberty, a Luxury Collection Hotel, Boston"  "Massachusetts General Hospital"      
# [9] "TD Garden"           "Sugarman, Rogers, Barshak & Cohen, P.C."    
# [11] "Dr. Richard J. Deasla, MD"       "Massachussetts General Hospital"      
# [13] "Massachusetts General Hospital: Temel Jennifer S MD" "Vrahas Mark Steven MD"        
# [15] "Harry E. Rubash, MD"         "Dr. Ziv Williams, MD"        
# [17] "CCRM Boston"           "Domino's Pizza"          
# [19] "Massachusetts General Hospital: Yeh Sunu Susan MD" "North End" 

nextPlaces$results$name 
# [1] "Massachusetts General Hospital: Ryan Colleen MD"   "Warshaw Andrew L MD"          
# [3] "Massachusetts General Hospital: Althausen Anne M MD"  "Massachusetts General Hospital: Shipley William MD"  
# [5] "Massachusetts General Hospital: Feldman Adam S MD"  "Massachusetts General Hospital: Packard Swift Alison MD" 
# [7] "Dr. Nahel Elias, MD"          "Dr. Steven L. Mcafee, MD"        
# [9] "Dr. Charles A. Welch, MD"        "Massachusetts General Hospital: Kilbride Ronan D MD"  
# [11] "Massachusetts General Hospital: Garasic Joseph Mich MD" "Massachusetts General Hospital: Akins Cary W MD"   
# [13] "Dr. Edwin C. Huang, MD"         "Massachusetts General Hospital: Davis Benjamin T MD"  
# [15] "Massachusetts General Hospital: Levins Paul C MD"  "Massachusetts General Hospital: Passeri Jonathan MD"  
# [17] "Massachusetts General Hospital: Weil Michelle MD"  "Massachusetts General Hospital: Steele David John MD" 
# [19] "Massachusetts General Hospital: Chae Claudia U MD"  "Massachusetts General Hospital: Connolly Thomas Jose MD" 
+0

非常感谢SymbolixAU。这是一个很好的第一步,但我想知道是否对如何将第一个和第二个API拉取结合起来,以及第三个API拉取结果40-60的建议?我希望能够一次拉出所有东西。 – Bdude11383

+0

@ Bdude11383 - 我还没有完全测试它,但有些循环迭代,直到'page_token'不再存在/无效应该做? – SymbolixAU