如何在runkeeper应用程序中计算高程

时间:2013-10-03 10:08:19

标签: iphone ios objective-c core-location cllocationmanager

我有跟踪用户移动的应用程序。并且我存储所有相关数据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
也许它很好,但也许我想知道我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

根据您发布的Wikipedia article,“累积海拔增益”基本上是所有海拔增加的总和。

例如,假设您徒步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属性将包含您的收益。