Skip to content

HTML Geolocation

The HTML Geolocation API allows web applications to retrieve the geographical position of the user’s device.

Privacy Warning: Accessing location data is privacy-sensitive. The browser will always ask the user for permission before sharing their location with a website.

Security Note: Most modern browsers require websites to use HTTPS (secure connection) to access the Geolocation API.

The Geolocation API is widely supported by all major modern desktop and mobile browsers.

For detailed, up-to-date browser compatibility information, you can consult resources like Can I Use:

Location accuracy varies significantly depending on the device and method used (e.g., GPS, Wi-Fi triangulation, IP address lookup). Mobile devices with GPS typically provide the highest accuracy.

The core method is navigator.geolocation.getCurrentPosition(). It attempts to retrieve the device’s current location.

This method takes at least one argument: a success callback function. This function receives a GeolocationPosition object containing the coordinates if the request is successful.

<!DOCTYPE html>
<html lang="en">
<head>
<title>Geolocation Example</title>
<meta charset="UTF-8">
</head>
<body>
<h1>Geolocation Example</h1>
<button onclick="getLocation()">Try It</button>
<p id="demo"></p>
<script>
const demoElement = document.getElementById("demo");
function getLocation() {
if (navigator.geolocation) {
// Check if geolocation is supported
demoElement.innerHTML = "Attempting to retrieve location...";
navigator.geolocation.getCurrentPosition(showPosition, showError); // Pass success and error handlers
} else {
demoElement.innerHTML = "Geolocation is not supported by this browser.";
}
}
// Success callback function
function showPosition(position) {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
demoElement.innerHTML = `Latitude: ${latitude}<br>Longitude: ${longitude}`;
}
// Error callback function (explained next)
function showError(error) {
// ... (error handling code here)
}
</script>
</body>
</html>

Explanation:

  • First, we check if navigator.geolocation exists to ensure browser support.
  • If supported, we call getCurrentPosition(), providing showPosition as the function to run on success and showError for failures.
  • The showPosition function receives a position object.
  • We extract latitude and longitude from position.coords and display them.

Retrieving location can fail for various reasons (e.g., user denies permission, hardware issues, timeout). The second, optional argument to getCurrentPosition() is an error callback function.

This function receives a GeolocationPositionError object containing details about the error.

// Error callback function
function showError(error) {
let errorMessage;
switch(error.code) {
case error.PERMISSION_DENIED:
errorMessage = "User denied the request for Geolocation.";
break;
case error.POSITION_UNAVAILABLE:
errorMessage = "Location information is currently unavailable.";
break;
case error.TIMEOUT:
errorMessage = "The request to get user location timed out.";
break;
case error.UNKNOWN_ERROR:
errorMessage = "An unknown error occurred while trying to get location.";
break;
default:
errorMessage = "An unexpected error occurred.";
}
console.error("Geolocation Error:", error); // Log the error object for debugging
demoElement.innerHTML = errorMessage;
}

Common Error Codes:

  • PERMISSION_DENIED: The user clicked “Block” on the permission prompt.
  • POSITION_UNAVAILABLE: The network or satellite signals needed to determine location are not available.
  • TIMEOUT: The browser couldn’t determine the location within a reasonable time.
  • UNKNOWN_ERROR: An error occurred that doesn’t fit the other categories.

Always implement robust error handling to provide feedback to the user.

A common use case is displaying the retrieved coordinates on an interactive map. You can integrate with third-party mapping services like Google Maps, OpenStreetMap (often via libraries like Leaflet), or Mapbox.

Integrating these services typically involves:

  • Including the mapping library’s JavaScript file.
  • Obtaining an API key (often required, especially for commercial use).
  • Using the library’s API to create a map centered on the latitude and longitude obtained from the Geolocation API.
  • Optionally adding a marker at the user’s location.

Example concept using a placeholder (actual implementation depends on the chosen map service):

// Inside the showPosition function after getting lat/lon:
// Pseudo-code for map integration
// const mapContainer = document.getElementById('map-container');
// mapContainer.style.height = '400px'; // Ensure container has size
// // Example using a hypothetical 'MappingLibrary'
// const map = new MappingLibrary.Map(mapContainer, {
// center: [latitude, longitude],
// zoom: 13
// });
//
// new MappingLibrary.Marker({
// position: [latitude, longitude],
// map: map,
// title: 'You are here!'
// });
demoElement.innerHTML =
`Latitude: ${latitude}<br>Longitude: ${longitude}<br><br>` +
`<a href="https://www.openstreetmap.org/?mlat=${latitude}&mlon=${longitude}#map=15/${latitude}/${longitude}" target="_blank">` +
`Show on OpenStreetMap</a>`;

This updated example provides a direct link to OpenStreetMap, a free and open map service, instead of embedding complex map library code.

Further Learning:

watchPosition():

Similar to getCurrentPosition(), but it registers a handler function that is called automatically each time the user’s position changes significantly. Useful for real-time tracking applications (like navigation).

It returns an ID value that can be used with clearWatch().

clearWatch():

Stops an ongoing watchPosition() process, using the ID returned by the watchPosition call.

let watchId = null; // Variable to store the watch ID
function startWatching() {
if (navigator.geolocation) {
demoElement.innerHTML = "Starting location tracking...";
// Start watching, store the ID
watchId = navigator.geolocation.watchPosition(showPosition, showError, { enableHighAccuracy: true });
} else {
demoElement.innerHTML = "Geolocation is not supported.";
}
}
function stopWatching() {
if (watchId !== null) {
navigator.geolocation.clearWatch(watchId); // Stop using the stored ID
watchId = null; // Reset the ID
demoElement.innerHTML = "Location tracking stopped.";
} else {
demoElement.innerHTML = "Tracking wasn't active.";
}
}
// showPosition and showError functions remain the same as before
// Add buttons to control watching:
// <button onclick="startWatching()">Start Tracking</button>
// <button onclick="stopWatching()">Stop Tracking</button>

Note: watchPosition can consume significant battery power, especially with enableHighAccuracy: true. Use it judiciously and provide users a way to stop it.

The success callback (showPosition in our examples) receives a GeolocationPosition object. It primarily contains:

  • coords: A GeolocationCoordinates object with the location data.
  • timestamp: A timestamp indicating when the location was retrieved.

The GeolocationCoordinates object contains:

PropertyDescription
latitudeLatitude as a decimal number (required).
longitudeLongitude as a decimal number (required).
accuracyAccuracy of the latitude and longitude in meters (required).
altitudeHeight above the WGS84 ellipsoid in meters (null if unavailable).
altitudeAccuracyAccuracy of the altitude in meters (null if unavailable).
headingDirection of travel in degrees (0-360) clockwise from true north (null if unavailable or stationary).
speedSpeed in meters per second (null if unavailable or stationary).