Ich arbeite gerade an einer Location-Tracking-App und habe Schwierigkeiten mit ungenauen Standort-Updates von meinem CLLocationManager . Dadurch verfolgt meine App die Entfernung, die tatsächlich nur durch ungenaue GPS-Messwerte verursacht wird.
Ich kann mein iPhone sogar auf dem Tisch liegen lassen, wenn meine App eingeschaltet ist, und in wenigen Minuten verfolgt meine App gerade wegen dieses Fehlers Hunderte von Metern Entfernung.
Hier ist mein Initialisierungscode:
%Vor%Vielen Dank im Voraus! : -)
Eine der Möglichkeiten, die ich in einer ähnlichen Anwendung gelöst habe, besteht darin, Standortaktualisierungen zu verwerfen, bei denen die Abstandsänderung etwas geringer ist als die in dieser Standortaktualisierung angegebene horizontale Genauigkeit.
Wenn Sie previousLocation
angeben, berechnen Sie für newLocation
den Abstand von previousLocation
. Wenn das distance >= (horizontalAccuracy * 0.5)
ist, haben wir diesen Ort benutzt und dieser Ort wird unser neuer previousLocation
. Wenn die Entfernung geringer ist, verwerfen wir diese Standortaktualisierung, ändern nicht previousLocation
und warten auf die nächste Standortaktualisierung.
Das hat für unsere Zwecke gut funktioniert, Sie könnten so etwas versuchen. Wenn Sie immer noch zu viele Updates finden, die Rauschen sind, erhöhen Sie den 0,5-Faktor, versuchen Sie vielleicht 0,66.
Sie sollten sich auch vor Fällen schützen, in denen Sie gerade erst eine Korrektur erhalten, bei der Sie eine Reihe von Standortaktualisierungen erhalten, die sich zu bewegen scheinen, aber wirklich, was passiert, ist, dass sich die Genauigkeit deutlich verbessert.
Ich würde vermeiden, irgendwelche Standortverfolgung oder Abstandsmessung mit einer horizontalen Genauigkeit & gt; 70 Meter. Das sind schlechte Qualitätspositionen für GNSS, obwohl das alles sein kann, was man bekommt, wenn man in einer städtischen Schlucht ist, unter schweren Baumkronen oder anderen schlechten Signalbedingungen.
Ich habe diese Methode verwendet, um die gewünschte Genauigkeit der Position (in SWIFT) wiederherzustellen
%Vor%Wo:
%Vor%Der zuletzt abgerufene Standort darf nicht vor mehr als 3 Sekunden erfasst worden sein, und der letzte Standort muss eine gültige horizontale Genauigkeit aufweisen (wenn weniger als 1 bedeutet, dass es sich nicht um einen gültigen Standort handelt).
Dann werden wir einen Abstand mit einem Standardwert setzen:
%Vor%Berechnen Sie die Entfernung von der letzten Position zum neuen Standort:
%Vor%Wenn unser letzter lokaler Standort noch nicht festgelegt wurde oder wenn der horizontale Standort des neuen Standorts besser ist als der tatsächliche Standort, werden wir unseren lokalen Standort auf den neuen Standort setzen:
%Vor%Der nächste Schritt ist es zu überprüfen, ob die Genauigkeit von dem Ort, der abgerufen wurde, gut genug ist. Dazu prüfen wir, ob die horizontale Distanz des abgerufenen Standorts die gewünschte Genauigkeit anzeigt. In diesem Fall können wir unseren Manager stoppen:
%Vor% Mit der letzten if
werden wir prüfen, ob die Entfernung vom letzten abgerufenen Standort und dem neuen Standort weniger ist (das bedeutet, dass die 2 Standorte sehr nahe sind). Wenn dies der Fall ist, werden wir das Zeitintervall vom letzten abgerufenen Standort und dem neuen Standort abrufen und prüfen, ob das Intervall mehr als 3 Sekunden beträgt. Wenn dies der Fall ist, heißt das, dass es mehr als 3 Sekunden dauert, dass wir keinen Standort erhalten, der genauer ist als unser lokaler Standort, und so können wir die Standortdienste stoppen:
Dies ist immer ein Problem mit Satellitenstandorten. Es ist eine Schätzung und Schätzungen können variieren. Jeder neue Bericht ist eine neue Schätzung. Was Sie brauchen, ist eine Positionsklemme, die Werte ignoriert, wenn keine Bewegung stattfindet.
Sie könnten versuchen, Sensoren zu verwenden, um zu wissen, ob sich das Gerät tatsächlich bewegt. Schauen Sie sich Beschleunigungsmesserdaten an, wenn sich das nicht ändert, bewegt sich das Gerät nicht, obwohl GPS sagt, dass es ist. Natürlich gibt es Rauschen auf den Daten des Beschleunigungsmessers, also müssen Sie das auch herausfiltern.
Dies ist ein kniffliges Problem zu lösen.
Es gibt wirklich nicht viel mehr, was Sie tun können, um zu verbessern, was das Betriebssystem und Ihr aktueller Empfang Ihnen gibt. Auf den ersten Blick sieht es nicht so aus, als wäre mit Ihrem Code etwas nicht in Ordnung - wenn es um iOS-Standortaktualisierungen geht, sind Sie dem Betriebssystem und Ihrem Service wirklich ausgeliefert.
Was Sie tun können, ist zu kontrollieren, auf welche Orte Sie achten. Wenn Sie in meiner didupdateLocations-Funktion sind, wenn Sie Callbacks vom Betriebssystem mit neuen Standorten erhalten, können Sie Standorte mit horizontalen Genauigkeiten ignorieren, die größer sind als ein vordefinierter Schwellenwert, vielleicht 25 m? Sie würden am Ende weniger Standortaktualisierungen verwenden, aber Sie hätten weniger Rauschen.
Tags und Links objective-c ios location gps core-location