munterfi / hereR

R package that provides an interface to the HERE REST APIs: Geocoder API, Routing API, Traffic API, Public Transit API and Destination Weather API. Locations and routes are returned as 'sf' objects.
https://munterfi.github.io/hereR/
GNU General Public License v3.0
87 stars 11 forks source link

Bug: HERE rate limits #122

Closed munterfi closed 3 years ago

munterfi commented 3 years ago

Describe the bug Unfortunately HERE introduced rate limits on freemium licenses:

Starting April 1st, 2021, we will be introducing rate limiting for our freemium licenses. This means that alongside the maximum 250k transactions limit per month the number of requests per second (RPS) is now limited.

This rate limiting only applies for Freemium License plans and does not apply to any paid commercial plans. To learn more about upgrading to a commercial plan, click here.

The limits are: Service Max RPS
Geocoding & Search 5
Multi Reverse Geocoding 1
Vector Tile 10
Map Tile 30
Map Image 2
Routing 10
Matrix Routing 1
Isoline Routing 1
Route Matching 1
Advanced Datasets 10
Waypoints Sequence 1
Transit 10
Intermodal 5

For freemium licenses requests fail randomly with status code 429 on all API endpoints if they exceed the rate limit.

Reproducible example

library(hereR)
set_key("KEY")
locs <- geocode(address = rep(poi$city, 100), url_only = F)
#> There were 50 or more warnings (use warnings() to see the first 50)
warnings()
#> 1: In (function (res)  ... : Request 'id = 22' failed: Status 429. 
#> 2: In (function (res)  ... : Request 'id = 24' failed: Status 429. 
#> 3: In (function (res)  ... : Request 'id = 25' failed: Status 429. 
#> 4: In (function (res)  ... : Request 'id = 26' failed: Status 429. 
#> 5: In (function (res)  ... : Request 'id = 28' failed: Status 429. 

Expected behavior Add sleep time if request code 429 is encountered and retry. Not sure if async requests are still the way to go... ?

munterfi commented 3 years ago

With the development version of the package, the rate limits of the APIs are now considered in the requests:

library(hereR)
set_verbose(TRUE)
library(sf)
#> Linking to GEOS 3.8.1, GDAL 3.1.4, PROJ 6.3.1

geocode <- geocode(address = poi$city)
#> Sending 8 request(s) with 5 RPS to: 'https://geocode.search.hereapi.com/v1/geocode?...'
#> Received 8 response(s) with total size: 5.3 Kb

autosuggest <- autosuggest(address = poi$city, results = 3)
#> Sending 8 request(s) with 5 RPS to: 'https://revgeocode.search.hereapi.com/v1/autosuggest?...'
#> Received 8 response(s) with total size: 11.8 Kb

reverse_geocode <- reverse_geocode(poi = poi, results = 3)
#> Sending 8 request(s) with 5 RPS to: 'https://revgeocode.search.hereapi.com/v1/revgeocode?...'
#> Received 8 response(s) with total size: 16 Kb

route <- route(origin = poi[1:2, ], destination = poi[3:4, ])
#> Sending 2 request(s) with 10 RPS to: 'https://router.hereapi.com/v8/routes?...'
#> Received 2 response(s) with total size: 50 Kb

route_matrix <- route_matrix(origin = poi)
#> Sending 1 request(s) with 1 RPS to: 'https://matrix.router.hereapi.com/v8/matrix?...'
#> Received 1 response(s) with total size: 1.2 Kb

intermodal_route <- intermodal_route(
  origin = poi[1:3, ], destination = poi[4:6, ]
)
#> Sending 3 request(s) with 5 RPS to: 'https://intermodal.router.hereapi.com/v8/routes?...'
#> Received 3 response(s) with total size: 105.1 Kb

isoline <- isoline(poi = poi)
#> Sending 8 request(s) with 1 RPS to: 'https://isoline.router.hereapi.com/v8/isolines?...'
#> Received 8 response(s) with total size: 92.9 Kb

