0

ユーザーの動きを追跡するアプリケーションがあります。そして、関連するすべてのデータlat/lng/altなどを保存します。標高値を取得するだけで必要なグラフィックなしで、ランキーパー
の ように標高を追加しようとしています。 私の .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で、-182.53です。 たぶんそれは良いことですが、ここで何が間違っていたのか分かりませんか?netElevationChange

4

1 に答える 1

1

あなたが投稿したウィキペディアの記事によると、「累積標高ゲイン」は基本的に標高のすべての増加の合計です。

たとえば、上に 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プロパティにはあなたの利益が含まれます。

于 2013-10-03T13:19:09.547 に答える