R:来自 .gpx 文件的航向/行进方向/方位 - tmaptools

R: Heading/ Direction of Travel/ bearing from .gpx file - tmaptools

在 R 中使用 tmaptools 包 - 如何从 .GPX 轨道文件中提取 'Bearing' 信息。这会出现在 Garmin Basecamp 中,但不会出现在使用 tmaptools::read_GPX 中。目前我使用下面的代码。但肯定有更简单的方法吗? Link 到 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

我建议您使用 lwgeom::st_geod_azimuth() 完成此任务 - 它使代码更加简洁。

请注意,将方位向量添加回点的空间数据帧时存在挑战;根据定义,它的元素比行数少一个(你需要两个点来定义方位角)。

实现这一目标的一种可能性(如果需要)是将向量与表示最后一点方位的单个 NA 值连接起来。根据定义,它没有方位角,因为没有跟随点。

方位角值是class个单位的对象,最初以弧度为单位。如果 class 产生问题(就像与 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))