weather_observation <- weather(poi = poi, product = "observation")
#> Sending 8 request(s) with unlimited RPS to: 'https://weather.ls.hereapi.com/weather/1.0/report.json?...'
#> Received 8 response(s) with total size: 59.7 Kb

weather_forecast_hourly <- weather(poi = poi, product = "forecast_hourly")
#> Sending 8 request(s) with unlimited RPS to: 'https://weather.ls.hereapi.com/weather/1.0/report.json?...'
#> Received 8 response(s) with total size: 897.6 Kb

weather_forecast_astronomy <- weather(
  poi = poi, product = "forecast_astronomy"
)
#> Sending 8 request(s) with unlimited RPS to: 'https://weather.ls.hereapi.com/weather/1.0/report.json?...'
#> Received 8 response(s) with total size: 19.1 Kb

weather_alerts <- weather(poi = poi, product = "alerts")
#> Sending 8 request(s) with unlimited RPS to: 'https://weather.ls.hereapi.com/weather/1.0/report.json?...'
#> Received 8 response(s) with total size: 5.1 Kb

flow <- flow(aoi = aoi[aoi$code == "LI", ])
#> Sending 1 request(s) with unlimited RPS to: 'https://traffic.ls.hereapi.com/traffic/6.2/flow.json?...'
#> Received 1 response(s) with total size: 310.2 Kb

incident <- incident(aoi = aoi, from = Sys.time() - 60 * 60 * 0.5)
#> Sending 2 request(s) with unlimited RPS to: 'https://traffic.ls.hereapi.com/traffic/6.2/incidents.json?...'
#> Received 2 response(s) with total size: 160.9 Kb

connection_section <- connection(
  origin = poi[3:4, ], destination = poi[5:6, ], results = 2, summary = FALSE
)
#> Sending 2 request(s) with 10 RPS to: 'https://transit.router.hereapi.com/v8/routes?...'
#> Received 2 response(s) with total size: 70.5 Kb

connection_summary <- connection(
  origin = poi[3:4, ], destination = poi[5:6, ], results = 2, summary = TRUE
)
#> Sending 2 request(s) with 10 RPS to: 'https://transit.router.hereapi.com/v8/routes?...'
#> Received 2 response(s) with total size: 70.5 Kb

station <- station(poi)
#> Sending 8 request(s) with 10 RPS to: 'https://transit.hereapi.com/v8/stations?...'
#> Received 8 response(s) with total size: 43.3 Kb

Testing with some more requests:

