R: направление / направление движения / направление из файла .gpx - tmaptools - PullRequest
0 голосов
/ 05 марта 2020

Использование пакета tmaptools в R - Как я могу извлечь информацию 'Bearing' из файла трека .GPX. Это появляется в Garmin Basecamp, но не появляется при использовании tmaptools :: read_GPX. В настоящее время я использую приведенный ниже код. Но наверняка есть более простой способ? Ссылка на трек GPS: https://www.dropbox.com/s/02p3yyjkv9fmrni/Barron_Thomatis_2019_EOD.gpx?dl=0

library(tmaptools)
library(tmap)
library(sf)
library(tidyverse)
library(geosphere)


GPSTrack <- read_GPX("Barron_Thomatis_2019_EOD.gpx", layers = "track_points", as.sf = TRUE)

#
#Adjust GPS Track Data
#

#Extract Lat & Lon from Track geometery (c(lat, Lon))
GPSTrack_Pts <- st_coordinates(GPSTrack)

#Add X, Y Columns to Track
GPSTrack2 <- cbind(GPSTrack, GPSTrack_Pts)

#Create a coordinate vector by combining X & Y
coords <- cbind(GPSTrack2$X,GPSTrack2$Y)

#Convert GPS Track into SpatialPoints format for calculating Bearing
GPSTrack_SpPts <- SpatialPoints(coords)

#Create GPS Point Bearing, GPP point distance & GPS Time interval columns
empty <- st_as_sfc("POINT(EMPTY)")

GPSTrack2 <- GPSTrack2 %>%
  st_set_crs(4326) %>%  # will use great circle distance
  mutate(
    Bearing = bearing(coords))

#Convert Bearing to Course and Add as column
GPSTrack2 <- GPSTrack2 %>% 
  mutate(course = (Bearing + 360) %% 360) # add full circle, i.e. +360, and determine modulo for 360

1 Ответ

1 голос
/ 05 марта 2020

Я предлагаю вам использовать 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))
...