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()Exercise A
#Exercise A
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))