Signatur
Beschreibung
navigator.geolocation.getCurrentPosition() fragt die aktuelle Position des Geräts einmalig ab. Die Methode arbeitet asynchron über Callbacks: Klappt die Abfrage, wird success mit einem GeolocationPosition-Objekt aufgerufen. Das Objekt enthält unter coords Breitengrad, Längengrad, Genauigkeit (in Metern) und je nach Gerät auch Höhe, Richtung und Geschwindigkeit. Schlägt die Abfrage fehl, wird error mit einem GeolocationPositionError aufgerufen.
Beim ersten Aufruf zeigt der Browser eine Berechtigungsabfrage an. Die Position kommt je nach Gerät und Einstellung aus GPS, WLAN, Mobilfunkzellen oder der IP-Adresse. Deshalb schwanken Genauigkeit und Antwortzeit stark: von wenigen Metern bis zu mehreren Kilometern und von Millisekunden bis zu mehreren Sekunden.
Verwende die Methode, wenn du die Position nur einmal brauchst, etwa für „Filialen in meiner Nähe“, zum Vorausfüllen eines Standorts oder für eine lokale Wettervorhersage. Wenn du die Position fortlaufend verfolgen willst (Navigation, Tracking), ist watchPosition() besser geeignet. Mit dem Parameter options steuerst du, wie genau die Position sein soll, wie lange höchstens gewartet wird und ob ein zwischengespeicherter Wert genügt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $success Pflicht | (position: GeolocationPosition) => void | Callback, der bei Erfolg mit einem GeolocationPosition-Objekt aufgerufen wird. Es enthält coords und timestamp. |
|
| $error | (error: GeolocationPositionError) => void | Optionaler Callback für Fehler. error.code ist 1 (PERMISSION_DENIED), 2 (POSITION_UNAVAILABLE) oder 3 (TIMEOUT); error.message enthält einen Text zur Fehlersuche. |
|
| $options | { enableHighAccuracy?: boolean, timeout?: number, maximumAge?: number } | { enableHighAccuracy: false, timeout: Infinity, maximumAge: 0 } | enableHighAccuracy: fordert eine möglichst genaue Position an (z. B. per GPS), was langsamer ist und mehr Akku verbraucht. timeout: höchste Wartezeit in Millisekunden. maximumAge: wie alt eine zwischengespeicherte Position in Millisekunden sein darf (0 = immer neu ermitteln). |
Rückgabewert
undefined). Das Ergebnis kommt ausschließlich über die Callbacks.Beispiele
Einfache Standortabfrage mit Fehlerbehandlung
if ('geolocation' in navigator) {
navigator.geolocation.getCurrentPosition(
(pos) => {
const { latitude, longitude, accuracy } = pos.coords;
console.log(`Position: ${latitude.toFixed(5)}, ${longitude.toFixed(5)} (±${Math.round(accuracy)} m)`);
},
(err) => {
console.error(`Fehler ${err.code}: ${err.message}`);
}
);
} else {
console.warn('Geolocation wird nicht unterstützt.');
}
Callback in ein Promise verpacken (async/await)
const getPosition = (options = {}) =>
new Promise((resolve, reject) => {
navigator.geolocation.getCurrentPosition(resolve, reject, options);
});
const zeigeStandort = async () => {
try {
const pos = await getPosition({ enableHighAccuracy: true, timeout: 10000, maximumAge: 60000 });
console.log('Breite:', pos.coords.latitude, 'Länge:', pos.coords.longitude);
} catch (err) {
const meldungen = {
1: 'Zugriff auf den Standort wurde verweigert.',
2: 'Standort derzeit nicht verfügbar.',
3: 'Zeitüberschreitung bei der Standortabfrage.'
};
console.error(meldungen[err.code] ?? err.message);
}
};
zeigeStandort();
Nächste Filiale per Button-Klick ermitteln
const filialen = [
{ name: 'Berlin', lat: 52.52, lon: 13.405 },
{ name: 'Hamburg', lat: 53.5511, lon: 9.9937 },
{ name: 'München', lat: 48.1374, lon: 11.5755 }
];
// Haversine-Formel: Entfernung in km
const distanz = (a, b) => {
const rad = (d) => (d * Math.PI) / 180;
const dLat = rad(b.lat - a.lat);
const dLon = rad(b.lon - a.lon);
const h = Math.sin(dLat / 2) ** 2 + Math.cos(rad(a.lat)) * Math.cos(rad(b.lat)) * Math.sin(dLon / 2) ** 2;
return 6371 * 2 * Math.asin(Math.sqrt(h));
};
document.querySelector('#filiale-finden').addEventListener('click', () => {
navigator.geolocation.getCurrentPosition(
({ coords }) => {
const ich = { lat: coords.latitude, lon: coords.longitude };
const naechste = filialen
.map((f) => ({ ...f, km: distanz(ich, f) }))
.sort((x, y) => x.km - y.km)[0];
console.log(`Nächste Filiale: ${naechste.name} (${naechste.km.toFixed(1)} km)`);
},
(err) => console.error(err.message),
{ timeout: 8000, maximumAge: 300000 }
);
});
// Wichtig · Fallstricke
- Nur in sicheren Kontexten: Die Methode funktioniert nur über HTTPS oder auf
localhost. Auf reinen HTTP-Seiten rufen moderne Browser soforterrormitPERMISSION_DENIEDauf. In Cross-Origin-iframes muss der Zugriff mitallow="geolocation"(Permissions Policy) erlaubt werden. - Standardwert
timeout: Infinity: Ohnetimeoutkann die Abfrage unbegrenzt lange hängen, zum Beispiel wenn der Nutzer auf die Berechtigungsabfrage nicht reagiert. Setze in der Praxis immer einen sinnvollen Wert. Die Wartezeit wird übrigens erst gezählt, nachdem der Nutzer die Berechtigung erteilt hat. - Immer einen Fehler-Callback angeben: Ohne ihn bleibt eine Ablehnung oder Zeitüberschreitung unbemerkt. Plane eine Ausweichlösung ein, zum Beispiel eine manuelle Eingabe von PLZ oder Ort.
- Datenschutz und Nutzerführung: Frag den Standort erst nach einer Aktion des Nutzers ab (z. B. einem Klick), nicht direkt beim Laden der Seite. Browser werten frühe Abfragen teils als aufdringlich, und Nutzer lehnen sie häufiger ab. Eine einmal verweigerte Berechtigung kann die Seite nicht erneut abfragen. Den aktuellen Status liefert
navigator.permissions.query({ name: 'geolocation' }). - Genauigkeit und Akku:
enableHighAccuracy: truekann auf Mobilgeräten deutlich länger dauern und mehr Strom verbrauchen. Werte immercoords.accuracyaus, statt blind auf die Koordinaten zu vertrauen.altitude,headingundspeedkönnennullsein. - Kein Promise-Rückgabewert: Die API arbeitet mit Callbacks. Für
async/awaitmusst du sie selbst in ein Promise verpacken (siehe Beispiel).