2017-07-21 1 views
1

J'ai une liste des emplacements que j'introduis dans l'API Google Adresses. Certains endroits ont plus de 20 résultats. Je fournis un exemple d'un tel emplacement ci-dessous. Pour obtenir des résultats au-delà des 20 premiers, vous devez effectuer un appel API supplémentaire à Google Adresses, avec un paramètre "jeton" supplémentaire obtenu à partir du premier appel d'API Google Places. En utilisant la fonction imparfaite ci-dessous, j'essaye d'exécuter l'appel d'API supplémentaire, selon s'il y a des résultats supplémentaires qui doivent être obtenus. La fonction en cours produit des valeurs NULL. Toute aide pour corriger cette fonction serait très appréciée.Plusieurs appels API Google Places dans la fonction Sapply

Liste ALIMENTERA Sapply:

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

Sapply Fonction:

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 Exécution:

Output <- sapply(LatLongList, PullFromPlaces) 

Répondre

0

I figured it out. Voici la fonction à jeter dans sapply ou lapply. Le rayon, le type et les paramètres clés sont prédéfinis.

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

J'ai un exemple d'une telle requête dans la 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

Merci beaucoup SymbolixAU. C'est une bonne première étape mais je me demande si vous avez des suggestions sur la façon de combiner la première et la deuxième API tirer, avec une troisième API tirer pour les résultats 40-60? J'aimerais pouvoir tout tirer en même temps. – Bdude11383

+0

@ Bdude11383 - Je ne l'ai pas encore complètement testé, mais une sorte de boucle qui itère jusqu'à ce que 'page_token' n'existe plus/n'est pas valide devrait faire? – SymbolixAU