张金龙的博客分享 http://blog.sciencenet.cn/u/zjlcas 物种适应性、分布与进化

博文

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

已有 8204 次阅读 2015-2-5 00:33 |系统分类:科研笔记|关键词:学者

       为数码照片添加经纬度坐标, 若无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

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

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




https://m.sciencenet.cn/blog-255662-865658.html

上一篇:世上再无Stefan
下一篇:忆铁峰​

0

该博文允许注册用户评论 请点击登录 评论 (4 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2022-12-5 14:48

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部