当前位置: 首页 > 知识库问答 >
问题:

R从Google MyTracks中提取。kml文件

朱欣荣
2023-03-14

我想使用R从一个数组中读取“when”值。由Google My tracks创建的kml文件(摘录如下):

 ?xml version="1.0" encoding="UTF-8"?>
 <kml xmlns="http://www.opengis.net/kml/2.2"
 xmlns:gx="http://www.google.com/kml/ext/2.2"
 xmlns:atom="http://www.w3.org/2005/Atom">
 <Document>
 <open>1</open>
 <visibility>1</visibility>
 <name><![CDATA[2013-06-29 1:09pm]]></name>
 <atom:author><atom:name><![CDATA[Created by Google My Tracks on Android.]]></atom:name>     </atom:author>

 ...

 <gx:MultiTrack>
 <altitudeMode>absolute</altitudeMode>
 <gx:interpolate>1</gx:interpolate>
 <gx:Track>
 <when>2013-06-29T17:09:04.564Z</when>
 <gx:coord>-79.305048 43.710639 72.9000015258789</gx:coord>
 <when>2013-06-29T17:09:06.135Z</when>
 <gx:coord>-79.304971 43.710653 67.4000015258789</gx:coord>
 <when>2013-06-29T17:09:08.135Z</when>
 <gx:coord>-79.305193 43.710535 78.19999694824219</gx:coord>
 <when>2013-06-29T17:09:09.135Z</when>