geocode(rep(poi$city, 20))
#> Sending 160 request(s) with 5 RPS to: 'https://geocode.search.hereapi.com/v1/geocode?...'
#> Received 160 response(s) with total size: 103 Kb
#> Simple feature collection with 160 features and 16 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: 6.14275 ymin: 46.00297 xmax: 9.52164 ymax: 47.5488
#> Geodetic CRS:  WGS 84
#> First 10 features:
#>    id rank                     address     type street house_number postal_code
#> 1   1    1             Luzern, Schweiz locality   <NA>         <NA>        6003
#> 2   2    1    Lugano, Ticino, Svizzera locality   <NA>         <NA>        6900
#> 3   3    1      Lausanne, Vaud, Suisse locality   <NA>         <NA>        1003
#> 4   4    1 Basel, Basel-Stadt, Schweiz locality   <NA>         <NA>        4051
#> 5   5    1               Bern, Schweiz locality   <NA>         <NA>        3011
#> 6   6    1             Zürich, Schweiz locality   <NA>         <NA>        8001
#> 7   7    1              Genève, Suisse locality   <NA>         <NA>        1201
#> 8   8    1        Vaduz, Liechtenstein locality   <NA>         <NA>        9490
#> 9   9    1             Luzern, Schweiz locality   <NA>         <NA>        6003
#> 10 10    1    Lugano, Ticino, Svizzera locality   <NA>         <NA>        6900
#>    state_code country_code district     city          county       state
#> 1          LU          CHE     <NA>   Luzern    Luzern-Stadt      Luzern
#> 2          TI          CHE     <NA>   Lugano          Lugano      Ticino
#> 3          VD          CHE     <NA> Lausanne        Lausanne        Vaud
#> 4          BS          CHE     <NA>    Basel     Basel-Stadt Basel-Stadt
#> 5          BE          CHE     <NA>     Bern Bern-Mittelland        Bern
#> 6          ZH          CHE     <NA>   Zürich          Zürich      Zürich
#> 7          GE          CHE     <NA>   Genève          Genève      Genève
#> 8        <NA>          LIE     <NA>    Vaduz        Oberland        <NA>
#> 9          LU          CHE     <NA>   Luzern    Luzern-Stadt      Luzern
#> 10         TI          CHE     <NA>   Lugano          Lugano      Ticino
#>          country score      access                 geometry
#> 1        Schweiz     1 POINT EMPTY POINT (8.30437 47.04954)
#> 2       Svizzera     1 POINT EMPTY  POINT (8.9512 46.00297)
#> 3         Suisse     1 POINT EMPTY  POINT (6.63222 46.5196)
#> 4        Schweiz     1 POINT EMPTY  POINT (7.58781 47.5488)
#> 5        Schweiz     1 POINT EMPTY POINT (7.44046 46.94843)
#> 6        Schweiz     1 POINT EMPTY   POINT (8.53977 47.377)
#> 7         Suisse     1 POINT EMPTY POINT (6.14275 46.20833)
#> 8  Liechtenstein     1 POINT EMPTY POINT (9.52164 47.13879)
#> 9        Schweiz     1 POINT EMPTY POINT (8.30437 47.04954)
#> 10      Svizzera     1 POINT EMPTY  POINT (8.9512 46.00297)

Turn off rate limits and check again:

set_rate_limit(FALSE)
geocode(rep(poi$city, 20))
#> Sending 160 request(s) with unlimited RPS to: 'https://geocode.search.hereapi.com/v1/geocode?...'
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 22' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 24' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 25' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 27' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 28' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 30' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 31' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 32' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 34' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 36' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 37' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 38' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 39' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 40' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 41' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 42' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 43' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 44' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 45' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 46' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 47' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 48' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 49' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 50' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 51' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 52' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 53' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 54' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 55' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 58' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 60' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 61' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 62' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 63' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 64' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 65' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 66' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 67' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 68' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 69' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 70' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 71' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 72' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 73' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 76' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 78' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 79' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 80' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 81' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 82' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 83' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 84' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 85' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 86' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 87' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 88' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 89' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 90' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 91' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 94' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 96' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 97' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 98' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 99' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 100' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 101' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 102' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 103' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 104' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 105' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 106' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 107' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 108' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 109' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 113' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 114' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 115' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 116' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 117' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 118' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 119' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 120' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 121' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 122' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 123' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 124' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 125' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 126' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 127' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 131' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 132' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 133' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 134' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 135' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 136' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 137' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 138' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 139' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 140' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 141' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 142' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 143' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 144' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 145' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 149' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 150' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 151' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 152' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 153' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 154' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 155' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 156' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 157' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 158' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 159' failed:
#> Status 429.
#> Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 160' failed:
#> Status 429.
#> Received 160 response(s) with total size: 37.6 Kb
#> Simple feature collection with 44 features and 16 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: 6.14275 ymin: 46.00297 xmax: 9.52164 ymax: 47.5488
#> Geodetic CRS:  WGS 84
#> First 10 features:
#>    id rank                     address     type street house_number postal_code
#> 1   1    1             Luzern, Schweiz locality   <NA>         <NA>        6003
#> 2   2    1    Lugano, Ticino, Svizzera locality   <NA>         <NA>        6900
#> 3   3    1      Lausanne, Vaud, Suisse locality   <NA>         <NA>        1003
#> 4   4    1 Basel, Basel-Stadt, Schweiz locality   <NA>         <NA>        4051
#> 5   5    1               Bern, Schweiz locality   <NA>         <NA>        3011
#> 6   6    1             Zürich, Schweiz locality   <NA>         <NA>        8001
#> 7   7    1              Genève, Suisse locality   <NA>         <NA>        1201
#> 8   8    1        Vaduz, Liechtenstein locality   <NA>         <NA>        9490
#> 9   9    1             Luzern, Schweiz locality   <NA>         <NA>        6003
#> 10 10    1    Lugano, Ticino, Svizzera locality   <NA>         <NA>        6900
#>    state_code country_code district     city          county       state
#> 1          LU          CHE     <NA>   Luzern    Luzern-Stadt      Luzern
#> 2          TI          CHE     <NA>   Lugano          Lugano      Ticino
#> 3          VD          CHE     <NA> Lausanne        Lausanne        Vaud
#> 4          BS          CHE     <NA>    Basel     Basel-Stadt Basel-Stadt
#> 5          BE          CHE     <NA>     Bern Bern-Mittelland        Bern
#> 6          ZH          CHE     <NA>   Zürich          Zürich      Zürich
#> 7          GE          CHE     <NA>   Genève          Genève      Genève
#> 8        <NA>          LIE     <NA>    Vaduz        Oberland        <NA>
#> 9          LU          CHE     <NA>   Luzern    Luzern-Stadt      Luzern
#> 10         TI          CHE     <NA>   Lugano          Lugano      Ticino
#>          country score      access                 geometry
#> 1        Schweiz     1 POINT EMPTY POINT (8.30437 47.04954)
#> 2       Svizzera     1 POINT EMPTY  POINT (8.9512 46.00297)
#> 3         Suisse     1 POINT EMPTY  POINT (6.63222 46.5196)
#> 4        Schweiz     1 POINT EMPTY  POINT (7.58781 47.5488)
#> 5        Schweiz     1 POINT EMPTY POINT (7.44046 46.94843)
#> 6        Schweiz     1 POINT EMPTY   POINT (8.53977 47.377)
#> 7         Suisse     1 POINT EMPTY POINT (6.14275 46.20833)
#> 8  Liechtenstein     1 POINT EMPTY POINT (9.52164 47.13879)
#> 9        Schweiz     1 POINT EMPTY POINT (8.30437 47.04954)
#> 10      Svizzera     1 POINT EMPTY  POINT (8.9512 46.00297)

