使用XML库导入gpx轨道

时间:2016-04-02 18:32:54

标签: xml r gpx

我想分析R中的gpx轨道。要导入数据,我尝试使用XML-package

我发现a tutorial解释了如何导入每个单独的数据向量,然后将它们组合到数据框中。

但是,在我的用例中,这不起作用,因为对于某些节点,没有收集心率<gpxtpx:hr>,因此向量的长度不匹配。

因此,我尝试一次导入所有相关数据。

到目前为止我能做的是

library(XML)

filename <- "sample.gpx"
download.file("https://owncloud.yeara.net/index.php/s/Io4uOq6sfFuCCdq/download", filename) # downloads a sample file from my server

gpx.raw <- xmlTreeParse(filename, useInternalNodes = TRUE)

rootNode <- xmlRoot(gpx.raw)

print(rootNode) # output seems okay

现在,我想将<trkseg>的内容导入数据帧,而不是rootNode。应按以下方式设计:

  • 每个trkseg应该是一行
  • trkpt lontrkpt lat<ele><time>应位于相应的列中
  • 如果有值<gpxtpx:hr>,它也应该进入相应的列

你能帮助我实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

这是我最终得到的代码。感谢大家(特别是@lukeA)的帮助。

var hours = $scope.mytime.getHours();
var month = $scope.mytime.getMonth();

// etc.

我遇到了多个library(XML) library(plyr) filename <- "Downloads/activity(1).gpx" gpx.raw <- xmlTreeParse(filename, useInternalNodes = TRUE) rootNode <- xmlRoot(gpx.raw) gpx.rawlist <- xmlToList(rootNode)$trk gpx.list <- unlist(gpx.rawlist[names(gpx.rawlist) == "trkseg"], recursive = FALSE) gpx <- do.call(rbind.fill, lapply(gpx.list, function(x) as.data.frame(t(unlist(x)), stringsAsFactors=F))) names(gpx) <- c("ele", "time", "hr", "lon", "lat") 的问题,因为我无法通过名称访问它们(因为它们在列表中都有相同的名称:trkseg)我可以用{{1}来解决这个问题命令和trkseg中精选的元素。

我想知道是否有更优雅的方式,但至少这似乎有用。

答案 1 :(得分:0)

这是一个类似@speendo答案的版本,但是使用了dplyr和purrr:

library(XML)
library(dplyr)
library(purrr)

filename <- "Downloads/activity(1).gpx"

gpx <- filename %>%
  xmlTreeParse(useInternalNodes = TRUE) %>%
  xmlRoot %>%
  xmlToList %>%
  (function(x) x$trk) %>%
  (function(x) unlist(x[names(x) == "trkseg"], recursive = FALSE)) %>%
  map_df(function(x) as.data.frame(t(unlist(x)), stringsAsFactors=FALSE))