Exercise A

#Exercise A

library(sf)
library(jsonlite)
library(dplyr)
library(purrr)
library(tidyr)
library(stringr)
library(readr)
library(tmap)
library(ggplot2)

records_json <- jsonlite::read_json("data/Zeitachse.json",simplifyVector = TRUE)

records <- records_json[[1]]

semanticSegments <- records_json$semanticSegments
rawSignal <- records_json$rawSignals                  #for activities


df <- map_dfr(semanticSegments$timelinePath, \(x)x)

df <- df |> 
  separate_wider_delim(point, ", ", names = c("lat","lon")) |> 
  mutate(
    lat = as.numeric(str_remove(lat, "°")),
    lon = as.numeric(str_remove(lon, "°")),
    time = readr::parse_datetime(time)
  )


df_sf <- df |> 
  st_as_sf(coords = c("lon", "lat"), crs = 4326)

df_sf_2056 <- st_transform(df_sf, 2056)
df_sf_2056$E <- st_coordinates(df_sf_2056)[,1]   
df_sf_2056$N <- st_coordinates(df_sf_2056)[,2]   


tmap_mode("view")
tm_shape(df_sf_2056) + tm_dots()
distance_by_element <- function(later, now) {
  as.numeric(
    st_distance(later, now, by_element = TRUE)
  )
}


df_sf_2056 <- df_sf_2056 |>
    mutate(
        nMinus2 = distance_by_element(lag(geometry, n = 2), geometry),  # distance to pos -30 minutes
        nMinus1 = distance_by_element(lag(geometry, 1), geometry),  # distance to pos -15 minutes
        nPlus1  = distance_by_element(geometry, lead(geometry, 1)), # distance to pos +15 mintues
        nPlus2  = distance_by_element(geometry, lead(geometry, 2))  # distance to pos +30 minutes
    )



df_sf_2056 <- df_sf_2056 |>
    rowwise() |>
    mutate(
        stepMean = mean(c(nMinus2, nMinus1, nPlus1, nPlus2), na.rm = FALSE)
    ) |>
    ungroup()
threshold <- mean(df_sf_2056$stepMean, na.rm = TRUE)


df_sf_2056 <- df_sf_2056 |>
    mutate(static = stepMean < threshold)

ggplot(df_sf_2056) +
  geom_path(aes(E,N))+
  geom_sf(aes(color=static))

df_filter <- df_sf_2056 |>
    filter(!static)

df_filter |>
    ggplot(aes(E, N)) +
    geom_point(data = df_sf_2056, col = "red") +
    geom_path() +
    geom_point() +
    coord_fixed() +
    theme(legend.position = "bottom")

rle_id <- function(vec) {
    x <- rle(vec)$lengths
    as.factor(rep(seq_along(x), times = x))
}


df_filter <- df_filter |>
    mutate(segment_id = rle_id(static))