#' 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)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.