0

我有跟踪用户移动的应用程序。我存储了所有相关的数据 lat/lng/alt 等。
我正在尝试像在runkeeper上一样添加高程,但没有图形我只需要获取高程值。
在我的 .h 文件中:

@property (nonatomic) double netElevationLoss;
@property (nonatomic) double netElevationGain;
@property (nonatomic) double netElevationChange;

在我的 .m 文件中:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    double elevationChange = oldLocation.altitude - newLocation.altitude;
    if (elevationChange < 0)
    {
        netElevationLoss += fabs(elevationChange);
    }
    else
    {
        netElevationGain += elevationChange;
    }

    netElevationChange = netElevationGain - netElevationLoss;
...

我不知道这是正确的计算方法。
我已经对其进行了测试,例如alt是182.53并且netElevationChange-182.53
也许这很好,但也许我错过了什么我在这里做错了什么?

4

1 回答 1

1

根据您发布的维基百科文章,“累积海拔增益”基本上是所有海拔增加的总和。

例如,假设您向上徒步 100 英尺,然后向下 100 英尺,然后向上 200 英尺,然后向下250英尺(例如,山谷),然后向上 100 英尺,您的增益将是 100 + 200 + 150 = 450 英尺. 最后的 150 是由于在某个点远足到 -50 英尺的高度,然后又上升了 100 英尺。

现在,这对您来说意味着您只需要考虑高度的正增量,如下所示:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    double elevationChange = oldLocation.altitude - newLocation.altitude;

    // Only take into account positive changes
    if (elevationChange > 0)
    {
        netElevationGain += elevationChange;
    }
}

你甚至可以进一步简化它:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    netElevationGain += MAX(0, oldLocation.altitude - newLocation.altitude);
}

这将考虑到上升和下降过程中的山谷甚至“起伏”(根据文章应该计算在内)。

最后,该netElevationGain财产将包含您的收益。

于 2013-10-03T13:19:09.547 回答