如何在 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;
...

我不知道这种计算方法是否正确。 我已经对其进行了测试,例如 alt182.53netElevationChange-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 应用程序中计算海拔高度的主要内容,如果未能解决你的问题,请参考以下文章

计算R中具有纬度,经度和海拔高度的两点之间的距离[关闭]

将应用设置为需要海拔高度?

如何在 iOS 上使用气压计获取更准确的海拔数据

我的 iPhone 如何获得它的高度?

已经有了DEM,怎么用arcgis做出海拔高度分布图??

高度和阴影