【发布时间】:2015-08-02 20:26:05
【问题描述】:
我想通过一个 gpx 文件循环并计算总上升和下降。我有一个函数可以计算两组经纬度点之间的高程差异,并且我设置了 simplexml 来读取和循环遍历 gpx 文件 trkseg 点。
问题是,这并不准确(实际上并不准确)。
这两条线会导致不同的上升和下降,就像在现实生活中一样:
$total_ascent += ($val - $last_elevation);
$total_descent += ($val - $last_elevation);
有人知道,如何更准确地计算轨道的总上升和下降?
这是我当前的代码 sn-p 来计算它($track_elevations 是一个具有整个轨道高程的数组):
if (!empty($track_elevations)) {
$total_ascent = $total_descent = 0
$lowest_elevation = $highest_elevation = $last_elevation = null;
foreach ($track_elevations as &$val) {
if (!is_null($last_elevation)) {
if ($last_elevation < $val) {
$total_ascent += ($val - $last_elevation);
}
elseif ($last_elevation > $val) {
$total_descent += ($last_elevation - $val);
}
}
if (is_null($lowest_elevation) or $lowest_elevation > $val) {
$lowest_elevation = $val;
}
if (is_null($highest_elevation) or $highest_elevation < $val) {
$highest_elevation = $val;
}
$last_elevation = $val;
}
}
$track_elevations 数组示例:
$track_elevations = array(
327.46,
328.27,
329.32,
330.11,
329.46,
329.39,
329.68,
331.04,
333.23,
333.46,
332.97,
332.88,
332.99,
332.75,
332.74,
334.01,
333.62
)
实际上,我在平坦的道路上骑自行车。但是我的代码 sn-p 会计算,我已经上升和下降了几米。也许我应该在连续两个高程之间添加一些精度限制......
我想要达到的目标:
我会尝试更好地解释它 - 当我骑 f.e.在平坦的道路上行驶 20 公里(几乎没有上升和下降),上升和下降的总和应该接近 0。但是当我总结 $track_elevations(就像我的代码中的 sn-p 一样)时,我会进入 $total_ascent和$total_descentfe 500米……因为$track_elevations中的每个阵元之间相差几厘米,但我还是骑在平坦的路上……而且总和会聚集到大量米……希望现在更清楚了。
【问题讨论】:
-
您能否为
track_elevations数组提供一些示例值? -
我可能误解了这个问题,但看起来您确实上升和下降了几米(基于提供的阵列)。你到底想计算什么?
-
我会尝试更好地解释它 - 当我骑 f.e.在平坦的道路上行驶 20 公里(几乎没有上升和下降),总上升和下降应该接近 0。但是当我总结
$track_elevations(就像我的代码的 sn-p 中一样)时,我会进入$total_ascent和$total_descentfe 500米……因为$track_elevations中的每个阵元之间相差几厘米,但我还是骑在平坦的路上……而且总起来会聚集到大量的米……希望现在更清楚了。 -
所以要明确一点——你想知道你从原始起始位置的整体上升或下降,还是所有上升和下降的总和?例如如果您从 100m 开始,上升 10、下降 9、上升 5 和下降 6 - 您希望总上升计算为 15 还是 0?
-
是的,但我认为,我应该使用一些精度,因为当我在平坦的道路上行驶时,海拔仍然是 349.0 m - 351.0 m,它会返回 f.e.经过 20 公里的总上升和下降约 500 米,但当然,这不是真的,它只是逐个计算大约几厘米的差异......