2009-07-24 2 views
1

Я немного играю с iPhone SDK, и я хочу показать текущую скорость в своем приложении. Есть так много приложений, которые могут сделать это очень точно, особенно для низких скоростей, таких как бег или езда на велосипеде. Лучшее, что я видел, это RunKeeper.Почему моя скорость CLLocation настолько неточна?

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

- (void)locationManager:(CLLocationManager *)manager 
didUpdateToLocation:(CLLocation *)newLocation 
     fromLocation:(CLLocation *)oldLocation { 
    if (newLocation.timestamp > oldLocation.timestamp && 
     newLocation.verticalAccuracy > 0.0f &&         // GPS is active 
     newLocation.horizontalAccuracy < 500.0f &&         // GPS is active 
     //newLocation.horizontalAccuracy < kCLLocationAccuracyHundredMeters && // good quality GPS signal 
     //newLocation.speed > 1.0f &&           // enough movment for accurate speed and course measurement 
     oldLocation != nil)              // oldLocation is nil on the first reading 
    { 
     double speed = (newLocation.speed * 3.6); 
     [self updateDisplayWithSpeed:speed]; 
     //double direction = newLocation.course; 
    } 
} 

У кого-нибудь есть рабочий код для этого? Или ты можешь сказать мне, что не так с моей?

ответ

7

Я бы попробовал следующее.

Помните, что вы должны установить для параметра DistanceFilter и wishAccuracy по необходимости: ходьба - это не то же самое, что путешествовать на автомобиле и т. Д. Кроме того, когда вы запрашиваете высокую точность GPS, вы всегда должны отказаться от самого первого местоположения GPS и использовать вторую в качестве стартового местоположения. Цитирование документации Apple:

Вы должны присвоить значение этому свойству, которое подходит для вашего сценария использования. Другими словами, если вам нужно только текущее местоположение в течение нескольких километров, вы не должны указывать kCLLocationAccuracyBest для точности. Определение местоположения с большей точностью требует больше времени и силы. При запросе данных о местоположении с высокой точностью первоначальное событие, предоставленное службой определения местоположения, может не иметь требуемой точности. Служба определения местоположения доставляет начальное событие как можно быстрее. Затем он продолжает определять местоположение с запрошенной вами точностью и по мере необходимости предоставляет дополнительные события, когда эти данные доступны.

Вот мое предложение.

Сначала обновите местоположение с помощью GPS с интервалом не менее одной секунды. Ниже этого интервала значение скорости бесполезно, поскольку оно измеряется в метрах в секунду, и из-за предыдущего обсуждения вы вряд ли получите достоверное обновление менее чем за секунду с высокой точностью.

Во-вторых, используйте только содержательные значения для координат местоположения: вы должны отбрасывать значения с отрицательной горизонтальной характеристикой. Это то, о чем я говорю, говоря о хороших местах.

В-третьих, вы можете вычислить расстояние самостоятельно: вычислите расстояние между последним хорошим местоположением и предыдущим хорошим местоположением, используя getDistanceFrom(), а затем разделите его на количество секунд, прошедшее между обновлением местоположения. Это даст вам расстояние в метрах в секунду. Я постараюсь сделать это и сравнить результат с установленной скоростью Apple.

+0

у вас есть пример кода для обработки первого вопроса? Или это просто проверка метки времени с предыдущей? –

3

Пожалуйста, попробуйте следующее в вашем коде:

speedLabel.text = [NSString stringWithFormat:@"SPEED(Km/Hr): %f", [location speed]*3.6]; 
latitudeLabel.text = [NSString stringWithFormat:@"LATITUDE: %f", location.coordinate.latitude]; 
longitudeLabel.text = [NSString stringWithFormat:@"LONGITUDE: %f", location.coordinate.longitude]; 
CLLocationDistance meters = [location distanceFromLocation:orginalLoc]; 
distanceLabel.text = [NSString stringWithFormat:@"DISTANCE(M): %f", meters]; 
Смежные вопросы