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))
在 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))