Прочитать несколько файлов .gpx - PullRequest
5 голосов
/ 18 июня 2011

Предположим, у меня есть несколько файлов .gpx (они содержат данные путевых точек GPX из Garmin eTrex).Я хочу загрузить их в R с разными именами и манипулировать ими.

Я могу прочитать один файл таким образом:

library(maptools)
gpx.raw <- readGPS(i = "gpx", f = "file1_w_12_f_ddf.gpx", type="w")

Предположим, я хочу прочитать несколько из них в память.Я мог бы попробовать для цикла:

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 </p>

Обратите внимание, что я смог прочитать этот файл сам по себе, так что может показаться, что он не имеет никакого отношения к самому файлу, а к запуску readGPS в цикле.

В общем, мне все еще очень непонятно, как R обрабатывает переменные, такие как x выше.Я не уверен, как изменить аргумент readGPS из автономного экземпляра f = "file1_w_12_f_ddf.gpx": это должен быть 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 и на которую есть ссылки.

Ответы [ 2 ]

6 голосов
/ 18 июня 2011

Fred,

После установки GPSBabel и обновления переменной PATH ваш фрагмент кода работает нормально.У меня есть два объекта с именами test1.gpx_NA_NA и test2.gpx_NA_NA с тремя наблюдениями за 28 переменными.Это правильно?Я предполагаю, что бит NA в именах файлов связан с тем, как вы определяете visit.id, а имена моих тестовых файлов не вписываются в эту парадигму.

Вы пробовали это на новом экземпляре R?

FWIW, я бы, вероятно, прочитал все эти файлы в один объект списка.Я считаю, что иметь дело с объектом списка проще, чем с множеством различных объектов, плавающих вокруг.Например,

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 приводит к зависаниям x, temp и visit.id.Вы можете заключить их в вызов функции, но я думаю, что использование lapply будет более простым.

4 голосов
/ 18 июня 2011

Оказывается, код был в порядке, проблема с именами файлов.GPSBabel не любит имена с пробелами.Таким образом, «1_San José Baldi_Pernam_14_sep.gpx» является проблемой, «1_San_José_Baldi_Pernam_14_sep.gpx» - нет.

...