Ich kenne was, was Du nicht kennst: Geolocation API

Für zahlreiche Anwendungen kann es interessant sein, den Standort des Anwenders zu ermitteln. Während das im Webbrowser ein Leichtes ist, sieht es auf dem Server deutlich schwieriger aus …

In Pocket speichern vorlesen Druckansicht 2 Kommentare lesen
Lesezeit: 5 Min.
Von
  • Golo Roden

Für zahlreiche Anwendungen kann es interessant sein, den Standort des Anwenders zu ermitteln. Während das im Webbrowser ein Leichtes ist, sieht es auf dem Server deutlich schwieriger aus …

Will man den gegenwärtigen Standort des Anwenders ermitteln, bieten alle modernen Webbrowser dazu die Geolocation API an. Sie kümmert sich allerdings nicht selbst um die Arbeit, sondern leitet das Ermitteln der Geokoordinaten an den Webbrowser oder das Betriebssystem weiter. Diese verwenden dann verschiedene Quellen, beispielsweise die IP-Adresse, die WLAN- und die Mobilfunk-Verbindung. Falls das verwendete Gerät über einen geeigneten Chip verfügt, wird selbstverständlich auch auf GPS zurückgegriffen.

Das Benutzen der API ist denkbar einfach. Zunächst gilt es zu prüfen, ob die API vom verwendeten Webbrowser überhaupt unterstützt wird. Das lässt sich durch die Abfrage der Eigenschaft navigator.geolocation ermitteln: Ist sie gesetzt, wird die API unterstützt, ansonsten nicht:

if (!navigator.geolocation) {
console.log('Geolocation API is not supported.');
return;
}

Anschließend kann man die Funktion getCurrentPosition aufrufen, der zwei Callbacks und ein Optionsobjekt zu übergeben sind. Die beiden Callbacks decken den Erfolgs- beziehungsweise Fehlerfall ab und nehmen daher jeweils einen entsprechenden Parameter entgegen:

const options = {
enableHighAccuracy: true
};

navigator.geolocation.getCurrentPosition(position => {
// ...
}, err => {
// ...
}, options);

Das position-Objekt enthält Eigenschaften, anhand derer sich der Breiten- beziehungsweise Längengrad und die Höhe ablesen lassen:

  • position.coords.latitude gibt den Breitengrad an.
  • position.coords.longitude gibt den Längengrad an.
  • position.coords.altitude gibt die Höhe an.

Zusätzlich kann man an den beiden weiteren Eigenschaften position.coords.accuracy und position.coords.altitudeAccuracy die Genauigkeit der ermittelten Werte in Metern ablesen.

Mehr Infos

"Ich kenne was, was Du nicht kennst"

... ist eine gemeinsame Serie von Golo Roden und Philip Ackermann, in der die beiden regelmäßig Module für JavaScript und Node.js vorstellen.

Da, wie oben erwähnt, die eigentliche Arbeit in der Regel an das Betriebssystem weitergeleitet wird, liegt die Vermutung nahe, dass das Ermitteln des Standorts nicht nur im Webbrowser funktionieren könnte, sondern beispielsweise auch auf dem Server. Immerhin kennt die Laufzeitumgebung Node.js auch verschiedene andere APIs aus dem Webbrowser, entweder direkt oder mithilfe eines der zahlreichen npm-Module.

Leider sieht die Realität anders aus. Ein tatsächlich zur Geolocation API kompatibles Modul sucht man vergeblich, am nächsten kommt noch node-geolocate. Allerdings funktioniert das Modul ausschließlich auf macOS, da es auf dessen "Core Location"-Framework basiert.

Über einige weitere exotische Alternativen führt die Suche über kurz oder lang zu dem Modul geoip, das den Standort einer IP-Adresse ermittelt. Allerdings funktioniert es nicht unter Windows und wird zudem anscheinend nicht mehr weiterentwickelt: Die letzte Änderung war im November 2015, die letzte veröffentlichte Version ist bereits ein Jahr alt.

In der Dokumentation empfiehlt der Autor des Moduls selbst, ein anderes Modul wie geoip-lite zu verwenden. Das Modul ist in reinem JavaScript geschrieben und kommt ohne nativen C-Code aus, weshalb es auf allen gängigen Betriebssystemen lauffähig ist. Außerdem ist die Verwendung denkbar einfach:

const coords = geoip.lookup('8.8.8.8');

Das coords-Objekt enthält dann neben den eigentlichen Geokoordinaten auch Angaben zur Stadt und zum Land, denen die IP-Adresse zugeordnet ist. Auf die Daten sollte man sich allerdings nur näherungsweise verlassen, da dem Modul die kostenfreie Version der Maxmind-Datenbank zugrunde liegt, deren Genauigkeit eine gewisse Unschärfe aufweist. Wie hoch die Genauigkeit ist, lässt sich an Hand der eigenen IP-Adresse direkt bei Maxmind überprüfen.

Wichtig für das Funktionieren des Moduls geoip-lite ist, dass die Datenbank ebenfalls installiert werden muss. Dazu ist nach der Installation des Moduls ein entsprechendes Kommando auszuführen:

$ npm install geoip-lite
$ npm run-script updatedb

Bei Bedarf lässt sich auch die kostenpflichtige Version der Maxmind-Datenbank einbinden, was dann zu einer verbesserten Genauigkeit führt. Qualitativ kann das Ergebnis jedoch systembedingt nicht an eine GPS-basierte Ortung heranreichen.

Alles in allem ist das Ergebnis also sehr dürftig: Von dem Gedanken an ein zur Geolocation API kompatibles Modul muss man sich unter Node.js gänzlich verabschieden und auch das Ermitteln des Standorts über GPS scheint derzeit nicht machbar zu sein, zumindest nicht ohne Zugriff auf native und proprietäre Frameworks des zu Grunde liegenden Betriebssystems.

Als beste Option bleibt die Ortung auf Basis der IP-Adresse, was aber systembedingt nur eine ungefähre Einschätzung sein kann. Außerdem führt für den professionellen Einsatz kein Weg an einer kostenpflichtigen Lizenz vorbei.

tl;dr: Die Geolocation API im Webbrowser ermittelt den Standort des Anwenders auf Basis von GPS und anderen Faktoren. Unter Node.js steht die API nicht zur Verfügung, die Alternativen sind dürftig. Die beste Option stellt die Ortung auf Basis der IP-Adresse dar, was für den professionellen Einsatz aber mit dem Kauf einer kostenpflichtigen Lizenz einhergeht. ()