Sapply函数中的多个Google Places API调用

时间:2017-07-21 16:19:31

标签: json r google-places-api sapply rcurl

我有一个我正在加入Google Places API的位置列表。有些地方有20多个结果。我在下面提供一个这样的位置示例。要获得超过前20个的结果,您必须对Google地方信息进行额外的API调用,并使用从第一个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)

      }
}

执行:

Output <- sapply(LatLongList, PullFromPlaces)

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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)))

        } 

      }
    }