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