Note: Paid plans should use set_rate_limit(FALSE) to avoid the limits.

Session info ``` r devtools::session_info() #> ─ Session info ─────────────────────────────────────────────────────────────── #> setting value #> version R version 4.0.5 (2021-03-31) #> os macOS Big Sur 10.16 #> system x86_64, darwin17.0 #> ui X11 #> language (EN) #> collate en_US.UTF-8 #> ctype en_US.UTF-8 #> tz Europe/Zurich #> date 2021-04-11 #> #> ─ Packages ─────────────────────────────────────────────────────────────────── #> package * version date lib source #> assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.0.0) #> cachem 1.0.4 2021-02-13 [1] CRAN (R 4.0.2) #> callr 3.5.1 2020-10-13 [1] CRAN (R 4.0.2) #> class 7.3-18 2021-01-24 [1] CRAN (R 4.0.5) #> classInt 0.4-3 2020-04-07 [1] CRAN (R 4.0.0) #> cli 2.3.1 2021-02-23 [1] CRAN (R 4.0.2) #> crayon 1.4.1 2021-02-08 [1] CRAN (R 4.0.2) #> crul 1.1.0 2021-02-15 [1] CRAN (R 4.0.2) #> curl 4.3 2019-12-02 [1] CRAN (R 4.0.1) #> data.table 1.14.0 2021-02-21 [1] CRAN (R 4.0.2) #> DBI 1.1.1 2021-01-15 [1] CRAN (R 4.0.2) #> desc 1.2.0 2018-05-01 [1] CRAN (R 4.0.0) #> devtools 2.3.2 2020-09-18 [1] CRAN (R 4.0.2) #> digest 0.6.27 2020-10-24 [1] CRAN (R 4.0.2) #> dplyr 1.0.4 2021-02-02 [1] CRAN (R 4.0.2) #> e1071 1.7-4 2020-10-14 [1] CRAN (R 4.0.2) #> ellipsis 0.3.1 2020-05-15 [1] CRAN (R 4.0.0) #> evaluate 0.14 2019-05-28 [1] CRAN (R 4.0.0) #> fansi 0.4.2 2021-01-15 [1] CRAN (R 4.0.2) #> fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.0.2) #> flexpolyline 0.2.1 2021-01-04 [1] CRAN (R 4.0.2) #> fs 1.5.0 2020-07-31 [1] CRAN (R 4.0.2) #> generics 0.1.0 2020-10-31 [1] CRAN (R 4.0.2) #> glue 1.4.2 2020-08-27 [1] CRAN (R 4.0.2) #> hereR * 0.6.1.9000 2021-04-11 [1] local #> htmltools 0.5.1.1 2021-01-22 [1] CRAN (R 4.0.2) #> httpcode 0.3.0 2020-04-10 [1] CRAN (R 4.0.2) #> jsonlite 1.7.2 2020-12-09 [1] CRAN (R 4.0.2) #> KernSmooth 2.23-18 2020-10-29 [1] CRAN (R 4.0.5) #> knitr 1.31 2021-01-27 [1] CRAN (R 4.0.2) #> lifecycle 1.0.0 2021-02-15 [1] CRAN (R 4.0.2) #> magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.0.2) #> memoise 2.0.0 2021-01-26 [1] CRAN (R 4.0.2) #> pillar 1.5.0 2021-02-22 [1] CRAN (R 4.0.2) #> pkgbuild 1.2.0 2020-12-15 [1] CRAN (R 4.0.2) #> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.0.0) #> pkgload 1.2.0 2021-02-23 [1] CRAN (R 4.0.2) #> prettyunits 1.1.1 2020-01-24 [1] CRAN (R 4.0.0) #> processx 3.4.5 2020-11-30 [1] CRAN (R 4.0.2) #> ps 1.5.0 2020-12-05 [1] CRAN (R 4.0.2) #> purrr 0.3.4 2020-04-17 [1] CRAN (R 4.0.0) #> R6 2.5.0 2020-10-28 [1] CRAN (R 4.0.2) #> Rcpp 1.0.6 2021-01-15 [1] CRAN (R 4.0.2) #> remotes 2.2.0 2020-07-21 [1] CRAN (R 4.0.2) #> rlang 0.4.10 2020-12-30 [1] CRAN (R 4.0.2) #> rmarkdown 2.7 2021-02-19 [1] CRAN (R 4.0.2) #> rprojroot 2.0.2 2020-11-15 [1] CRAN (R 4.0.2) #> sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 4.0.0) #> sf * 0.9-8 2021-03-17 [1] CRAN (R 4.0.2) #> stringi 1.5.3 2020-09-09 [1] CRAN (R 4.0.2) #> stringr 1.4.0 2019-02-10 [1] CRAN (R 4.0.2) #> testthat 3.0.2 2021-02-14 [1] CRAN (R 4.0.2) #> tibble 3.1.0 2021-02-25 [1] CRAN (R 4.0.2) #> tidyselect 1.1.0 2020-05-11 [1] CRAN (R 4.0.0) #> units 0.7-0 2021-02-25 [1] CRAN (R 4.0.2) #> usethis 2.0.1 2021-02-10 [1] CRAN (R 4.0.2) #> utf8 1.1.4 2018-05-24 [1] CRAN (R 4.0.0) #> vctrs 0.3.6 2020-12-17 [1] CRAN (R 4.0.2) #> withr 2.4.1 2021-01-26 [1] CRAN (R 4.0.2) #> xfun 0.21 2021-02-10 [1] CRAN (R 4.0.2) #> yaml 2.2.1 2020-02-01 [1] CRAN (R 4.0.0) #> #> [1] /Library/Frameworks/R.framework/Versions/4.0/Resources/library ```
hrecht commented 3 years ago

This is a great solution, thank you! Very annoying change from HERE, figured it out when I started getting all sorts of 429 errors, ugh.