vlambda博客
学习文章列表

R语言--KML格式转换为GPX

KML全称是Keyhole Markup Language KML,是一个基于XML语法和文件格式的文件,用来描述和保存地理信息如点、线、图片、折线并在Google Earth客户端中显示,是一种在GOOGLE地图浏览器中用于交换地理数据的文件。
GPX文件是一种通用的地图信息文件,是最早也是最常用的,它可被各种导航仪和地图软件识别,在GPX中,一个没有顺序关系的点集合,叫路点;一个有顺序的点的集合叫轨迹或者路程;轨迹是一个人曾经走过的记录,路程是一个建议的下一步要走的地方。所以,一般来讲,轨迹里的点,包含时间信息,路程里的点,没有时间信息。最小的一个GPX文件,仅仅包含一个经纬度坐标的点,其它的都是可选的。
通常轨迹记录软件都能够同时导出这两种格式的文件,但有时候并不能。KML格式转化为GPX格式文件有非常多的转换软件可使用,如Geomapper office、GIS OFFICE、Ge2GPX、KML2GPX、GPSconverter和GPSBabel等软件,但有时候KML格式的文件只有开始时间和结束时间,并没有每个记录点相应的时间,需要自己添加,并转化为GPX。因此需要将一段时间分割成和记录点一样多的时间点并一一对应。
举例一个KML格式的文件:

转化代码:
install.packages("maptools")
library(maptools)library(stringr)library(XML)
kmlfile = "220200903.kml"#文件名read_html(kmlfile)web <- kmlfile%>%read_html(encoding = "UTF-8")Time <- web %>% html_node("description") %>% html_text()start.time=substr(Time,14,32)#获取开始时间end.time=substr(Time,37,55)#获取结束时间

若是开始时间和结束时间获取失败,利用谷歌浏览器打开kml文件后查看详细信息并手动输入代码:

kmlfile = "20200903.kml"start.time = "2020-09-03 08:30:41"end.time =  "2020-09-03 15:02:45"
转换:
require("maptools") Sys.setlocale("LC_TIME", "English") data <- 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(data[[1]])) points.time2 <- format(points.time, "%Y-%m-%dT%H:%M:%SZ") data <- cbind(data[[1]], points.time2) colnames(data) <- c("longitude", "latitude", "altitude", "time")
Trackfile <- c('<?xml version="1.0" encoding="UTF-8" standalone="no" ?>',"<gpx>"," <trk>"," <name>Track written by zfx</name>"," <trkseg>") for(i in 1:nrow(data)){ Trackfile <- c(Trackfile, paste(' <trkpt lat="',data[i,2], '" lon="', data[i,1], '">', collapse = "", sep = ""), paste(" <ele>", data[i,3], "</ele>", sep = ""), paste(" <time>", data[i,4], "</time>", sep = ""), " </trkpt>") } Trackfile <- c(Trackfile," </trkseg>"," </trk>","</gpx>")writeLines(Trackfile, "20200904.gpx")#导出文件为20200904.gpx的文件


采用Notepad++软件打开gpx文件可见:


接下来可利用GPX文件采用GPicSync软件将照片写入GPS信息,或者查看轨迹。