2011-11-26 13 views
9

Posiadam aplikację usługi lokalizacyjnej, w której jest zapewniona elewacja użytkownika. Zauważyłem jednak, że dokładność rzędnej dostarczona przez CLLocationManager jest wyjątkowo niedokładna. Kiedy testuję dwa razy te same dwa punkty, czasami różnica rzędna wynosi czterdzieści stóp, a czasami jest sto. Czy jest jakiś sposób, aby poprawić dokładność pionową CLLocation, czy też istnieje inny sposób zdobywania elewacji użytkownika (biblioteki innych firm)? Próbowałem już sprawdzić właściwość verticalAccuracy dla newLocation dostarczonej przez CLLocationManager i wyrzucić ją, jeśli nie jest wystarczająca, ale nawet jeśli jest wystarczająco "dokładna", nadal często nie jest prawdziwa. Dziękuję za Twój czas!Dokładność elewacji CLLocation

Teraz używam:

if([newLocation verticalAccuracy] < 30) { 
    if(isCustomary) 
     altitudeLabel.text = [NSString stringWithFormat:@"%.2f feet", ([newLocation altitude] * 3.2808399)]; 
    else 
     altitudeLabel.text = [NSString stringWithFormat:@"%.2f meters", [newLocation altitude]]; 
} 

problemów z tym kodem: często verticalAccuracy nigdy nie spadnie poniżej 30, a gdy to robi, że wciąż nie jest nawet blisko wystarczająco dokładne; Przetestowałem kod poruszający się po moim domu (jedna historia) i mówi, że elewacja zmienia się do dziewiętnastu stóp, co na pewno nie jest prawdą.

Odpowiedz

22

elewacja pochodzi z satelitów GPS jest z natury mniej dokładne, że rozwiązanie z poziomym GPS ze względu na geometry satelitów . Powinieneś oczekiwać, że dokładność pionowa będzie zazwyczaj 1,5 do 3 razy gorsza niż dokładność pozioma. To tylko ograniczenie GPS i dlaczego lotnictwo wymaga korekty WAAS, zanim będzie można korzystać z GPS do podejścia według wskazań przyrządów.

Gdy dokładność pionowa wynosi 20 lub 30 metrów, należy spodziewać się, że wysokość zostanie wyłączona na wysokości 100 stóp. Oczekuje, że nie będzie się różnić o 19 stóp, kiedy chodzisz po domu w nierealny sposób.

Co można zrobić, to zachować średnią ważoną (lub Kalman filter) ostatnich "dobrych" odczytów wysokości, aby odfiltrować błędy pomiaru.

+0

Tak, wydaje się to niefortunna prawda. +1 dla dobrego wyjaśnienia i dobrego linku. –

2

Jaki kod próbowałeś? Jest to najlepszy kod na elewacji, więc nie sądzę, że istnieje coś poza tym:

-(void)awakeFromNib { 
    locmanager = [[CLLocationManager alloc] init]; 
    [locmanager setDelegate:self]; 
    [locmanager setDesiredAccuracy:kCLLocationAccuracyBest]; 
    [locmanager startUpdatingLocation]; 
} 

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    heightMesurement.text = [NSString stringWithFormat: @"%.2f m", newLocation.altitude]; 
} 

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    heightMesurement.text = @"0.00 m"; 
} 
+0

Zobacz moją edycję, proszę –

+0

Co polecam, to po prostu użyć mojego kodu, ponieważ jest to najlepsza dokładność możliwa z iDevices. To wciąż telefon, a dokładność nie jest zbyt duża ze względu na fizyczne ograniczenia. –