GPX全称为GPS Exchange Format,是一种基于XML的开放标准格式,主要用于在不同GPS设备、地图软件和地理信息系统之间交换轨迹、航点和路线数据。它不依赖特定厂商的私有协议,因此几乎所有主流户外设备、运动APP和地图工具都支持GPX文件的导入导出。

GPX文件的核心结构
GPX文件的根标签是<gpx>,内部主要包含三类核心数据元素,分别对应不同的使用场景:
- wpt(航点):表示单个地理位置点,比如露营地点、打卡点等,包含经纬度、海拔、名称等信息
- trk(轨迹):表示连续的移动轨迹,比如徒步、骑行的完整路线,由多个轨迹点组成
- rte(路线):表示规划的导航路线,通常由多个航点按顺序组成,用于引导行进方向
基础GPX文件示例
下面是一个包含单个航点和一段轨迹的简单GPX文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="ExampleApp" xmlns="http://www.topografix.com/GPX/1/1">
<!-- 单个航点示例 -->
<wpt lat="39.9042" lon="116.4074">
<ele>50</ele>
<time>2024-05-01T08:00:00Z</time>
<name>天安门广场</name>
</wpt>
<!-- 轨迹示例 -->
<trk>
<name>晨跑轨迹</name>
<trkseg>
<trkpt lat="39.9042" lon="116.4074">
<ele>50</ele>
<time>2024-05-01T06:00:00Z</time>
</trkpt>
<trkpt lat="39.9050" lon="116.4080">
<ele>52</ele>
<time>2024-05-01T06:05:00Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
常用标签含义说明
GPX文件中的标签都有明确的语义,以下是开发和使用过程中最常接触到的标签:
| 标签名 | 含义 | 数据类型 |
|---|---|---|
| lat | 纬度,取值范围-90到90 | 十进制浮点数 |
| lon | 经度,取值范围-180到180 | 十进制浮点数 |
| ele | 海拔,单位为米 | 十进制浮点数 |
| time | 时间戳,遵循ISO 8601格式 | 字符串 |
| name | 点位或轨迹的名称 | 字符串 |
| trkseg | 轨迹段,一个轨迹可以包含多个轨迹段 | 容器标签 |
| trkpt | 轨迹点,属于轨迹段下的单个位置点 | 容器标签 |
GPX文件的解析方法
由于GPX本质是XML格式,因此可以使用各类XML解析工具处理,不同场景下的解析方式略有区别。
Python解析GPX示例
使用Python内置的xml.etree.ElementTree模块解析GPX文件,提取轨迹点的经纬度信息:
import xml.etree.ElementTree as ET
def parse_gpx_track(gpx_path):
# 解析GPX文件
tree = ET.parse(gpx_path)
root = tree.getroot()
# GPX 1.1的命名空间
ns = {'gpx': 'http://www.topografix.com/GPX/1/1'}
track_points = []
# 遍历所有轨迹段下的轨迹点
for trkpt in root.findall('.//gpx:trkpt', ns):
lat = float(trkpt.get('lat'))
lon = float(trkpt.get('lon'))
# 提取海拔信息,若不存在则为None
ele_elem = trkpt.find('gpx:ele', ns)
ele = float(ele_elem.text) if ele_elem is not None else None
track_points.append({'lat': lat, 'lon': lon, 'ele': ele})
return track_points
# 调用示例
points = parse_gpx_track('test.gpx')
for point in points[:2]:
print(f"纬度: {point['lat']}, 经度: {point['lon']}, 海拔: {point['ele']}")
JavaScript解析GPX示例
在前端场景中,可以使用DOMParser解析GPX字符串,提取航点信息:
function parseGpxWaypoints(gpxText) {
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(gpxText, 'text/xml');
const waypoints = [];
// 获取所有wpt标签
const wptNodes = xmlDoc.getElementsByTagName('wpt');
for (let i = 0; i < wptNodes.length; i++) {
const node = wptNodes[i];
const lat = node.getAttribute('lat');
const lon = node.getAttribute('lon');
const nameNode = node.getElementsByTagName('name')[0];
const name = nameNode ? nameNode.textContent : '';
waypoints.push({ lat, lon, name });
}
return waypoints;
}
// 假设gpxText是GPX文件的文本内容
// const waypoints = parseGpxWaypoints(gpxText);
GPX格式的使用注意事项
在使用和生成GPX文件时,需要注意以下几点:
- GPX有多个版本,主流是1.0和1.1,不同版本的标签支持略有差异,解析时需要确认版本对应的命名空间
- 时间戳建议使用UTC时间,避免时区转换带来的误差
- 生成GPX文件时需要保证XML格式合法,标签正确闭合,特殊字符需要转义
- 如果需要在网页中展示GPX轨迹,可以结合地图API将提取的经纬度坐标渲染为路径
GPX作为开放标准格式,兼容性远优于厂商私有格式,在需要跨设备、跨平台交换GPS数据时,优先选择GPX格式可以有效避免数据丢失问题。