Das W3C hat eine Geolocation API spezifiziert. Die Details finden sich hier:
http://dev.w3.org/geo/api/spec-source.html
Hier ist ein Wikipedia-Beispiel für die Anwendung der API:
http://en.wikipedia.org/wiki/W3C_Geolocation_API#How_does_Geolocation_work.3F
Wenn ein Browser diese API unterstützt, dann ist es möglich, über den Browser an die GPS-Daten eines Smartphones zu kommen. Es sind in der API zwei Methoden definiert, um an Geo-Daten zu kommen:
- getCurrentPosition
- watchPosition
Der Unterschied zwischen den beiden Methoden liegt vor allem in der Häufigkeit, mit der Geo-Daten ermittelt und geliefert werden. So kann man mit getCurrentPosition einmal die Position abfragen, watchPosition hingegen liefert hingegen immer wieder neue Daten. So lange, bis man die Funktion explizit abschaltet.
Meine Erfahrung mit den beiden Methoden hat mir gezeigt, dass es noch einen weiteren Unterschied gibt. Ich habe diesen Unterschied auch teilweise in Diskussionsbeiträgen bestätigt gesehen, eine Erklärung habe ich allerdings nicht gefunden. Worin besteht dieser Unterschied?
Die ersten Koordinaten, die die beiden Methoden liefern, kamen in meinen Tests nie vom GPS-Sender des Smartphones. Stattdessen lieferte das Smartphone Daten, die über den benutzten Funkturm ermittelt wurden. Es wird festgestellt, über welchen Funkturm das Smartphone ins Netz geht. Da bekannt ist, wo sich der Funkturm befindet, kann anhand dieser Information ungefähr ermittelt werden, wo sich das Handy befindet. Diese Lokalisierung ist allerdings ziemlich ungenau. Sie kann mehrere Kilometer vom tatsächlichen Standort entfernt liegen. Für manche Anwendungen mag das genau genug sein, für andere sicher nicht.
Da getCurrentPosition die Daten per Definition nur einmal ermittelt, gibt es ein Problem. Und das Problem lautet: getCurrentPosition liefert nicht die GPS-Daten.
Wenn ich die GPS-Daten benötige, weil die Funkturmlokalisierung zu ungenau ist, dann gibt es zwei Möglichkeiten:
1. Ich rufe getCurrentPosition so lange immer wieder auf, bis es irgendwann die GPS-Daten liefert. Meine Erfahrung ist, dass dies tatsächlich passiert.
2. Ich benutze watchPosition, denn watchPosition wiederholt sich wie beschrieben von selbst immer wieder.
Der Unterschied, den ich weiter oben erwähnt habe, besteht darin, dass bei meinen Tests watchPosition die GPS-Daten wesentlich schneller lieferte als getCurrentPosition. Möglicherweise liegt der Grund darin, dass watchPosition in derselben Zeiteinheit häufiger gestartet wurde. Das ist aber nur eine Vermutung.
Zusammenfassend läßt sich also anhand meiner Erfahrungen sagen:
- Es ist möglich, über die W3C Geolocation API an die GPS-Daten zu kommen.
- Die ersten Daten, die die beiden dafür vorgesehenen Methoden liefern, sind nie GPS-Daten.
- Irgendwann kommen GPS-Daten.
- Über einen einmaligen Aufruf von getCurrentPosition kommt man nicht an GPS-Daten.
Präziser läßt sich das für mich leider nicht formulieren. Wie lange genau es dauert, bis GPS-Daten kommen, hängt mindestens von der Hardware, dem Wetter und dem Standort (unter freiem Himmel oder in einem Gebäude) ab. Nur, um mal einen ungefähren Anhaltswert zu geben: Bei meinen Tests dauert es unter freiem Himmel so um die 15 Sekunden.
Ich habe eine kleine Web App geschrieben, die in iPhones (jedenfalls den neueren) und Android Smartphones mit GPS funktionieren sollte. Sie ermittelt die aktuelle Position via GPS, zeigt diese Position auf einer Google Map an und versucht die dazu passende Adresse via reverse Geocoding herauszufinden.
Ich teste mit dem HTC Hero und Android Vers. 2.1. Damit läuft die App sehr stabil. Manchmal hakt sie, wenn die Stromsparfunktion den Bildschirm ausgeschaltet hat. Normalerweise fängt sie sich wieder, wenn man kurz auf den Home-Screen wechselt und dann den Browser erneut öffnet. Über Feedback würde ich mich freuen.
Wer also einen Blick auf die Web App werfen möchte: Sie ist hier.
Einfach auf “Where am I?” drücken. Dann kommt in rot “searching…”. Dann warten…
So long,
Rolf D.
http://www.rolfdohrmann.de