节点“when”是“与位置相对应的时间值(在gx:coord元素中指定)”。“gx:coord”是“由经度、纬度和高度三个值组成的坐标值”。(https://developers.google.com/kml/documentation/kmlreference#gxtrack)

我想要的值的路径是:

 kml/Document/Placemark/gx:MultiTrack/gx:Track/when

发件人:xmlstarlet el“filename.kml”

我能够使用以下方法提取坐标和高度:

 coords <- xpathSApply(check, "//gx:coord", xmlValue)
 lat <- sapply(strsplit(as.character(coords)," "), "[",1)
 lon <- sapply(strsplit(as.character(coords)," "), "[",2)
 ele <- sapply(strsplit(as.character(coords)," "), "[",3)

但是我当时还没能得到。我想从文件中提取的是:

 17:09:04.564
 17:09:06.135
 17:09:08.135
 17:09:09.135

并将它们与坐标和标高对齐。

我试过:

timeStamp <- xpathSApply(check, "//gx:MultiTrack", xmlValue)

这就得到了一个可以解析的字符串,因为时间以“T”开始,以“Z”结束:

 [1] "absolute12013-06-29T17:09:04.564Z-79.305048 43.710639 72.90000152587892013-06-   29T17:09:06.135Z-79.304971 43.710653 67.40000152587892013-06-29T17:09:08.135Z-79.305193 43.710535 78.199996948242192013-06-29T17:09:09.135Z-79.305164 43.710592 77.699996948242192013-06-29T17:09:10.134Z-79.305097 43.710614 67.52013-06-29T17:09:11.137Z-79.305066 43.710572 

有什么好主意吗?提前感谢。

编辑-----

我不优雅的解决方案:

 file_name <- "2013-06-29 1-09pm.kml"
 library(XML)
 # read XML tree schema
 check <-xmlInternalTreeParse(file=file_name)
 library(gsubfn)
 # read kml file into a string 
 z <- xpathSApply(check, "//gx:MultiTrack", xmlValue)
 # find text bounded by (and including) T and Z
 x <- strapply(z,"T.+?Z")
 # unpack the resulting list
 x1 <- unlist(x)
 # get rid of the initial T
 x2 <- gsub("T", "", x1)
 # get rid of the trailing Z
 x3 <- gsub("Z", "", x2)
 # convert it to a time format
 time <- strptime(x3, "%H:%M:%OS")

共有1个答案

尉迟彬
2023-03-14

有更好的html解析方法,但我看没有人发布过。这将起作用,但regexing通常不赞成html解析。

library(qdap)
x <- unlist(genXtract(dat, "<when>", "</when>"))
y <- unlist(genXtract(dat, "<gx:coord>", "</gx:coord>"))

x[sapply(x, function(x) !identical(x, character(0)))]
y[sapply(y, function(x) !identical(x, character(0)))]

## > x[sapply(x, function(x) !identical(x, character(0)))]
##       <when>  :  </when>14       <when>  :  </when>16 
## "2013-06-29T17:09:04.564Z" "2013-06-29T17:09:06.135Z" 
##       <when>  :  </when>18       <when>  :  </when>20 
## "2013-06-29T17:09:08.135Z" "2013-06-29T17:09:09.135Z" 
## > y[sapply(y, function(x) !identical(x, character(0)))]
##             <gx:coord>  :  </gx:coord>15 
##  "-79.305048 43.710639 72.9000015258789" 
##             <gx:coord>  :  </gx:coord>17 
##  "-79.304971 43.710653 67.4000015258789" 
##             <gx:coord>  :  </gx:coord>19 
## "-79.305193 43.710535 78.19999694824219" 
 类似资料:
  • 我想从. kml文件中提取值,以便使用R进行描述。 文件如下: 这是我想提取的,包含在 即。: xmlToList给我,我认为NULL,因为CDATA标记意味着以下内容不被解析器处理: 我认为这就是所谓的“CDATA这个术语是用来描述XML解析器不应该解析的文本数据……解析器会忽略CDATA节中的所有内容。CDATA节以“”开头 以下内容对我也不起作用,也许是出于与CDATA相关的同样原因: 有人

  • 问题内容: 我已将一些地址上传到BatchGeo,并下载了要从中提取坐标的结果KML文件。我设法在这里在线整理了混乱的文本文件,但是我不知道如何解析它以提取坐标。 似乎有几个适用于python的kml库,但在文档方面却没有太多(例如pyKML)。通过本教程,我已经了解了这一点,并创建了一个’lxml.etree._ElementTree’对象,但不确定其属性: 这给出了错误: 那么如何获取坐标列表

  • 我有一个shapefile,我正在尝试将其转换为kml文件,以便在Qlik意义上使用它。我想将kml区域和kml名称(标记为扇区ID)存储在kml中。下面是我使用的代码 我试过各种各样的软件包,但似乎都不管用。到目前为止,我只能得到没有正确标签(扇区ID)的kml区域。我尝试过的方法之一是plotKML包中的kml函数,但当我尝试在Qlik中读取它们时,它已损坏。 如果能对我上面的代码提供任何帮助

  • 问题内容: 我一直试图从R中获取MySQL数据库中的UTF-8文本。我正在OS X上运行R(通过GUI和命令行进行尝试),其中默认语言环境为en_US.UTF-8,并且没有无论我尝试什么,查询结果都会显示“?” 用于所有非ASCII字符。 我尝试了设置,通过ODBC连接时,在获取结果后进行设置,以及每个设置的’utf8’变体,都无济于事。从命令行mysql客户端运行查询可以正确显示结果。 我完全迷

  • 我有一个KML文件如下: 我想分别提取每个placemark的名称以及与该placemark关联的LineString标记中的所有坐标,结果如下: 我已经尝试了这里提出的所有解决方案,但没有一个适合我的数据。事实上,那里的所有解决方案都是高度通用的,并且没有提供用于检查它们的测试数据。 更新:我在下面的代码中取得了一些进展,它允许提取所有的位置标记和线性坐标(我只是忘记了该死的命名空间): 但是仍

  • 我是R的新手,想读一个csv文件。但是当我试图阅读它时,我遇到了错误。我的csv文件如下: 当我在RStudio中使用此命令时,我得到了错误:命令: 错误: 读取时出错。表(file=file,header=header,sep=sep,quote=quote,:不允许重复的“row.names” 我还尝试删除错误并使用此命令: 但是当我查看输出时,它不能保持方阵的结构。你能帮我做什么吗?