munterfi/hereR

Feature: Update Routing API to v8

munterfi opened this issue · 2 comments

The Routing API v7 used in the {hereR} package is no longer actively developed. Newer versions of the APIs are available and the package should be updated to the:

New endpoints to use:

Note: The shapes are encoded in the flexible polyline encoding format and have to be decoded using the {flexpolyline} package. The pacakge is not yet supporting the geometry type "POLYGON", which has to be implemented first (see munterfi/flexpolyline#31).

Check correctness of timezones with new APIs (see #94):

library(hereR)

# Timestamp with different timezone as my local CET
(datetime = as.POSIXct("2020-12-17 08:00:00", tz = "Europe/Moscow"))
#> [1] "2020-12-17 08:00:00 MSK"

connection(poi[1, ], poi[2, ], datetime = datetime)$departure[1]
#> [1] "2020-12-17 08:53:00 MSK"

intermodal_route(poi[1, ], poi[2, ], datetime = datetime)$departure[1]
#> [1] "2020-12-17 08:53:00 MSK"

route(poi[1, ], poi[2, ], datetime = datetime)$departure[1]
#> [1] "2020-12-17 08:00:00 MSK"

route_matrix(poi[1, ], poi[2, ], datetime = datetime)$departure[1]
#> [1] "2020-12-17 08:00:00 MSK"

isoline(poi[1, ], datetime = datetime)$departure[1]
#> [1] "2020-12-17 08:00:00 MSK"

# Timestamp with my local timezone (CET)
(datetime = as.POSIXct("2020-12-17 08:00:00", tz = "Europe/Zurich"))
#> [1] "2020-12-17 08:00:00 CET"

connection(poi[1, ], poi[2, ], datetime = datetime)$departure[1]
#> [1] "2020-12-17 08:49:00 CET"

intermodal_route(poi[1, ], poi[2, ], datetime = datetime)$departure[1]
#> [1] "2020-12-17 08:49:00 CET"

route(poi[1, ], poi[2, ], datetime = datetime)$departure[1]
#> [1] "2020-12-17 08:00:00 CET"

route_matrix(poi[1, ], poi[2, ], datetime = datetime)$departure[1]
#> [1] "2020-12-17 08:00:00 CET"

isoline(poi[1, ], datetime = datetime)$departure[1]
#> [1] "2020-12-17 08:00:00 CET"
Session info
devtools::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.0.3 (2020-10-10)
#>  os       macOS Catalina 10.15.7      
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       Europe/Zurich               
#>  date     2020-12-23                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package      * version    date       lib source        
#>  assertthat     0.2.1      2019-03-21 [1] CRAN (R 4.0.0)
#>  callr          3.5.1      2020-10-13 [1] CRAN (R 4.0.2)
#>  class          7.3-17     2020-04-26 [1] CRAN (R 4.0.3)
#>  classInt       0.4-3      2020-04-07 [1] CRAN (R 4.0.0)
#>  cli            2.2.0      2020-11-20 [1] CRAN (R 4.0.2)
#>  crayon         1.3.4      2017-09-16 [1] CRAN (R 4.0.0)
#>  curl           4.3        2019-12-02 [1] CRAN (R 4.0.1)
#>  data.table     1.13.2     2020-10-19 [1] CRAN (R 4.0.3)
#>  DBI            1.1.0      2019-12-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.2      2020-08-18 [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.1      2020-01-08 [1] CRAN (R 4.0.0)
#>  flexpolyline   0.2.1      2020-12-21 [1] local         
#>  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.5.2.9000 2020-12-23 [1] local         
#>  htmltools      0.5.0      2020-06-16 [1] CRAN (R 4.0.2)
#>  jsonlite       1.7.1      2020-09-07 [1] CRAN (R 4.0.2)
#>  KernSmooth     2.23-18    2020-10-29 [1] CRAN (R 4.0.2)
#>  knitr          1.30       2020-09-22 [1] CRAN (R 4.0.2)
#>  lifecycle      0.2.0      2020-03-06 [1] CRAN (R 4.0.0)
#>  magrittr       2.0.1      2020-11-17 [1] CRAN (R 4.0.2)
#>  memoise        1.1.0      2017-04-21 [1] CRAN (R 4.0.0)
#>  pillar         1.4.7      2020-11-20 [1] CRAN (R 4.0.2)
#>  pkgbuild       1.1.0      2020-07-13 [1] CRAN (R 4.0.2)
#>  pkgconfig      2.0.3      2019-09-22 [1] CRAN (R 4.0.0)
#>  pkgload        1.1.0      2020-05-29 [1] CRAN (R 4.0.2)
#>  prettyunits    1.1.1      2020-01-24 [1] CRAN (R 4.0.0)
#>  processx       3.4.4      2020-09-03 [1] CRAN (R 4.0.2)
#>  ps             1.4.0      2020-10-07 [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.5      2020-07-06 [1] CRAN (R 4.0.2)
#>  remotes        2.2.0      2020-07-21 [1] CRAN (R 4.0.2)
#>  rlang          0.4.9      2020-11-26 [1] CRAN (R 4.0.3)
#>  rmarkdown      2.5        2020-10-21 [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-6      2020-09-13 [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.0      2020-10-31 [1] CRAN (R 4.0.2)
#>  tibble         3.0.4      2020-10-12 [1] CRAN (R 4.0.2)
#>  tidyselect     1.1.0      2020-05-11 [1] CRAN (R 4.0.0)
#>  units          0.6-7      2020-06-13 [1] CRAN (R 4.0.2)
#>  usethis        1.6.3      2020-09-17 [1] CRAN (R 4.0.2)
#>  vctrs          0.3.5      2020-11-17 [1] CRAN (R 4.0.2)
#>  withr          2.3.0      2020-09-22 [1] CRAN (R 4.0.2)
#>  xfun           0.19       2020-10-30 [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

Check for completeness of route combinations in route_matrix() after sending requests as batches (see #30):

Construct a dummy data set:

library(sf)
#> Linking to GEOS 3.8.1, GDAL 3.1.4, PROJ 6.3.1
n <- 200
l <- n*n
(sf <- 
  data.frame(
    idx = seq(1, n),
    lng = runif(n, 7.5, 8.5),
    lat = runif(n, 47.25, 47.75)
  ) %>% 
  st_as_sf(coords = c("lng", "lat")) %>% 
  st_set_crs(4326))
#> Simple feature collection with 200 features and 1 field
#> geometry type:  POINT
#> dimension:      XY
#> bbox:           xmin: 7.506527 ymin: 47.25083 xmax: 8.497812 ymax: 47.74371
#> geographic CRS: WGS 84
#> First 10 features:
#>    idx                  geometry
#> 1    1 POINT (7.751984 47.64646)
#> 2    2 POINT (7.668101 47.32461)
#> 3    3 POINT (7.559412 47.61516)
#> 4    4 POINT (8.148569 47.45528)
#> 5    5 POINT (8.331784 47.47819)
#> 6    6 POINT (8.272505 47.41565)
#> 7    7 POINT (8.418097 47.70016)
#> 8    8  POINT (8.19467 47.67536)
#> 9    9 POINT (7.658258 47.42345)
#> 10  10 POINT (8.273231 47.62908)

Functions for testing inputs, requests and return values:

n_request <- function(x, y = NULL) {
  message(
    sprintf(
      "Number of requests: %s",
      ifelse(
        is.null(y),
        length(route_matrix(x, url_only = TRUE)),
        length(route_matrix(x, y, url_only = TRUE))
      )
    )
  )
}

test_one_input <- function(x) {
  message("* Only origin *")
  n_request(x)
  el <- route_matrix(x)
  message(sprintf(
    "Orig rows: %s, edgelist rows: %s \nInput combinations: %s, output combinations: %s",
     nrow(x), nrow(x)*nrow(x), nrow(el),
    length(unique(paste0(el$orig_id, "_", el$dest_id)))))
  return(el)
}

test_two_inputs <- function(x, y) {
  message("* Origin and destination*")
  n_request(x, y)
  el <- route_matrix(x, y)
  message(sprintf(
    "Orig rows: %s, dest rows: %s, edgelist rows: %s \nInput combinations: %s, output combinations: %s",
    nrow(x), nrow(y), nrow(el), nrow(x)*nrow(y),
    length(unique(paste0(el$orig_id, "_", el$dest_id)))))
  return(el)
}

Calculate all input variants in route_matrix() and compare the number of combinations in the inputs with the combinations in the returned edge lists.

  • M - Only origin
el1 <- test_one_input(sf)
#> * Only origin *
#> Number of requests: 28
#> Orig rows: 200, edgelist rows: 40000 
#> Input combinations: 40000, output combinations: 40000
  • M:N - Origin and destination of same length
el2 <- test_two_inputs(sf[1:(n/2), ], sf[(n/2 + 1):n, ])
#> * Origin and destination*
#> Number of requests: 7
#> Orig rows: 100, dest rows: 100, edgelist rows: 10000 
#> Input combinations: 10000, output combinations: 10000
  • M:N - Origin and destination of different length
el3 <- test_two_inputs(sf[(n/3 + 1):n, ], sf[1:(n/2), ])
#> * Origin and destination*
#> Number of requests: 14
#> Orig rows: 133, dest rows: 100, edgelist rows: 13300 
#> Input combinations: 13300, output combinations: 13300
el4 <- test_two_inputs(sf[1:(n/2), ], sf[(n/3 + 1):n, ])
#> * Origin and destination*
#> Number of requests: 14
#> Orig rows: 100, dest rows: 133, edgelist rows: 13300 
#> Input combinations: 13300, output combinations: 13300
  • M:1 - Origin and destination
el6 <- test_two_inputs(sf[1:(n - 1), ], sf[n, ])
#> * Origin and destination*
#> Number of requests: 2
#> Orig rows: 199, dest rows: 1, edgelist rows: 199 
#> Input combinations: 199, output combinations: 199
  • 1:N - Origin and destination
el5 <- test_two_inputs(sf[1, ], sf[2:n, ])
#> * Origin and destination*
#> Number of requests: 2
#> Orig rows: 1, dest rows: 199, edgelist rows: 199 
#> Input combinations: 199, output combinations: 199
Session info
devtools::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.0.3 (2020-10-10)
#>  os       macOS Catalina 10.15.7      
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       Europe/Zurich               
#>  date     2020-12-23                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version    date       lib source        
#>  assertthat    0.2.1      2019-03-21 [1] CRAN (R 4.0.0)
#>  callr         3.5.1      2020-10-13 [1] CRAN (R 4.0.2)
#>  class         7.3-17     2020-04-26 [1] CRAN (R 4.0.3)
#>  classInt      0.4-3      2020-04-07 [1] CRAN (R 4.0.0)
#>  cli           2.2.0      2020-11-20 [1] CRAN (R 4.0.2)
#>  crayon        1.3.4      2017-09-16 [1] CRAN (R 4.0.0)
#>  curl          4.3        2019-12-02 [1] CRAN (R 4.0.1)
#>  data.table    1.13.2     2020-10-19 [1] CRAN (R 4.0.3)
#>  DBI           1.1.0      2019-12-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.2      2020-08-18 [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.1      2020-01-08 [1] CRAN (R 4.0.0)
#>  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.5.2.9000 2020-12-23 [1] local         
#>  htmltools     0.5.0      2020-06-16 [1] CRAN (R 4.0.2)
#>  jsonlite      1.7.1      2020-09-07 [1] CRAN (R 4.0.2)
#>  KernSmooth    2.23-18    2020-10-29 [1] CRAN (R 4.0.2)
#>  knitr         1.30       2020-09-22 [1] CRAN (R 4.0.2)
#>  lifecycle     0.2.0      2020-03-06 [1] CRAN (R 4.0.0)
#>  magrittr      2.0.1      2020-11-17 [1] CRAN (R 4.0.2)
#>  memoise       1.1.0      2017-04-21 [1] CRAN (R 4.0.0)
#>  pillar        1.4.7      2020-11-20 [1] CRAN (R 4.0.2)
#>  pkgbuild      1.1.0      2020-07-13 [1] CRAN (R 4.0.2)
#>  pkgconfig     2.0.3      2019-09-22 [1] CRAN (R 4.0.0)
#>  pkgload       1.1.0      2020-05-29 [1] CRAN (R 4.0.2)
#>  prettyunits   1.1.1      2020-01-24 [1] CRAN (R 4.0.0)
#>  processx      3.4.4      2020-09-03 [1] CRAN (R 4.0.2)
#>  ps            1.4.0      2020-10-07 [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.5      2020-07-06 [1] CRAN (R 4.0.2)
#>  remotes       2.2.0      2020-07-21 [1] CRAN (R 4.0.2)
#>  rlang         0.4.9      2020-11-26 [1] CRAN (R 4.0.3)
#>  rmarkdown     2.5        2020-10-21 [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-6      2020-09-13 [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.0      2020-10-31 [1] CRAN (R 4.0.2)
#>  tibble        3.0.4      2020-10-12 [1] CRAN (R 4.0.2)
#>  tidyselect    1.1.0      2020-05-11 [1] CRAN (R 4.0.0)
#>  units         0.6-7      2020-06-13 [1] CRAN (R 4.0.2)
#>  usethis       1.6.3      2020-09-17 [1] CRAN (R 4.0.2)
#>  vctrs         0.3.5      2020-11-17 [1] CRAN (R 4.0.2)
#>  withr         2.3.0      2020-09-22 [1] CRAN (R 4.0.2)
#>  xfun          0.19       2020-10-30 [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