2016-04-22 17 views
0

Ich arbeite an einer laufenden App, daher ist die Berechnung der gesamten Entfernung, die jemand zurückgelegt hat, wichtig für mein Projekt. In meiner Methode didUpdateLocations hänge ich die neuen Positionen an ein Array an und berechne dann den Abstand zwischen den beiden letzten Werten. Die erste Berechnung ist jedoch eine absurd große Zahl. Probleme bestehen unabhängig davon, welche Genauigkeitseinstellungen ich verwende.CLLocation distanceFromLocation gibt falsche Antwort zurück, dann richtige Antworten

Einige Code:

var locationIndex = 0 
    var distanceTraveled: CLLocationDistance = 0.0 
    var allLocations = [CLLocation]() 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

     print(allLocations.count) 

     if locations[0].horizontalAccuracy < 15 { 

     self.allLocations.append(locations[0]) 

     if allLocations.count > 1 { 

      var distanceIncrement = CLLocationDistance() 

      distanceIncrement = allLocations[allLocations.endIndex - 2].distanceFromLocation(allLocations[allLocations.endIndex - 1]) 

      self.distanceTraveled += distanceIncrement 
      print(distanceTraveled) 

     } 

     } else { 

      print("Invalid") 

     } 

    } 

Was passiert, wenn ich drucke (distanceTraveled), der erste Wert ist zum Beispiel 34,5 bei der Simulation einen Lauf, was absurd ist, da es bedeutet, dass Der Läufer bewegte sich in etwa 1,3 Sekunden (die Zeit zwischen den Updates) um 34,5 Meter. Dann, nach dem ersten Druck, erhöht sich die Zahl um angemessene Beträge, zum Beispiel: 34,5, 39,8, 43,3, etc ... Manchmal kann die erste gedruckte Zahl sogar in den 500s sein, was offensichtlich nicht korrekt ist. Ist das ein Problem mit dem Simulator oder meiner Implementierung? Was kann ich tun, um das zu beheben?

+0

http://stackoverflow.com/a/28953613/2303865 –

Antwort

2

Nach meiner Erfahrung sind die ersten Werte, die Sie vom Standortmanager bekommen, schlecht. Die allererste Standortablesung ist oft eine zwischengespeicherte Ablesung, wenn das GPS zuletzt "beleuchtet" wurde. Sie können veraltete Messwerte erkennen und ablehnen, indem Sie den Zeitstempel am Standort überprüfen. Wenn es mehr als eine Sekunde alt ist, wirf es weg.

Als nächstes sind die ersten Ortsangaben oft sehr ungenau. Sie möchten die horizontale Genauigkeitsanzeige überprüfen, bei der es sich tatsächlich um einen "Radius" -Wert (in Metern) handelt, der den Radius eines Kreises angibt, in dem sich die Position befinden könnte. Kleinere Werte sind besser.

Sie sollten die horizontale Genauigkeit überprüfen und Messwerte verwerfen, wenn die Genauigkeit kleiner als ein bestimmter Schwellenwert ist. Ich schlage 20 Meter oder so vor. Abhängig von den Bedingungen erhalten Sie möglicherweise keine genauere Ergebnisse.

Der Simulator ist fast wertlos zum Testen dieses Zeug. Sie müssen eine Test-App erstellen, die die Messwerte, die Sie erhalten, protokolliert und dann herausgeht und herumläuft (und/oder als Beifahrer in einem Auto/Bus fährt) und testen. Sie können sogar jemanden dazu bringen, Sie herumzufahren, während Sie Ihr Telefon und Ihren Mac haben, und die App von Xcode aus starten, während sie angebunden ist. (Ich tat das, als ich zuerst die Feinheiten des Standortverwalters herausfand.)

+0

Danke. Es hat nicht wirklich geholfen, aber dennoch wertvoller Rat. Ich denke, es ist nur eine Simulator-Sache. Ich habe deine Schutzvorrichtungen implementiert. Zu Simulationszwecken habe ich gerade den ersten Wert rausgeworfen. Scheint gut genug zu funktionieren. –

+0

Wie hilft es nicht? Hast du herausgefunden, warum du falsche Antworten bekommen hast, gefolgt von guten? Und testen Sie am Simulator oder einem Gerät? –

+0

Es hat nicht geholfen, denn egal was ich versuchte, ich bekam immer noch falsche Werte auf dem Simulator. Dieses Problem entlastet sich am eigentlichen Gerät. –

Verwandte Themen