Comment calculer l'altitude comme dans l'application runkeeper

J'ai une application qui suit le mouvement de l'user. Et je stocke toutes datatables pertinentes lat / lng / alt etc.
J'essaie d'append l'élévation comme sur le gardien juste sans graphique j'ai juste besoin d'get la valeur d'altitude.
Dans mon file .h:

@property (nonatomic) double netElevationLoss; @property (nonatomic) double netElevationGain; @property (nonatomic) double netElevationChange; 

Dans mon file .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; ... 

Je ne sais pas est ce moyen correct de le calculer.
Je l'ai testé et alt est par exemple 182.53 et netElevationChange est -182.53 .
Peut-être que c'est bon, mais peut-être que je manque quelque chose à une idée de ce que j'ai fait de mal ici?

Selon l'article de Wikipédia que vous avez posté, «gain d'élévation cumulatif» est essentiellement la sum de toutes les augmentations d'élévation.

Par exemple, disons que vous faites 100 pieds de haut, puis 100 pieds de haut, puis 200 pieds de haut, puis 250 pieds de haut (par exemple, une vallée), puis 100 pieds, votre gain serait 100 + 200 + 150 = 450 pieds . Le dernier 150 est dû à la randonnée à une altitude de -50 pieds à un certain point, puis 100 pieds de haut à nouveau.

Maintenant, ce que cela signifie pour vous est que vous devez simplement prendre en count les deltas positifs d'altitude, comme ceci:

 - (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; } } 

Vous pourriez même le simplifier davantage:

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { netElevationGain += MAX(0, oldLocation.altitude - newLocation.altitude); } 

Cela prendrait en count les vallées et même les «hauts et les bas» pendant la montée et la descente (qui devraient être comptés selon l'article).

À la fin, la propriété netElevationGain contiendra votre gain.