我已将运动手表中的一些GPS点导入R:
library(plotKML)
route <- readGPX("Move_Cycling.gpx")
str(route)
数据如下所示:
List of 5
$ metadata : NULL
$ bounds : NULL
$ waypoints: NULL
$ tracks :List of 1
..$ :List of 1
.. ..$ Move:'data.frame': 677 obs. of 5 variables:
.. .. ..$ lon : num [1:677] -3.8 -3.8 -3.8 -3.8 -3.8 ...
.. .. ..$ lat : num [1:677] 52.1 52.1 52.1 52.1 52.1 ...
.. .. ..$ ele : chr [1:677] "152" "151" "153" "153" ...
.. .. ..$ time : chr [1:677] "2014-06-08T09:17:08.050Z" "2014-06-08T09:17:18.680Z" "2014-06-08T09:17:23.680Z" "2014-06-08T09:17:29.680Z" ...
.. .. ..$ extensions: chr [1:677] "7627.7999992370605141521101800" "7427.6000003814697141511.7000000476837210180.8490009442642210" "9127.523.13003521531.7000000476837210181.799999952316280" "10027.534.96003841534.1999998092651410181.88300029210510" ...
$ routes : NULL
我设法进行转换,将数据点转换为SpatialPointsDataFrame
,然后将其绘制在Google地球上:
SPDF <- SpatialPointsDataFrame(coords=route$tracks[[1]]$Move[1:2],
data=route$tracks[[1]]$Move[1:2],
proj4string = CRS("+init=epsg:4326"))
plotKML(SPDF)
我真正想要的是自行车赛道,即SpatialLinesDataFrame
,但我无法弄清楚如何正确设置ID字段以使SpatialLines
对象与数据匹配。
这是我有多远:
tmp <- Line(coords=route$tracks[[1]]$Move[1:2])
tmp2 <- Lines(list(tmp), ID=c("coord"))
tmp3 <- SpatialLines(list(tmp2), proj4string = CRS("+init=epsg:4326"))
# result should be something like,
# but the ID of tmp3 and data don't match at the moment
SPDF <- SpatialLinesDataFrame(tmp3, data)
答案 0 :(得分:2)
您可以使用readOGR
包中的rgdal
将GPX文件直接读入SpatialLinesDataFrame对象。 GPX文件可以包含轨道,航点等,OGR将其视为文件中的图层。简单地说:
> track = readOGR("myfile.gpx","tracks")
> plot(track)
应该有效。你应该看到线条。
在你的最后一行中,你没有说出你的data
是什么,但是如果你试图从一些SpatialLines和一个数据框构建一个SpatialLinesDataFrame,那么它需要是每个轨道有一行的数据框,并且您可以告诉它不要打扰匹配ID,因为您实际上没有任何合并的真实每轨道数据。所以:
> SPDF = SpatialLinesDataFrame(tmp3, data.frame(who="me"),match=FALSE)
> plot(SPDF)
但如果您使用readOGR
,则无需完成所有操作。它还会从GPX文件中读取一些每轨道元数据。
快乐的自行车!
答案 1 :(得分:1)
作为更新,这是我的最终解决方案
library(rgdal)
library(plotKML)
track <- readOGR("Move_Cycling.gpx","tracks")
plotKML(track, colour='red', width=2, labels="Cwm Rhaeadr Trail")