我想通过gpx文件循环并计算总上升和下降。我有一个函数可以计算两组lat长点之间的高程差异,我已经设置了simplexml来读取&循环遍历gpx文件trkseg points。
问题是,这不准确(实际上并不准确)。
这两行将导致不同的上升和下降,就像在现实生活中一样:
$total_ascent += ($val - $last_elevation);
$total_descent += ($val - $last_elevation);
有人知道,如何更精确地计算轨道的总上升和下降?
这是我当前的代码片段来计算它($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
)
实际上,我在平路上骑自行车。但是我的代码片段会计算,我已经上升并下降了几米。也许我应该在连续两个高程之间添加一些精度限制......
我想要实现的目标:
我会尝试更好地解释它 - 当我骑车时。在平坦的道路上20公里(几乎没有上升和下降),总上升和下降应该接近0.但是当我总结$track_elevations
(就像在我的代码片段中),我将进入{{1和$total_ascent
fe 500米...因为$total_descent
中的每个数组元素之间的差异是几厘米,但我仍然骑在平坦的道路上...而在总和中它将聚集到大量的米。希望现在更清楚了。
答案 0 :(得分:1)
问题在于,如果您为ascentet计算$lastHeight - $track_elevations[$i]
,则会得到低于0的值,这就是为什么$total_asc
和$total_desc
之间存在较大差异的原因。
<?php
$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
);
$lastHeight = $track_elevations[0];
$total_ascent = 0;
$total_descent = 0;
for ($i=1;$i<count($track_elevations);$i++) {
if ($track_elevations[$i] > $lastHeight) {
$total_ascent += -1 * ($lastHeight - $track_elevations[$i]);
}
else {
$total_descent += ($lastHeight - $track_elevations[$i]);
}
$lastHeight = $track_elevations[$i];
}
echo $total_ascent ."\n";
echo $total_descent . "\n\n--\n";
echo $total_ascent - $total_descent . "\n";
-
$ php -f gpx.php
8.1
1.94
--
6.16
- 手动计算值:
Ascent:
0.81
1.05
0.79
0.29
1.36
2.19
0.23
0.11
1.27
---
8.1
Descent:
0.65
0.07
0.49
0.09
0.24
0.01
0.39
---
1.94
答案 1 :(得分:1)
你确定这是“平坦的”吗? 您能提供完整的数据集吗?另外我不认为这是PHP的精确问题。您的数据点只有两位数的精度。也许传感器是四舍五入的?
答案 2 :(得分:1)
即使您骑行的道路非常平坦,从GPS收集的高程数据也会一直上下变化。即使在完美的条件下,GPS在高度上也不是很准确。
如果您使用原始GPS输入来计算攀爬/下降的总量,这些小错误将与每个点快速总结,并给出完全不切实际的结果。
有许多选项可以获得更好的结果,但它们或多或少都很复杂: 您可以使用适当的算法“平滑”高程曲线。 您可以丢弃GPS高度数据,并将其替换为地球上所有坐标的预先记录的高度数据(称为SRTM数据)。 您可以使用SRTM数据并将其与您自己的GPS数据进行智能混合。
在任何情况下,获得适当的高度值都是一个难题。您可以尝试简单的方法,不计算低于10米的差异或其他一些,但它很可能不会产生良好的结果。