2013-10-06 1 views
0

У меня есть приложение, которое использует CoreLocation и отслеживать движение пользователя.
Когда пользователь идет пешком или вождение, я сохраняю каждую координату в локальной базе данных (lat/lng/alt), поэтому я могу рисовать маршрут на основе сохраненных координат.
Несколько дней назад я добавил Cumulative elevation gain и я использую этот код вВычисление кумулятивного повышения высоты дает мне wierd результаты

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

Но что-то просто неправильно.
Я начал приложение и начал ходить и ходить пешком несколько миль, и я получаю netElevationGain почти в 500 метрах. Который никоим образом не является правильным.
Это список netElevation сохраняется в базе данных для каждой точки:

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 

Высоты
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

Для отображения получить я использую простой select max(gain) from table where ...



UPDATE

Теперь я получаю худшие значения (в порядке убывания):
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 

усиления:

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

Вычислены ли значения 'netElevation' из' высот, которые вы наклеили ниже? –

+0

Да. Это из той же базы данных. Я храню высоту, и в то же время я храню текущую netElevation. Моя главная проблема заключается в том, что я считаю, что это число должно быть меньше. Поэтому мне интересно, что я делаю неправильно. – 1110

+1

Я также не вижу, как значения высоты соответствуют вашим высотам (например, откуда взялось значение 41?). Вы должны распечатать их вместе в таблице. - Не должно быть 'newLocation.altitude - oldLocation.altitude'? И вам, возможно, придется игнорировать первое изменение «0 -> 181.678055'. –

ответ

2

Я взял значения, которые вы перечислили, и побежал их следующим образом:

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 interested in the 
    // difference between current and previous 
    float diff = newAlt - oldAlt; 

    netAlt += MAX(0, diff); 
    printf("%.0f,", netAlt); 
} 

Это произвело следующие данные:

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

Это кажется разумным и реалистичным для меня. Не совсем ясно, как вам удалось получить ценности, которые у вас есть. Они не имеют никакого смысла.

+0

Так что мне действительно не нужно сохранять выигрыш до база данных вообще, поскольку я могу рассчитать ее только из массива высот? – 1110

+0

Это зависит от того, что вы хотите сделать с коэффициентом усиления. – neilco

+0

Сегодня я шел по холму и использовал накопленные высоты с вашим кодом. Без взлетов. И я получил 79 метров netgain. Должен ли я сортировать данные как-то или что-то? Как я понимаю, выигрыш происходит только тогда, когда вы поднимаетесь. – 1110

Смежные вопросы