如何在 runkeeper 应用程序中计算海拔高度
Posted
技术标签:
【中文标题】如何在 runkeeper 应用程序中计算海拔高度【英文标题】:How to calculate elevation like in runkeeper application 【发布时间】:2013-10-03 10:08:19 【问题描述】:我有跟踪用户移动的应用程序。我存储所有相关数据 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。
也许这很好,但也许我错过了什么知道我在这里做错了什么?
【问题讨论】:
任何帮助...我提供的信息太少了吗? 您是要绘制每个点的高程图还是要获取每个点之间的变化? 我不知道我只是想获得与 runkeeper 应用程序相同的效果。其实我不明白这两者之间的区别。直到今天,我什至不知道海拔高度。 如果您还想存储纬度/经度和海拔高度,为什么不直接从newLocation
获取它并跳过这些计算?
等等你想说我不需要在 didUpdateLocation 中进行这些计算吗?我已经在我的数据库中存储了 lat/lng/altitude。那么这个值(海拔)是什么?如何让它显示出来?
【参考方案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
属性将包含您的收益。
【讨论】:
酷我现在明白了:) 只需要测试它。 是的。altitude
以米为单位。
只是一个子问题。当我存储在数据库 lat/lng/alt 中时,我应该将我的表扩展为另一个字段 GAIN 吗?当我需要向用户显示数据时只选择 MAX(GAIN)?
好吧,增益将存储锻炼期间的整体增益,所以我认为存储每个点的增益没有多大意义,特别是因为你应该能够从高度重新计算它点。不过,您可以将增益存储到该点(作为缓存机制),由您自己决定。
对。不过,根据您的需要,您可以存储每个点的当前增益(这意味着您可以知道该点的增益)。以上是关于如何在 runkeeper 应用程序中计算海拔高度的主要内容,如果未能解决你的问题,请参考以下文章