R/route_progress.R

Defines functions progress_per_time progressAlong densifyRoute

Documented in progress_per_time

densifyRoute <- function(route, seg_dist = 100) {  # meters
  if (nrow(route) > 2) {
    densify <- data.frame(geosphere::makeLine(route[, c("lon", "lat")], seg_dist))
    densify <- densify[, c("lat", "lon")]
  } else {
    rdist <- route_dist(route)
    densify <- data.frame(geosphere::gcIntermediate(
      route[1, c("lon", "lat")],
      route[2, c("lon", "lat")],
      rdist / seg_dist))
    densify <- densify[, c("lat", "lon")]
  }
  rows <- nrow(densify) - 1
  densify$lat_prev <- c(NA, head(densify$lat, rows))
  densify$lon_prev <- c(NA, head(densify$lon, rows))
  densify$dist <- haversine(densify$lat, densify$lon,
                            densify$lat_prev, densify$lon_prev)
  total <- c(0, cumsum(densify[2:nrow(densify), 'dist']))
  cbind(densify, total)
}

# Progress along a non-straight-line route
# One-way, point-to-point
progressAlong <- function(track, routeDens) {
  currLoc <- track[nrow(track), c('lat', 'lon')]
  routeDist <- routeDens[nrow(routeDens), 'total']

  # Compute distance-from-current-location
  # of each point along densified route.
  routeDens$distFromCurr <- haversine(currLoc$lat, currLoc$lon,
                                      routeDens$lat, routeDens$lon)
  # Find point along densified route that
  # current location is closest to.
  closest <- routeDens[routeDens$distFromCurr == min(routeDens$distFromCurr),
                       c('lat', 'lon', 'total')]

  # how far along the route line is that point?
  closest$total / routeDist
}


#' Get progress per time interval
#'
#' @param track
#' @param finish_lat
#' @param finish_lon
#' @param freq
#'
#' @return
#' @importFrom dplyr mutate '%>%'
#' @export
#'
#' @examples
progress_per_time <- function(track, finish_lat, finish_lon, freq) {
  track %>%
    trk_reduce(freq) %>%
    mutate(
      from_finish = haversine(lat, lon, finish_lat, finish_lon),
      progress = dplyr::lag(from_finish) - from_finish
    ) %>%
    select(time, progress)
}
evmo/Rgps documentation built on March 23, 2023, 2:24 a.m.