【问题标题】:How to calculate elevation like in runkeeper application如何在 runkeeper 应用程序中计算海拔高度
【发布时间】: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。那么这个值(海拔)是什么?如何让它显示出来?

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


【解决方案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)?
  • 好吧,增益将存储锻炼期间的整体增益,所以我认为存储每个点的增益没有多大意义,特别是因为你应该能够从高度重新计算它点。不过,您可以将增益存储到该点(作为缓存机制),由您自己决定。
  • 对。不过,根据您的需要,您可以存储每个点的当前增益(这意味着您可以知道该点的增益)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2019-06-15
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
相关资源
最近更新 更多