Google Place with R
Asked Answered
I

4

6

My purpose is to use R to query google api. I have a list of addresses and names (belong to shops, restaurants, etc.) and for each of them I need to store:

"latitude", "longitude", "business type"

My idea is to use google place api:

-Use the Text Search Requests to search the address to store latitude e longitude

https://maps.googleapis.com/maps/api/place/textsearch/xml?query=address&key=AddYourOwnKeyHere

-Then use the Radar Search Requests to search the name nearby the latitude e longitude. So I get the ID_place

https://maps.googleapis.com/maps/api/place/radarsearch/json?location=latitude,longitude&radius=1&keyword=name&key=AddYourOwnKeyHere

-Thanks to the ID_place, I query the Place Details Requests to get detail about business type (es. "types" : [ "food" ] )

https://maps.googleapis.com/maps/api/place/details/json?placeid=ID_place&key=AddYourOwnKeyHere

I'm very new to use google api and maybe is not the most efficient way to do it. But I need to give some consideration: -Sometimes the address is not complete (sometimes I have the civic number missing) -Not always the name is correct (sometimes I have abbreviations)

I need to understand some things:

  • -If this is the best way to do it
  • -How query these Google api with R
  • -How handle the json output
Indopacific answered 19/1, 2015 at 14:28 Comment(0)
M
9

To access the Google Places API in R you can use my googleway package, and in particular google_places().

This also handles the JSON output for you.

library(googleway)

key <- 'your_api_key_goes_here'

df_places <- google_places(search_string = "cafe", 
                           location = c(-37.81827, 144.9671),   ## melbourne, AU
                           key = key)

df_places$results$name

# [1] "Time Out Fed Square"    "Dukes Coffee Roasters"  "Alice Nivens"           "Little Cupcakes"        "Lindt Chocolate Cafe"   "Cafe Andiamo"          
# [7] "The Journal Cafe"       "RMB Cafe Bar"           "Cafe Issus"             "ACMI Cafe & Bar"        "Ponyfish Island"        "Aix Cafe"              
# [13] "Seedling Cafe"          "Eliana Lulu"            "B3 Cafe"                "Lindt Chocolate Cafe"   "Switch Board Cafe"      "Urban Express Cafe"    
# [19] "Cento Mani"             "1932 Cafe & Restaurant"

If you want more details about a given place you can use google_place_details() to search for one of the place_ids returned from the previous query

df_details <- google_place_details(place_id = df_places$results[1, "place_id"],
                                   key = key)

df_details$result
# [1] "restaurant"        "cafe"              "bar"               "food"              "point_of_interest" "establishment"

df_details$result$reviews
#      aspects            author_name                                    author_url language rating
# 1 0, overall Fredrich Oliver-bently https://plus.google.com/114792371400821038660       en      2
# 2 0, overall           Jenn Besonia https://plus.google.com/110502657363574676299       en      2
# 3 0, overall             Sewa G S R https://plus.google.com/118332347441422887680       en      1
# 4 0, overall             M Mathumbu https://plus.google.com/104636428392041496439       en      2
# 5 2, overall                 Bo Cui https://plus.google.com/104475569220729624507       en      4
Miranda answered 20/10, 2016 at 1:39 Comment(0)
O
2

You could use library "httr" to get the result from google API:

res<-GET( "https://maps.googleapis.com/maps/api/place/radarsearch/json?location=35.325153,-80.946239&radius=5000&name=YOURNAME&key=YOURKEY")
jsonAnsw<-content(res,"text")

then you could use library "jsonlite" to handle the result:

 myDataframe<- jsonlite::fromJSON(content(res,"text"))
Overfill answered 9/11, 2015 at 15:32 Comment(2)
What does the name=YOURNAME part stands for? API name?Pus
Also important: Notice: Radar Search is deprecated as of June 30, 2017. This feature will be turned down on June 30, 2018, and will no longer be available after that date.Pus
H
0

You can use ggmap package with something like :

