Positionsbestimmung über Netzwerk

  • Hallo,
    bin gerade dabei eine App zu schreiben, die Offline (Vektor) Karten anzeigt (mapsforge) und auf diesen bei Wunsch (GPX) Tracks als Overlay anzeigt, zum Orientieren bei Wanderungen etc.. Funktioniert auch alles soweit. Überraschungen sind für mich jedoch aufgetreten, wenn ich die Position über das Netzwerk (LocationManager.NETWORK_PROVIDER) feststellen und als Overlay einblenden möchte.
    Überraschung 1:

    Code
    Criteria kriterien=new Criteria();
    kriterien.setAccuracy(Criteria.ACCURACY_COARSE);
    kriterien.setPowerRequirement(Criteria.POWER_LOW);


    führt (meist) zum erwarteten Ergebnis.
    Aber auch

    Code
    Criteria kriterien=new Criteria();
    kriterien.setAccuracy(Criteria.ACCURACY_COARSE);
    kriterien.setAccuracy(Criteria.ACCURACY_MEDIUM);
    kriterien.setPowerRequirement(Criteria.POWER_LOW);


    gibt genau das gleiche Ergbenis. Setze ich statt Criteria.ACCURACY_MEDIUM dann Criteria.ACCURACY_LOW ist es auch das selbe.
    Wenn ich jedoch Criteria.ACCURACY_HIGH statt Criteria.ACCURACY_MEDIUM setze geht die App ins Nirvana.
    Überschreibt ein neuer Aufruf von setAccuracy() die vorher gesetzen Kriterien (ACCURACY_COARSE)?? Wer kann dazu genaueres sagen?


    Überraschung 2:
    Egal ob ich die Position dann mit

    Code
    locationManager.requestSingleUpdate(kriterien, singlelocationListener, null);


    oder

    Code
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,pos_zeit_interval*1000, pos_min_distanz,locationListener);


    aufrufe, wobei ich requestSingleUpdate vorziehe, erreiche ich nicht immer den nächstliegenden Sendemast, sondern auch des öfteren andere Netzwerkzellen, bis zu 20 km entfernt.
    Warum geschieht dies und wie kann man (ich) darauf vernüftig reagieren.
    Übrigens habe ich ein ähnliches Verhalten auch bei OSMAND festgestellt.
    Bisher fällt mir nur ein die Daten von 10 ooder 50 oder 100 requestSingleUpdate Aufrufen in einem Array zu speichern und dann die am häufigsten vorkommende Position als die "richtige" zu nutzen.......


    Hat von Euch jemand eine Idee??
    Mit fragenden Silvestergrüßen,
    schymura :sleeping:

  • Ich bin mir nicht sicher, ob nicht je nach Hardware requestSingleUpdate() 'falsche' Werte zurückgeben kann.
    Mir schwebt vor, dass das Problem nach einem kurzen Ruhezustand der App auftritt. Eventuell ist es möglich, dass es in der requestLocationUpdate Queue noch weitere alte LocationUpdates gibt, die nicht abgeholt wurden.
    Auch ist es möglich, dass die LocationUpdates triangulieren und nicht nur den einen nächsten Sendemasten ausgeben, sondern alle in Reichweite befindlichen Sendemasten.


    In dem Fall wäre es schön, wenn die Callback-Methode ein Array aller Locations bekäme. (Macht der Konkurrent so.)
    Dann könnte man an Hand der Entfernungen zu den Masten schauen wo man sich ungefähr befindet.


    ---


    Zu den Kriterien:
    ACCURACY_COARSE = 2
    ACCURACY_MEDIUM = 2
    ACCURACY_FINE = 1
    ACCURACY_LOW = 1
    ACCURACY_HIGH = 3


    Coarse durch Medium ersetzen bringt also nicht allzu viele Änderungen.


    Nehmen wir die Namenskonventionen, dann überschreibt 'setX()' den Wert X.
    Würde er ihn hinzufügen, hieße er 'addX()'.


    Weiterhin geht aus der Dokumentation hervor:

    Zitat

    public void setAccuracy (int accuracy)


    Added in API level 1
    Indicates the desired accuracy for latitude and longitude.
    Accuracy may be ACCURACY_FINE if desired location is fine, else it can be ACCURACY_COARSE.
    More accurate location may consume more power and may take longer.


    Eventuell geht ACCURAY_HIGH nicht, weil es in der Dokumentation nicht als gültiger Parameter auftaucht. Was ich nicht verstehe. Aber das ändert ja nix.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Marco Feltmann,
    danke für die Antwort.

    Zitat

    Nehmen wir die Namenskonventionen, dann überschreibt 'setX()' den Wert X.
    Würde er ihn hinzufügen, hieße er 'addX()'.

    Deine Erklärung für die Kriterien ist sehr einleuchtend.

    Zitat

    Auch ist es möglich, dass die LocationUpdates triangulieren und nicht nur den einen nächsten Sendemasten ausgeben, sondern alle in Reichweite befindlichen Sendemasten.

    Dies scheint der Fall zu sein, zumindest bei locationManager.requestSingleUpdate() und wenn nur das Netzwerk genutzt wird.
    Es sind in der Queue keine weiteren alten Daten vorhanden, denn die könnte man ja über locationManager.getLastKnownLocation() weglesen....


    Meiner Feststellung nach ist es tatsächlich so, dass es auch bei 10 aufeinander folgenden requestSingleUpdate() Aufrufen immer noch nicht sicher ist, dass man über meine Array-Methode den richtigen Sendemast ganz sicher zu erkennen.
    Bei 50 requestSingleUpdate() Aufrufen dagegen gab es nie einen falschen Sendemast, wenn man die Position nutzt, die am häufigsten vorkommt.


    Schöne Grüße,
    schymura ^^

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!