R/plot_telemetry.R

Defines functions plot_telemetry

Documented in plot_telemetry

#' Import telemetry data
#'
#' @description Plot telemetry data from the read_telemetry() function and automatically calculates the distance travelled.
#'
#'
#' @param data a list from the read_telemetry() containing all the data from the .csv.
#' @param labeldegree if TRUE return axis labels with degree symbol (temporary solution for Error in grid.Call in macOS)
#'
#' @details  Returns a list of plots. Use ggsave(), pdf() or similar functions to loop over the list and save all plots.
#'
#' @example plot_telemetry(data = read_telemetry(folder = folder, stringsAsFactors = FALSE, sep = ","))
#'
#' @export


plot_telemetry <- function(data, labeldegree = FALSE){

  if(class(data) != "list")
    stop("Data is not a list. Check function read_telemetry() to load data.")

  if(!is.logical(labeldegree))
    stop("labeldegree must be logical.")

  # convert shapefile
  shp.bs <- ggplot2::fortify(shp_list$shp_bs)

  # get santos basin map
  shp.bs.gmap <- ggmap::get_googlemap(
    center = c(lon = mean(shp_list$shp_bs@bbox[1,]), lat = mean(shp_list$shp_bs@bbox[2,])),
    zoom = 6, size = c(640, 640), language = "pt-BR",
    maptype = "satellite", scale = 1)

  bb.bs <- attr(shp.bs.gmap, "bb")
  bb2.bs <- data.frame(long = unlist(bb.bs[c(2, 4)]),
                       lat = unlist(bb.bs[c(1,3)]))

  tmp.zoom <- vector()

  # Check if zoom is ok
  zoom.bs <- ggmap::calc_zoom(lon = unlist(bb.bs[c(2, 4)]), lat = unlist(bb.bs[c(1,3)]))

  tmp.plot.list <- list()

  for(i in 1:length(data)){

    tmp.data <- data[[i]]

    id.zoom <- ggmap::calc_zoom(extendrange(tmp.data[, "Latitude"]),
                                extendrange(tmp.data[, "Longitude"]))

    if(id.zoom > zoom.bs){
      tmp.zoom <- zoom.bs
    } else {
      tmp.zoom <- id.zoom
    }

    tmp.gmap <- ggmap::get_googlemap(
      center = c(long = median(tmp.data[, "Longitude"]),
                 lat = median(tmp.data[, "Latitude"])),
      zoom = tmp.zoom, maptype = "satellite", scale = 1,
      size = c(640, 640), language = "pt-BR")

    bb <- attr(tmp.gmap, "bb")
    bb2 <- data.frame(long = unlist(bb[c(2, 4)]),
                      lat = unlist(bb[c(1,3)]))

    if(extendrange(tmp.data[, "Latitude"])[1] < extendrange(bb2$lat)[1] &&
       extendrange(tmp.data[, "Latitude"])[2] < extendrange(bb2$lat)[2] |
       extendrange(tmp.data[, "Longitude"][1]) < extendrange(bb2$long)[1] &&
       extendrange(tmp.data[, "Longitude"][2]) < extendrange(bb2$long)[2])

      tmp.zoom <- id.zoom-1

    tmp.gmap <- ggmap::get_googlemap(
      center = c(long = median(tmp.data[, "Longitude"]),
                 lat = median(tmp.data[, "Latitude"])),
      zoom = tmp.zoom, maptype = "satellite", scale = 1,
      size = c(640, 640), language = "pt-BR")

    bb <- attr(tmp.gmap, "bb")
    bb2 <- data.frame(long = unlist(bb[c(2, 4)]),
                      lat = unlist(bb[c(1,3)]))

    # calc distance travelled
    if(length(tmp.data$Latitude) > 1){
      tmp.dist <- analyzeGPS::distanceGPS(
        lat1 = tmp.data$Latitude[1:(length(tmp.data$Latitude) - 1)],
        lon1 = tmp.data$Longitude[1:(length(tmp.data$Longitude) - 1)],
        lat2 = tmp.data$Latitude[2:length(tmp.data$Latitude)],
        lon2 = tmp.data$Longitude[2:length(tmp.data$Longitude)])
      tmp.data$distance_travelled <- cumsum(c(0, tmp.dist))
    } else {
      tmp.dist <- NA
      tmp.data$distance_travelled <- NA
    }


    tmp.plot.map <- ggmap::ggmap(tmp.gmap) +
      geom_map(data = shp.bs, map = shp.bs,
               aes(x = long, y = lat, map_id = id, group = group),
               colour = "blue", linetype = 1, size = 0.5,
               fill = scales::alpha("#81D4FA", 0.20)) +
      geom_path(data = tmp.data, size = 1.5, alpha = 0.75,
                aes(y = Latitude, x = Longitude, colour = Data))

    tmp.gbuild <- ggplot_build(tmp.plot.map)

    yrange = tmp.gbuild$layout$panel_scales_y[[1]]$range$range
    xrange = tmp.gbuild$layout$panel_scales_x[[1]]$range$range

    xmajor = tmp.gbuild$layout$panel_params[[1]]$x.major
    ymajor = tmp.gbuild$layout$panel_params[[1]]$y.major

    tmp.plot.list[[i]] <-
      tmp.plot.map +
      scale_colour_gradient("Data",
                            low = "yellow", high = "red",
                            trans = time_trans()) +
      {if(isTRUE(labeldegree)) scale_x_long(limits = xrange, xmin = min(xmajor), xmax = max(xmajor), step = length(xmajor))} +
      {if(isTRUE(labeldegree)) scale_y_lat(limits = yrange, ymin = min(ymajor), ymax = max(ymajor), step = length(ymajor))} +
      labs(subtitle = unique(as.character(tmp.data$ID)),
           caption = paste0("Deslocamento = ",
                            format(max(tmp.data$distance_travelled)/1000, digits = 1),
                            " Km")) +
      theme(legend.position = "right",
            plot.title = element_text(face = "italic"),
            panel.border = element_rect(color = "black", fill = "NA"),
            panel.grid = element_blank(),
            legend.justification = c(0, 0),
            axis.text = element_text(colour = "black", size = rel(1)),
            axis.title = element_text(colour = "black", size = rel(1)),
            axis.ticks = element_line(colour = "black"))

  }

  names(tmp.plot.list) <- names(data)
  return(tmp.plot.list)

}
machadoams/botomapr documentation built on Aug. 22, 2020, 9:44 p.m.