Отрицательные значения CoreLocation
Я использую CoreLocation
рамки, чтобы получить мою скорость и расстояние для расчета средней скорости.
При первом обновлении CoreLocation
отправляет, показывает отрицательные значения как скорости, так и пройденного расстояния. Как я могу это исправить?
Скорость есть locationController.locationManager.location.speed
где locationController
держит мой CoreLocation
делегировать. Расстояние рассчитывается путем взятия старого местоположения и нового местоположения и расчета расстояния.
//Distance
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
// make sure the old and new coordinates are different
if ((oldLocation.coordinate.latitude != newLocation.coordinate.latitude) &&
(oldLocation.coordinate.longitude != newLocation.coordinate.longitude))
{
mDistance = [newLocation distanceFromLocation:oldLocation];
}
}
3 ответа
Данные, возвращаемые Core Location, могут быть недействительными по ряду причин. Прежде чем использовать данные, запустите этот метод, чтобы убедиться, что он действителен.
// From http://troybrant.net/blog/2010/02/detecting-bad-corelocation-data/
- (BOOL)isValidLocation:(CLLocation *)newLocation
withOldLocation:(CLLocation *)oldLocation
{
// filter out nil locations
if (!newLocation){
return NO;
}
// filter out points by invalid accuracy
if (newLocation.horizontalAccuracy < 0){
return NO;
}
// filter out points that are out of order
NSTimeInterval secondsSinceLastPoint = [newLocation.timestamp
timeIntervalSinceDate:oldLocation.timestamp];
if (secondsSinceLastPoint < 0){
return NO;
}
// filter out points created before the manager was initialized
NSTimeInterval secondsSinceManagerStarted = [newLocation.timestamp
timeIntervalSinceDate:locationManagerStartDate];
if (secondsSinceManagerStarted < 0){
return NO;
}
// newLocation is good to use
return YES;
}
В записке есть CLLocationManager
Ссылка на класс:
Поскольку для возврата исходного местоположения может потребоваться несколько секунд, диспетчер местоположений обычно сразу доставляет ранее кэшированные данные местоположения, а затем предоставляет более свежие данные местоположения, когда они становятся доступными. Поэтому всегда полезно проверить временную метку любого объекта местоположения, прежде чем предпринимать какие-либо действия.
Вы должны проверить, получаете ли вы кэшированное значение и игнорировать его, ожидая первого "реального" обновления.
NSTimeInterval timeSinceLastUpdate = [[newLocation timestamp] timeIntervalSinceNow];
// If the information is older than a minute, or two minutes, or whatever
// you want based on expected average speed and desired accuracy,
// don't use it.
if( timeSinceLastUpdate < -60 ){
return;
}
Если вы собираете первую точку, она не имеет ссылки для расчета скорости или расстояния. Я верю, что он определен, чтобы возвращать -1, если он не может дать вам то, что вам нужно.
Чтобы решить эту проблему, просто проверьте наличие отрицательных значений.
if(location.speed > 0) {
return;
}