为kml文件添加时间并转存为gpx航迹

为数码照片添加经纬度坐标, 若无gps航迹, 可用google earth绘制出路径。 然后用本文提供的R函数为kml中的数据点拟合时间, 并另存为gpx文件。生成的gpx文件可用来为照片添加地理坐标 (参见 http://blog.sciencenet.cn/blog-255662-864234.html )。

kml文件是google earth的一种标记语言, 属于xml格式。在google earth中绘制航迹时,只有经纬度,而无时间。

gpx文件也是一种xml文件,gps导出的航迹文件,由多个点组成, 顺序链接在一起, 核心部分由 经度, 纬度, 海拔, 以及时间组成, 其中经度, 纬度为WGS84坐标系,以度为单位。海拔单位为米, 时间格式为 2015-02-05T23:38:09Z, 按照坐标顺序, 第一个点时间最早。时间必须用世界时。

具体步骤操作如下:

  1. 在google earth绘制航迹, 保存为ttt.km

  2. 在R中, 用以下函数, 读取kml文件的坐标, 并拟合航迹的开始时间以及最后的时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
library(maptools)  ###导入需要maptools程序包
kml2timetag <- function(kmlfile = "ttt.kml",
start.time = "2015-02-04 21:39:36",
end.time = "2015-02-05 23:40:50",
csv.file = NULL)
#### kml2timetag 函数读取kml文件中的经纬度坐标
#### kml2timetag 函数, 用来读取kml文件, 拟定航迹上每个点的时间
#### 该函数假设每个点对应的时间均匀流逝。
#### 返回值为 data.frame, 共四列
#### (1) "longitude" (2) "latitude" (3) "altitude" (4)"time"
#### 并可以保存为csv文件, 在必要的情况下, 在excel中进行编辑。
{
require("maptools")
Sys.setlocale("LC_TIME", "English")
dat <- getKMLcoordinates(kmlfile = kmlfile, ignoreAltitude=FALSE)
start.time <- as.POSIXlt(start.time)
end.time <- as.POSIXlt(end.time)
time.zone = 8
points.time <- seq(start.time, end.time, length.out = nrow(dat[[1]]))
points.time2 <- format(points.time, "%Y-%m-%dT%H:%M:%SZ")
dat <- cbind(dat[[1]], points.time2)
colnames(dat) <- c("longitude", "latitude", "altitude", "time")
if(!is.null(csv.file)){
write.csv(dat, csv.file)
}
return(as.data.frame(dat))
}

tagkml2gpx <- function(dat, output = "res.gpx"){
#### tagkml2gpx 用来转换data.frame到
#### dat,为data.frame, 共四列, 列名必须为
#### (1) "longitude" (2) "latitude" (3) "altitude" (4)"time"
#### 即函数kml2timetag的返回值, 作为本函数的输入值
#### 输出值为gpx函数。
res <- c(
"<?xml version="1.0" encoding="UTF-8" standalone="no" ?>",
"<gpx>",
" <trk>",
" <name>Track written by tagkml2gpx</name>",
" <trkseg>")
for(i in 1:nrow(dat)){
res <- c(res,
paste(" <trkpt lat="",dat$latitude[i], "\" lon=\"",
dat$longitude[i], "\">", collapse = "", sep = ""),
paste(" <ele>", dat$altitude[i], "</ele>", sep = ""),
paste(" <time>", dat$time[i], "</time>", sep = ""),
" </trkpt>")
}
res <- c(res,
" </trkseg>",
" </trk>",
"</gpx>")
writeLines(res, output)
}

dat2 <- kml2timetag(kmlfile = "ttt.kml",
start.time = "2015-02-04 21:39:36",
end.time = "2015-02-05 23:40:50")
tagkml2gpx(dat2, output = "res.gpx")