library('ggmap')
dataToMap = rbind(lon=longitude, lat=latitude)
geo.df = NULL
for(i in 1:length(dataToMap[,1]){
    location = geocode(dataToMap[1,],override_limit=TRUE,messaging=FALSE)
     geo.df = rbind(lon=location$lon[1], lat=location$lat[1])
    Sys.sleep(1.5)
}
Honeydew answered 19/1, 2015 at 17:7 Comment(1)
though, it seems geocode() fromggmap uses the Google Map Geocode API instead of Google Maps Places API see hereTersanctus
B
0

You can use newplaces which is a R wrapper package to the Google Places API (New API released in the end of 2023).

In your example you can run the following:

# Install package from github:
remotes::install_github("aTnT/newplaces")

library(newplaces)

# Set your API key:
set_api_key(key = "YOUR_MAPS_API_KEY")

# Get restaurants within a 500 m radius around a location:
myPlaces <- text_search(textQuery = "restaurants", location = "bias", circle_center_latitude = 40.75797, circle_center_longitude = -73.98554, circle_radius = 500)

You can access a tibble dataframe with the places at myPlaces$places:

myPlaces$places

# A tbl_json: 20 x 77 tibble with a "JSON" attribute
   ..JSON document.id name  id    nationalPhoneNumber internationalPhoneNu…¹ formattedAddress rating googleMapsUri
   <chr>        <int> <chr> <chr> <chr>               <chr>                  <chr>             <dbl> <chr>        
 1 "{\"n…           1 plac… ChIJ… (212) 221-3800      +1 212-221-3800        200 W 44th St, …    4.5 https://maps…
 2 "{\"n…           2 plac… ChIJ… (212) 302-2000      +1 212-302-2000        1515 Broadway @…    4.4 https://maps…
 3 "{\"n…           3 plac… ChIJ… <NA>                <NA>                   229 W 43rd St, …    4.8 https://maps…
 4 "{\"n…           4 plac… ChIJ… (212) 343-3355      +1 212-343-3355        1501 Broadway, …    4.4 https://maps…
 5 "{\"n…           5 plac… ChIJ… (212) 918-1330      +1 212-918-1330        1567 Broadway, …    4   https://maps…
 6 "{\"n…           6 plac… ChIJ… (332) 249-8600      +1 332-249-8600        1440 Broadway, …    4.3 https://maps…
 7 "{\"n…           7 plac… ChIJ… (212) 333-3254      +1 212-333-3254        2 Times Sq, New…    4.1 https://maps…
 8 "{\"n…           8 plac… ChIJ… (212) 581-6464      +1 212-581-6464        326 W 46th St, …    4.4 https://maps…
 9 "{\"n…           9 plac… ChIJ… (212) 921-2400      +1 212-921-2400        620 8th Ave, Ne…    4.2 https://maps…
10 "{\"n…          10 plac… ChIJ… (212) 354-5013      +1 212-354-5013        136 W 46th St, …    4.6 https://maps…
11 "{\"n…          11 plac… ChIJ… (646) 434-2448      +1 646-434-2448        575 7th Ave, Ne…    4.5 https://maps…
12 "{\"n…          12 plac… ChIJ… <NA>                <NA>                   135 W 50th St, …    3.9 https://maps…
13 "{\"n…          13 plac… ChIJ… (917) 565-9044      +1 917-565-9044        132 W 43rd St, …    4.4 https://maps…
14 "{\"n…          14 plac… ChIJ… (646) 435-0135      +1 646-435-0135        691 8th Ave, Ne…    4.4 https://maps…
15 "{\"n…          15 plac… ChIJ… (212) 869-3965      +1 212-869-3965        67 W 44th St, N…    4.2 https://maps…
16 "{\"n…          16 plac… ChIJ… (212) 597-5126      +1 212-597-5126        121 W 45th St, …    4.4 https://maps…
17 "{\"n…          17 plac… ChIJ… (212) 997-1270      +1 212-997-1270        36 W 48th St, N…    4.2 https://maps…
18 "{\"n…          18 plac… ChIJ… (212) 265-5400      +1 212-265-5400        155 W 43rd St, …    4.2 https://maps…
19 "{\"n…          19 plac… ChIJ… (212) 398-7440      +1 212-398-7440        151 W 46th St, …    4.3 https://maps…
20 "{\"n…          20 plac… ChIJ… (212) 997-4540      +1 212-997-4540        254 W 47th St, …    4.4 https://maps…
# ℹ abbreviated name: ¹​internationalPhoneNumber
# ℹ 68 more variables: websiteUri <chr>, utcOffsetMinutes <dbl>, adrFormatAddress <chr>, businessStatus <chr>,
#   priceLevel <chr>, userRatingCount <dbl>, iconMaskBaseUri <chr>, iconBackgroundColor <chr>, takeout <lgl>,
#   delivery <lgl>, dineIn <lgl>, curbsidePickup <lgl>, reservable <lgl>, servesBreakfast <lgl>,
#   servesLunch <lgl>, servesDinner <lgl>, servesBeer <lgl>, servesWine <lgl>, servesBrunch <lgl>,
#   servesVegetarianFood <lgl>, primaryType <chr>, shortFormattedAddress <chr>, outdoorSeating <lgl>,
#   liveMusic <lgl>, menuForChildren <lgl>, servesCocktails <lgl>, servesDessert <lgl>, servesCoffee <lgl>, …

You could also use the function argument includedType the specify a business type if your textQuery specifies something else.

More info at https://github.com/aTnT/newplaces

Burnell answered 6/6 at 9:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.