Frage

Ich entwickle eine Anwendung, die den Abstand vom Benutzer gereist berechnet. Ich verwende CLLocationManager Klasse, dies zu tun, aber ich bin die im Cache gespeicherten Daten zunächst immer und auch der Abstand Variable bei einer plötzlichen Rate steigt. Bitte helfen Sie mir ... Ich habe den folgenden Code verwendet ....

Hinweis: Abstand ist eine statische var. hier

  - (void)viewDidLoad {
    [super viewDidLoad];
//bestEffortAtLocation = nil;
oldLocat = [[CLLocation alloc]init];
newLocat = [[CLLocation alloc]init];
locationManager =[[CLLocationManager alloc]init];
locationManager.delegate = self;
locationManager.distanceFilter =  kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];

  }

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




// test that the horizontal accuracy does not indicate an invalid measurement
if (newLocation.horizontalAccuracy < 0) return;


NSLog(@"accuracy %d",newLocation.horizontalAccuracy);

// test the age of the location measurement to determine if the measurement is cached
// in most cases you will not want to rely on cached measurements
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
//NSLog(@"time %d",locationAge);

if (locationAge > 5.0) return;



self.oldLocat = oldLocation;
self.newLocat = newLocation;


double latDegrees = newLocation.coordinate.latitude;
NSString *lat = [NSString stringWithFormat:@"%1.5f°",latDegrees];
latLabel.text = lat;
double longDegrees = newLocation.coordinate.longitude;
NSString *longt = [NSString stringWithFormat:@"%1.5f°",longDegrees];
longLabel.text = longt;
[self computeDistanceFrom:oldLocat tO:newLocat];

   }

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


distance = distance + [oldL getDistanceFrom:newL];
NSLog(@"distance %f",distance);

}

Die Konsole folgende Daten anzeigt .......

  

Genauigkeit 0 oldd (null) neu <28,62114850, 77,37001021> +/- 80.00m   (Geschwindigkeit -1,00 mps / Kurs -1,00) @ 2010-06-22 19.21.59 0530 Entfernung   0.000000

     

Genauigkeit 0 oldd <28,62114850, 77,37001021> +/- 80.00m (Geschwindigkeit -1.00   mps / Kurs -1,00) @ 2010-06-22 19.21.59 0530 neu <28,61670485,   +77.37068155> +/- 80.00m (Geschwindigkeit -1,00 mps / Kurs -1,00) @ 2010-06-22 19.22.00 0530         Abstand 498.211345

     

Genauigkeit 0 oldd <28,61670485, 77,37068155> +/- 80.00m (Geschwindigkeit -1.00   mps / Kurs -1,00) @ 2010-06-22 19.22.00 0530 neu <28,62112748,   +77.36998540> +/- 80.00m (Geschwindigkeit -1,00 mps / Kurs -1,00) @ 2010-06-22 19.23.02 0530 Entfernung 994,432508

War es hilfreich?

Lösung

Es ist normal, um zunächst eine im Cache gespeicherte Position zu erhalten aus der Zeit vor. Sie können, indem man die Zeitstempel der CLLocation .

Sie drucken die Genauigkeit falsch, Verwendung% f nicht% d, Typ Doppel nicht int.

Lage kann sich schnell ändern, wenn zum ersten Mal startet GPS, weil Sie eine geringe Genauigkeit Lage aus Zell Triangulation haben, dann, wie Sie GPS-Erfassung erhalten erhalten Sie eine höhere Genauigkeit Lage. Diese können weit voneinander entfernt (1000m), und es scheint, dass Sie weit in wenigen Sekunden bewegt, sondern nur die Genauigkeit hat sich geändert.

Verwenden Sie zwei Stellen nicht, die für die Berechnung zurückgelegte Strecke sehr unterschiedliche Genauigkeit hat.

Bearbeiten hinzugefügt Codebeispiel, wie alte Standortdaten zu ignorieren. Sie entscheiden, wie alt zu ignorieren, habe ich 60 Sekunden hier:

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

    NSTimeInterval ageInSeconds = -[newLocation.timestamp timeIntervalSinceNow];
    if (ageInSeconds > 60.0) return;   // data is too long ago, don't use it

    // process newLocation
    ...
}

Andere Tipps

Sie sorgen dafür, dass bereits Ihr Standort-Updates sind weniger als fünf Sekunden alt. Das ist, was diese Zeile Code tut:

if (locationAge > 5.0) return;

Wie progrmr angegeben, hier die entscheidende Frage ist fast sicher, dass Sie auf erste Schätzungen der Lage angewiesen sind, die von geringer Genauigkeit sind und die Lage wird erscheinen, schnell zu bewegen, da es eine bessere Update auf Ihrem Standort bekommt. Was Sie tun müssen, ist zunächst sicherstellen, dass oldLocation nur dann gesetzt wird, wenn Sie eine genaue Anfangsposition fix haben, und dann nur newLocations vergleichen zu, dass oldLocation, wenn sie auch akzeptabler Auflösung sind.

Zum Beispiel, können Sie so etwas wie dieses haben könnte:

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

    // Ignore location updates that are less than 10m accuracy, or where the horizontalAccuracy < 0
    // which indicates an invalid measurement.
    NSLog(@"New location accuracy %.0fm", newLocation.horizontalAccuracy);
    if ((newLocation.horizontalAccuracy < 0) || (newLocation.horizontalAccuracy > 10)) return;

    // Ignore location updates that are more than five seconds old, to avoid responding to
    // cached measurements.
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    if (locationAge > 5) return;

    if (self.oldLocat == NULL)
    {    
        // For the first acceptable measurement, simply set oldLocat and exit.
        self.oldLocat = newLocation;
        return;
    }

    // A second location has been identified. Calculate distance travelled.
    // Do not set self.oldLocat from the oldLocation provided in this update, as we wish to
    // use the last place we calculated distance from, not merely the last place that was
    // provided in a location update. 
    CLLocationDistance distance = [newLocation distanceFromLocation:self.oldLocat];
    NSLog(@"Distance: %.0fm", distance);

    // This new location is now our old location.
    self.oldLocat = newLocation;
}

Hinweis mit dem obigen Code Sie erfordert nicht die Methode computeDistanceFrom. An :, und auch die Eigenschaft self.newLocat nicht tatsächlich erforderlich ist, zumindest in diesem Abschnitt des Codes

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top