R SpatialPointsDataFrame到SpatialLinesDataFrame

时间:2014-06-29 09:27:11

标签: r spatial

我已将运动手表中的一些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)

2 个答案:

答案 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")

enter image description here