1. 学习 KML 的背景

这次对 KML 的学习,主要原因是我 GitHub 项目 GPX-in-China 的一个 issus 疑似无效 。这个项目可以将 WGS84 坐标系的 GPX/KML 转换为 GCJ02 坐标系,这样不同设备生成的 GPX / KML 文件就可以正确的在 Google Map 等工具中显示。这个 issue 表明我之前写的代码适用于手机 App 两步路户外助手生成的 KML 文件,但不一定适用于其他设备生成的 KML 文件,大致看了下,我明白了我对 KML 以及 XML 文件这种成熟且复杂的技术非常不熟悉,之前写的代码不过是投机取巧,现在非常有必要重新学习一下。

2. KML 是如何存储带有时间信息的路径

使用 gx:Track 元素。

gx:Track 元素包含一系列的 gx:coordwhen 元素,其中 gx:coord 的元素值经纬度坐标,when 为时间戳,在一个 gx:Track 元素中,在 KML 文件中,gx:Track 元素的代码类似于以下示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
<Placemark>
<name>My Track</name>
<gx:Track>
<when>2023-05-16T00:00:00Z</when>
<gx:coord>-122.3931901532545 37.77394065836914 0</gx:coord>
<when>2023-05-16T01:00:00Z</when>
<gx:coord>-122.3933418804733 37.77385192877494 0</gx:coord>
<when>2023-05-16T02:00:00Z</when>
<gx:coord>-122.3933297232765 37.77376812871487 0</gx:coord>
<when>2023-05-16T03:00:00Z</when>
<gx:coord>-122.3931268374783 37.77375834231557 0</gx:coord>
</gx:Track>
</Placemark>

注1:”gx” 是 Google 扩展命名空间,用于引入 Google Earth 的扩展功能。

这种记录格式在摄影上有很好的应用,因为很多相机目前都不自带 GPS,在旅拍时,可以使用手机或其他设备记录带时间的路径信息到 KML 文件中,后面就可以一键为已拍摄的照片的 EXIF 中写入经纬度信息。我的另一个开源项目 ImageGPSTools 就可以很方便为 Jpg 格式的图片写入位置信息。

3. KML 是如何存储不带时间信息的路径的的

使用 LineString 元素

对比 gx:TrackLineString 不引入额外的命名空间,但是也不存储时间信息。

1
2
3
4
5
6
7
8
9
10
11
<Placemark>
<name>My Route</name>
<LineString>
<coordinates>
-122.3931901532545,37.77394065836914,0
-122.3933418804733,37.77385192877494,0
-122.3933297232765,37.77376812871487,0
-122.3931268374783,37.77375834231557,0
</coordinates>
</LineString>
</Placemark>

4. 总结

在需要记录时间时,使用 Google 扩展的 gx:Track 元素记录,否则使用 LineString 元素记录。