Я предлагаю вам использовать lwgeom::st_geod_azimuth()
для этой задачи - это делает код несколько более лаконичным.
Обратите внимание, что при добавлении вектора опор обратно к пространственному кадру точек возникает проблема; по определению он на один элемент меньше числа строк (вам нужно две точки для определения направления).
Одна из возможностей достижения этого - если требуется - это объединение вектора с одним NA
значение, представляющее направление самой последней точки. По определению он не имеет азимута, так как нет следующей точки.
Значения азимута являются объектами единиц класса, первоначально в радианах. Если класс создает проблему (как это происходит при объединении с NA), вы можете легко преобразовать его в простое число с помощью units::drop_units()
.
library(sf)
library(dplyr)
library(lwgeom)
points <- st_read("Barron_Thomatis_2019_EOD.gpx",
layer = "track_points",
quiet = T,
stringsAsFactors = F)
points <- points %>%
mutate(bearing = c(lwgeom::st_geod_azimuth(.) %>% units::drop_units(), NA))