Структура Corelocation не дает точных расстояний - PullRequest
1 голос
/ 25 июня 2010

Я разрабатываю приложение, которое вычисляет расстояние, пройденное человеком. Я тестирую его на iPad (Device-3.2). Мой iPad использует WiFi, чтобы узнать текущее местоположение. Результаты очень неточные, хотя я отфильтровал значения. Я не знаю, даст ли мне GPS точные результаты. Я вставляю весь код ниже. Пожалуйста, проверьте код и в случае ошибок, пожалуйста, дайте мне знать. Было бы очень полезно, если бы кто-нибудь протестировал код на iPhone (3g) или iPad (3g). Если это невозможно, тогда просто проверьте логику ..... также я хочу вычислить сожженные калории .. Есть ли какая-либо формула для этого ..? Я сделал простой проект на основе вида ..... и использовал метку расстояния в файле пера, чтобы установить значение расстояния, но расстояние обновляется очень быстро .... пожалуйста, исправьте его.




    //  iPacometerViewController.h
    @interface iPacometerViewController : UIViewController {
    CLLocationManager *locationManager;
    CLLocation *oldLocat;
    CLLocation *newLocat;
    IBOutlet UILabel *distanceLabel;
    }

    @property(nonatomic,assign)IBOutlet UILabel *distanceLabel;
    @property(nonatomic,retain)CLLocationManager *locationManager;
    @property(nonatomic,retain)CLLocation *oldLocat;
    @property(nonatomic,retain)CLLocation *newLocat;

-(void)computeDistanceFrom:(CLLocation *)oldL tO:(CLLocation *)newL;

@end

//  iPacometerViewController.m

#import "iPacometerviewController.h"

@implementation iPacometerViewController

static double distance = 0.0;
@synthesize locationManager;
@synthesize oldLocat;
@synthesize newLocat;
@synthesize distanceLabel;


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
       [super viewDidLoad];

    //initializing location manager
    locationManager =[[CLLocationManager alloc]init];
    locationManager.delegate = self;
    locationManager.distanceFilter = 150.0f;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];
    oldLocat = [[CLLocation alloc]init];
    newLocat = [[CLLocation alloc]init];
}


- (void)locationManager:(CLLocationManager *)manager
                  didUpdateToLocation:(CLLocation *)newLocation
                  fromLocation:(CLLocation *)oldLocation
         {

    if (newLocation.horizontalAccuracy  60.0) return;   // data is too long ago, don't use it

    NSLog(@"oldd %@",oldLocation);
    self.oldLocat = oldLocation;
    self.newLocat = newLocation;
    if(oldLocat!=nil)
    {
    [self computeDistanceFrom:oldLocat tO:newLocat];
    }
}


-(void)computeDistanceFrom:(CLLocation *)oldL tO:(CLLocation *)newL
         {
    NSLog(@"oldd %@",oldL);
    NSLog(@"new %@",newL);

    CLLocationDistance currentDistance = [oldL distanceFromLocation:newL];
    NSLog(@"you have travel=%f",currentDistance);   
        distance = distance + currentDistance;
    double distanceInKm = distance/1000;
    NSString *distanceLabelValue = [NSString stringWithFormat:@"%1.2f Kms",distanceInKm];
    distanceLabel.text = distanceLabelValue;
}   

- (void)didReceiveMemoryWarning {
     // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
     // Release any cached data, images, etc that aren't in use.
}



- (void)dealloc {
        //[mapView release];
    [oldloct release];
    [newLocat release];
    [locationManager release];
    [super dealloc];
}
@end

1 Ответ

0 голосов
/ 25 июня 2010

ваша логика в порядке.Это плохая логика iPhone.

При написании такого кода я вижу две основные проблемы.

1) То, что я называю отравленными точками.Это кешированные точки, которые iPhone ошибочно сообщает.Вы можете проверить их, отбросив любые точки, где отметка времени совпадает с предыдущей точкой или является более ранней.Также может стоить записать частоту посещений какой-либо точки.Отравленные точки, как правило, посещаются снова и снова (возможно, 5 раз) каждый раз как прыжок с вашего реального пути.Если вы можете заметить их, вы можете исключить их.

2) Точность - особенно изменения высоты.Посмотрите на показатели точности по горизонтали и вертикали, возвращаемые с каждой точкой.И посмотри на высоту.Если они неточны, то скорость и, следовательно, пройденное расстояние тоже будут.Одной из причин плохих расстояний является то, что один конец вашей пары имеет высоту, а другой - нет: «не» классифицируется как ноль - поэтому, если вы находитесь на 200 м над уровнем моря в то время, когда вы только что прошли 200 м без движения!

Чтобы повысить точность, вам, возможно, лучше написать свой собственный алгоритм определения большого расстояния по кругу (или даже простой Пифагор, учитывая малые расстояния), который игнорирует высоту, или просто лучше фильтровать точки, которые вы используете.

Я изо всех сил пытаюсь найти надежный способ измерения местоположения, расстояния и скорости с помощью iPhone (3GS).и iPad или Touch будет только хуже, я думаю.

Если вы можете отправить мне электронное письмо на Эндрю Дот Хоукена на пятьдесят евро, то я пришлю вам свое программное обеспечение для регистрации в iPhone.Было бы здорово, если бы вы могли запустить его за пару поездок и дать мне результаты - я пытаюсь решить ту же проблему, но иметь только наборы данных GPS для работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...