原文链接及内容

效果如下视频所示:

示例代码如下:

示例使用静态方法GpxDataSource.load()去加载gpx数据,api介绍如下图所示:

GpxDataSource.load静态方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
const viewer = new Cesium.Viewer("cesiumContainer", {
geocoder: false,
sceneModePicker: false,
homeButton: false,
navigationHelpButton: false,
baseLayerPicker: false,
navigationInstructionsInitiallyVisible: false,
fullscreenButton: false,
selectionIndicator: false,
skyBox: false,
timeline: false,
animation: false,
shouldAnimate: true,
infoBox: false,
terrain: Cesium.Terrain.fromWorldTerrain(),
});

viewer.cesiumWidget.creditContainer.style.display = "none";

const pinBuilder = new Cesium.PinBuilder();

Sandcastle.addToolbarMenu(
[
{
text: "带有路径点的轨迹",
onselect: function () {
viewer.dataSources
.add(
Cesium.GpxDataSource.load("../SampleData/gpx/lamina.gpx", {
clampToGround: true,//贴地,下同
}),
)
.then(function (dataSource) {
viewer.zoomTo(dataSource.entities);
});
},
},
{
text: "路径",
onselect: function () {
viewer.dataSources.removeAll();
viewer.dataSources
.add(
Cesium.GpxDataSource.load("../SampleData/gpx/route.gpx", {
clampToGround: true,
}),
)
.then(function (dataSource) {
viewer.zoomTo(dataSource.entities);
});
},
},
{
text: "路径点",
onselect: function () {
viewer.dataSources
.add(
Cesium.GpxDataSource.load("../SampleData/gpx/wpt.gpx", {
clampToGround: true,
}),
)
.then(function (dataSource) {
viewer.zoomTo(dataSource.entities);
});
},
},
{
text: "多条带有路径点的轨迹",
onselect: function () {
viewer.dataSources
.add(
Cesium.GpxDataSource.load("../SampleData/gpx/complexTrk.gpx", {
clampToGround: true,
}),
)
.then(function (dataSource) {
viewer.zoomTo(dataSource.entities);
});
},
},
{
text: "(其他)符号选项",
onselect: function () {
viewer.dataSources
.add(
Cesium.GpxDataSource.load("../SampleData/gpx/lamina.gpx", {
clampToGround: true,
trackColor: Cesium.Color.YELLOW,
waypointImage: pinBuilder.fromMakiIconId(
"bicycle",
Cesium.Color.BLUE,
48,
),
}),
)
.then(function (dataSource) {
viewer.zoomTo(dataSource.entities);
});
},
},
],
"toolbar",
);

Sandcastle.reset = function () {
viewer.dataSources.removeAll();
viewer.clock.clockRange = Cesium.ClockRange.UNBOUNDED;
viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK;
};

我们以加载的lamina.gpx数据为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<gpx creator="StravaGPX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
<metadata>
<time>2020-08-23T07:48:23Z</time>
</metadata>
<trk>
<name>PuroPirinero - La Mina</name>
<type>1</type>
<trkseg>
<trkpt lat="42.5932660" lon="0.5401440">
<ele>1666.4</ele>
<time>2020-08-23T07:48:23Z</time>
<extensions>
<gpxtpx:TrackPointExtension>
<gpxtpx:atemp>16</gpxtpx:atemp>
<gpxtpx:hr>84</gpxtpx:hr>
</gpxtpx:TrackPointExtension>
</extensions>
</trkpt>

文件头信息如下:

  • 文件格式:XML,版本1.0,编码为UTF-8。
  • GPX版本:1.1,遵循http://www.topografix.com/GPX/1/1标准。
  • 创建者:StravaGPX,表明数据由Strava应用程序生成。
  • 命名空间:定义了GPX标准及Garmin的扩展命名空间(如TrackPointExtension和GpxExtensions),用于支持额外数据(如心率、温度)。
1
2
<?xml version="1.0" encoding="UTF-8"?>
<gpx creator="StravaGPX" ... version="1.1" xmlns="http://www.topografix.com/GPX/1/1" ...>

元数据如下:

  • 时间:2020-08-23T07:48:23Z,表示轨迹记录的开始时间(UTC时间,2020年8月23日07:48:23)。
  • 没有其他元数据(如描述或作者),仅记录了时间戳。
1
2
3
<metadata>
<time>2020-08-23T07:48:23Z</time>
</metadata>

轨迹:

  • 轨迹名称:PuroPirinero - La Mina,可能是用户为活动命名的名称,这里指明了为西班牙中的山地自行车道。
  • 类型:<type>1</type>,通常表示活动类型,Strava中1可能对应某种运动类型(如跑步、骑行等),但具体含义需参考Strava的文档。
  • 轨迹段(trkseg):表示轨迹的一个连续部分,可能对应一次不间断的记录。
1
2
3
4
5
6
7
<trk>
<name>PuroPirinero - La Mina</name>
<type>1</type>
<trkseg>
...
</trkseg>
</trk>

轨迹点:

  • 坐标:
    • 纬度(lat):42.5932660(北纬42.5932660度,位于北半球)。
    • 经度(lon):0.5401440(东经0.5401440度,接近格林威治子午线)。
    • 地理位置:根据坐标,这大致位于西班牙比利牛斯山脉附近,可能是一个山区或户外活动区域。
  • 海拔(ele):1666.4米,表示该点的高度,符合山区地形。
  • 时间:2020-08-23T07:48:23Z,与元数据时间一致,可能是轨迹的起点。
  • 扩展数据(extensions):
    • 环境温度(atemp):16摄氏度,记录了当时的温度。
    • 心率(hr):84次/分钟,表明记录者可能佩戴了心率监测设备,84次/分钟是正常运动状态下的心率。
1
2
3
4
5
6
7
8
9
10
<trkpt lat="42.5932660" lon="0.5401440">
<ele>1666.4</ele>
<time>2020-08-23T07:48:23Z</time>
<extensions>
<gpxtpx:TrackPointExtension>
<gpxtpx:atemp>16</gpxtpx:atemp>
<gpxtpx:hr>84</gpxtpx:hr>
</gpxtpx:TrackPointExtension>
</extensions>
</trkpt>

关于GPX数据格式详见维基百科,这里放张翻译插件翻译好的截图,详见:https://en.wikipedia.org/wiki/GPS_Exchange_Format