首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取多个.gpx文件

读取多个.gpx文件
EN

Stack Overflow用户
提问于 2011-06-18 17:00:49
回答 2查看 3.6K关注 0票数 5

假设我有许多.gpx文件(这些文件包含来自Garmin eTrex的GPX路径点数据)。我想用不同的名字把它们加载到R中,然后操纵它们。

因此,我可以读取一个文件:

代码语言:javascript
复制
library(maptools)
gpx.raw <- readGPS(i = "gpx", f = "file1_w_12_f_ddf.gpx", type="w")

假设我想将其中的一些读入内存。我可以尝试一个for循环:

代码语言:javascript
复制
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"))
}

运行以上程序将产生以下错误:

read.table中的错误(con <- textConnection(gpsdata),fill = TRUE,.):除了输入之外没有可用的行:警告消息:运行命令'C:\PROGRA~2\GPSBabel\gpsbabel.exe -w -i gpx -f file1_w_12_f_ddf.gpx -o tabsep -F -‘有状态1

请注意,我能够单独读取该文件,因此它似乎与文件本身无关,只与循环中运行readGPS无关。

一般来说,我仍然觉得R如何对待像x这样的变量是非常令人困惑的。我不知道如何从独立实例readGPS修改参数f = "file1_w_12_f_ddf.gpx":是x,还是f = x,还是f = "x",或者什么?或者问题是打电话给GPSBabel.

我在下面包含了一个示例文件,这样您就可以将它复制到文本编辑器中,并保存为.gpx。两次用不同的名字试一试。

代码语言:javascript
复制
<?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,您需要在PATH变量中安装和引用开源GPSBabel程序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-18 18:22:48

原来代码很好,问题是文件名。GPSBabel不喜欢带有空格的名称。所以"1_San JoséBaldi_Pernam_14_sep.gpx“是个问题,"1_San_José_Baldi_Pernam_14_sep.gpx”不是。

票数 4
EN

Stack Overflow用户

发布于 2011-06-18 17:23:36

弗雷德,

安装GPSBabel并更新PATH变量后,代码段运行良好。我有两个对象名为test1.gpx_NA_NAtest2.gpx_NA_NA,三个观察对象有28个变量。是那么回事吗?我认为文件名中的NA位是由于您如何定义visit.id和我的测试文件名不符合该范例。

你在R的新例子上试过这个吗?

FWIW,我可能会将所有这些文件读入一个列表对象中。我发现处理list对象比让许多不同的对象在周围浮动更容易。例如,

代码语言:javascript
复制
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的列表,其中每个对象都是一个data.frame,其中包含以前与其关联的文件的名称。使用*apply家族的东西也有好处,留下了干净的工作空间。使用for-循环会导致xtempvisit.id挂起后缀。您可以将它们封装到一个函数调用中,但我认为,只使用lapply会更直接。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6397523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档