R/check_coverage.R

Defines functions check_coverage

Documented in check_coverage

#' Checks if one or multiple points are in covered area
#'
#' Checks if multiple points fall within Citymapper's covered areas.
#'  Multiple inputs can be passed in a vector or list format.
#'  It is good practice to refresh this values regularly as covered areas might change over time.
#'
#' @inheritParams citymappr_setup
#' @param points List or vector containing geographical coordinates of the start point
#'   in WGS84 \code{'<latitude>,<longitude>'} format.
#' @return A vector containing boolean responses for each point in \code{points}
#'
#' @examples
#' \dontrun{
#' point <- "41.889083,12.470514"
#'
#' check_coverage(point)
#  [1] TRUE
#' }
#'
#' @importFrom magrittr %>%
#' @importFrom jsonlite fromJSON toJSON
#' @importFrom httr RETRY POST content stop_for_status add_headers
#'
#' @export
check_coverage <- function(points,
                           api_token=Sys.getenv("CITYMAPPER_API_TOKEN")) {

  # Check if api token has been provided
  if (api_token == "") {
    stop("Citymapper API token not found, please provide one.
         Check ?citymappr_setup on how to pass the api token")
  }

  # Check if junk input was provided
  # TODO: there must be a cleaner way to do input validation
  suppressWarnings(
    if(is.na(
      all(as.numeric(unlist(strsplit(points, ","))))
    )){
      stop("Malformed data was provided")
    }
  )

  points_payload <- data.frame(coord = points)

  points_payload$coord <- lapply(
    strsplit(as.character(points), ","),
    as.numeric
  )

  points_payload <- toJSON(list(`points` = points_payload))

  resp <- RETRY("POST", url = paste0("https://developer.citymapper.com/api/1/coverage/?key=",
                                     api_token),
                add_headers(c("User-Agent" = "https://github.com/andodet/citymappR/",
                              "Content-Type" = "appliation/json")),
                body = points_payload
                )

  stop_for_status(resp)

  res <- fromJSON(content(resp, "text", encoding = "UTF-8"))[["points"]][["covered"]]
  return(res)

}
andodet/citymappR documentation built on Oct. 18, 2021, 6:11 p.m.