Le calcul du gain d'altitude cumulatif me donne des résultats fantaisistes

J'ai l'application qui utilise CoreLocation et suivre les mouvements de l'user.
Lorsque l'user marche ou conduit, je sauvegarde chaque coordonnée dans la database locale (lat / lng / alt) pour que je puisse dessiner l'itinéraire en fonction des coordonnées enregistrées.
Il y a quelques jours, j'ai ajouté le gain d'élévation cumulé et j'utilise ce code

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

Mais quelque chose ne va pas.
J'ai commencé l'application et commence à marcher et à marcher pendant quelques miles et je reçois netElevationGain près de 500 mètres. Ce qui n'est pas correct.
Voici la list des netElevation enregistrés dans la database pour chaque point:

 0,41,43,44,47,52,55,62,73,80,91,100,114,140,146,153,159,180,199,208,228,240,259,275,320,329,349,359,366,375,381,392,408,419,428,437,446,449,462,469,478,486 

Altitudes
0.000000,181.678055,181.891495,182.786850,179.315399,177.035721,182.636307,181.259399,178.653015,192.552551,185.398819,182.693436,181.369766,154.306747,157.031693,159.748871,185.080856,198.080673,176.473877,178.646851,175.784424,178.184128,181.237488,188.956894,177.713181,193.673019,188.470184,182.749054,181.966507,181.547592,191.638657,198.713989,188.582977,197.977921,203.184540,205.108856,198.304123

Pour afficher le gain j'utilise simple select max(gain) from table where ...

METTRE À JOUR

Maintenant, je reçois des valeurs plus mauvaises (par ordre décroissant):
Alt:

 200.334869,200.594666,196.293945,195.240234,191.800446,192.622375,179.951385,179.185577,179.681122,177.843719,183.459595,174.170502,0.000000 

Gain:

 307,301,294,285,275,269,252,246,234,227,217,202,0 

J'ai pris les valeurs que vous avez listées et les ai exécutées comme suit:

 NSArray *altitudes = @[ @(0.000000), @(181.678055), @(181.891495), @(182.786850), @(179.315399), @(177.035721), @(182.636307), @(181.259399), @(178.653015), @(192.552551), @(185.398819), @(182.693436), @(181.369766), @(154.306747), @(157.031693), @(159.748871), @(185.080856), @(198.080673), @(176.473877), @(178.646851), @(175.784424), @(178.184128), @(181.237488), @(188.956894), @(177.713181), @(193.673019), @(188.470184), @(182.749054), @(181.966507), @(181.547592), @(191.638657), @(198.713989), @(188.582977), @(197.977921), @(203.184540), @(205.108856), @(198.304123) ]; float netAlt = 0.0f; // Start with the third value as we're only interesting in net gain for (NSInteger i = 2; i < altitudes.count; i++) { float oldAlt = [altitudes[i-1] floatValue]; float newAlt = [altitudes[i] floatValue]; // newAlt - oldAlt because we're interestd in the // difference between current and previous float diff = newAlt - oldAlt; netAlt += MAX(0, diff); printf("%.0f,", netAlt); } 

Cela a produit la sortie suivante:

0,1,1,1,7,7,7,21,21,21,21,21,23,26,51,64,64,67,67,69,62,78,80,80,96,96, 96,96,96,106,113,113,122,127,129,129

Cela me semble raisonnable et réalist. Ce n'est pas du tout clair comment vous avez réussi à get les valeurs que vous avez. Ils n'ont aucun sens.