Start · Sprachen · JavaScript · Referenz · Geolocation.getCurrentPosition()

Geolocation.getCurrentPosition()

Methode

Ermittelt einmalig und asynchron die aktuelle Position des Geräts und übergibt sie an eine Callback-Funktion.

seit JavaScript Baseline: alle Browser (nur in sicheren Kontexten/ Kategorie: webapi

Signatur

Geolocation.prototype.getCurrentPosition(success, error, options)

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

Typ
void
Beschreibung
Gibt nichts zurück (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.');
}
Position: 52.52001, 13.40495 (±35 m)

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();
Breite: 48.13743 Länge: 11.57549

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 }
  );
});
Nächste Filiale: Berlin (3.2 km)

// Wichtig · Fallstricke

  • Nur in sicheren Kontexten: Die Methode funktioniert nur über HTTPS oder auf localhost. Auf reinen HTTP-Seiten rufen moderne Browser sofort error mit PERMISSION_DENIED auf. In Cross-Origin-iframes muss der Zugriff mit allow="geolocation" (Permissions Policy) erlaubt werden.
  • Standardwert timeout: Infinity: Ohne timeout kann 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: true kann auf Mobilgeräten deutlich länger dauern und mehr Strom verbrauchen. Werte immer coords.accuracy aus, statt blind auf die Koordinaten zu vertrauen. altitude, heading und speed können null sein.
  • Kein Promise-Rückgabewert: Die API arbeitet mit Callbacks. Für async/await musst du sie selbst in ein Promise verpacken (siehe Beispiel).