阅读多个.gpx文件

5
假设我有许多个.gpx文件(这些文件包含来自Garmin eTrex的GPX航点数据)。我想用不同的名称将它们加载到R中并进行操作。
我可以这样读取一个文件:
library(maptools)
gpx.raw <- readGPS(i = "gpx", f = "file1_w_12_f_ddf.gpx", type="w")

假设我想将它们中的一些读入内存。我可以尝试使用 for 循环:

files <- list.files(".",pattern = "*.gpx")
for(x in files){

    #Create new file name
    temp <- strsplit(x,"_",fixed=TRUE)
    visit.id <- sapply(temp,FUN=function(x){paste(x[1],x[4],substr(x[5],1,3),sep="_")})

    #read file with new filename
    assign(visit.id, readGPS(i = "gpx", f = x, type="w"))
}

运行上述程序会产生以下错误:
``` Error in read.table(con <- textConnection(gpsdata), fill = TRUE, ...) : no lines available in input In addition: Warning message: running command 'C:\PROGRA~2\GPSBabel\gpsbabel.exe -w -i gpx -f file1_w_12_f_ddf.gpx -o tabsep -F -' had status 1 ```
请注意,我能够单独读取此文件,因此似乎与文件本身无关,而是与在循环中运行readGPS有关。
总的来说,我仍然觉得R如何处理像上面的变量x非常令人困惑。 我不确定如何修改从独立实例`f =“file1_w_12_f_ddf.gpx”`传递给readGPS的参数:它应该是`x`,还是`f = x`,还是`f =“x”`,或者其他什么? 或者问题可能出现在对GPSBabel的调用中...
我在下面包含一个示例文件,以便您可以将其复制到文本编辑器中,并保存为`.gpx`两次,使用不同的名称并自行尝试。
<?xml version="1.0" encoding="UTF-8"?>
<gpx
 version="1.0"
 creator="GPSBabel - http://www.gpsbabel.org"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://www.topografix.com/GPX/1/0"
 xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
 <time>2010-09-14T18:35:43Z</time>
 <bounds minlat="18.149888897" minlon="-96.747799935" maxlat="50.982883293" maxlon="121.640266674"/>
<wpt lat="38.855549991" lon="-94.799016668">
<ele>325.049072</ele>
 <name>GARMIN</name>
 <cmt>GARMIN</cmt>
 <desc>GARMIN</desc>
 <sym>Flag</sym>
 </wpt>
 <wpt lat="50.982883293" lon="-1.463899976">
 <ele>35.934692</ele>
 <name>GRMEUR</name>
 <cmt>GRMEUR</cmt>
 <desc>GRMEUR</desc>
 <sym>Flag</sym>
 </wpt>
 <wpt lat="25.061783362" lon="121.640266674">
 <ele>38.097656</ele>
 <name>GRMTWN</name>
 <cmt>GRMTWN</cmt>
 <desc>GRMTWN</desc>
 <sym>Flag</sym>
 </wpt>
 </gpx>

注意:要运行readGPS,您需要安装并将开源GPSBabel程序引用到您的PATH变量中。


关于readGPS函数的f参数:只有当它是调用readGPS时第二个参数时,传递x才能起作用;无论将其放在哪里,传递f=x都可以工作;而传递f="x"根本行不通(无论你已经将变量名为x的变量存储了什么内容,它都会将字符"x"传递给参数f)。 - joran
2个回答

6

Fred,

安装GPSBabel并更新PATH变量后,您的代码片段可以正常运行。我有两个对象名为test1.gpx_NA_NAtest2.gpx_NA_NA,每个对象都包含28个变量的三个观测值。这是正确的吗?我认为文件名中的NA位是由于您如何定义visit.id以及我的测试文件名无法适应该范例而引起的。

您在新的R实例上尝试过吗?

顺便说一下,我可能会将所有这些文件读入单个列表对象中。与许多不同的独立对象相比,我发现处理列表对象更容易。例如,

files <- dir(pattern = "\\.gpx")
#Replace all space characters with a "_". Replace with the character of your choice.
lapply(files, function(x) file.rename(from = x, to = gsub("\\s+", "_", x)))

#Reread in files with better names:
files <- dir(pattern = "\\.gpx")
out <- lapply(files, function(x) readGPS(i = "gpx", f = x, type = "w"))
names(out) <- files

out现在是一个包含2个数据框的列表,每个数据框都有前面所述文件的名称。使用*apply系列函数可以使工作空间更加清洁。使用for循环会导致xtempvisit.id在之后仍然存在。您可以将它们包装成函数调用,但我认为只使用lapply会更加直观。


哈!我的电脑上运行不了?!?!我想知道是不是跟Windows有关系。我把我的笔记本用作用户而不是管理员,所以可能权限在某个地方出了问题。顺便说一下,我尝试过你的代码,得到了同样的错误。奇怪的是,我仍然可以逐个访问一个文件。 - Fred
@Chase 我想我找到了问题所在。它与文件名有关。目前,这些文件的名称很长,带有重音符号等,例如“1_San José Baldi_Pernam_14_sep.gpx”。当我将名称更改为“test1”时,它可以工作。顺便说一下,感谢您提供lapply指针。 - Fred
@Chase 实际上问题不在重音符号,而是在空格上。所以“1_San José Baldi_Pernam_14_sep.gpx”有问题,“1_San_José_Baldi_Pernam_14_sep.gpx”则没有。浪费了三个小时。编程的乐趣啊... - Fred
@Fred - 很高兴你解决了问题。我更新了我的答案,加入了一些正则表达式来处理有问题的空格。还要感谢你向我展示了readGPS,我有2.5年的Garmin 500骑行数据,包括GPS轨迹、速度、海拔、心率和功率,一直想在R中玩弄它们! - Chase
@Chase - 顺便说一下,你已经在文件向量中用下划线替换了空格,但在系统级别上没有这样做。readGPS将无法找到重命名的文件。 - Fred
显示剩余3条评论

4

原来代码没问题,问题出在文件名上。GPSBabel不喜欢有空格的文件名。所以"1_San José Baldi_Pernam_14_sep.gpx"是一个问题,而"1_San_José_Baldi_Pernam_14_sep.gpx"就没有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接