Skip to main content

JavaScript Geolocation API

Introduction​

The Geolocation API is a built-in browser functionality that allows websites to request the geographical location of the user. This powerful feature enables developers to create location-aware web applications that can provide personalized experiences based on where the user is located.

This API is particularly useful for:

  • Maps and navigation applications
  • Location-based search results
  • Weather applications showing local conditions
  • Social applications with check-in features
  • Fitness tracking apps

In this tutorial, we'll explore how to use the Geolocation API in JavaScript, understand its methods, handle permissions, and create practical location-based features.

Browser Support and Privacy Considerations​

Before diving into the code, it's important to understand a few key points:

  • The Geolocation API is supported by all modern browsers
  • For privacy reasons, users must explicitly grant permission for a website to access their location
  • The API works on both desktop and mobile devices, though mobile devices typically provide more accurate results
  • Location data is never available unless the user approves the permission request

Basic Usage: Getting the Current Position​

Let's start with the most basic use case - getting the user's current position:

javascript
// Check if geolocation is supported by the browser
if ("geolocation" in navigator) {
// Geolocation is available
navigator.geolocation.getCurrentPosition(
// Success callback function
(position) => {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
console.log(`Latitude: ${latitude}, Longitude: ${longitude}`);
},
// Error callback function
(error) => {
console.error("Error getting location:", error.message);
}
);
} else {
// Geolocation is not supported
console.log("Geolocation is not supported by this browser");
}

When this code runs, the browser will prompt the user for permission to access their location. If granted, the success callback function will be executed with a position object containing the coordinates.

Understanding the Position Object​

The position object contains a lot of useful information:

javascript
navigator.geolocation.getCurrentPosition((position) => {
console.log("Full position object:", position);

// Coordinates
console.log("Latitude:", position.coords.latitude);
console.log("Longitude:", position.coords.longitude);

// Accuracy (in meters)
console.log("Accuracy:", position.coords.accuracy);

// Optional properties (may be undefined)
console.log("Altitude:", position.coords.altitude);
console.log("Altitude accuracy:", position.coords.altitudeAccuracy);
console.log("Heading:", position.coords.heading); // Direction of travel in degrees
console.log("Speed:", position.coords.speed); // Speed in meters/second

// Timestamp of when position was retrieved
console.log("Timestamp:", position.timestamp);
});

Handling Errors​

The error callback receives an error object with a code and message property. Understanding these error codes helps provide better user feedback:

javascript
navigator.geolocation.getCurrentPosition(
successCallback,
(error) => {
switch(error.code) {
case error.PERMISSION_DENIED:
console.error("User denied the request for geolocation");
break;
case error.POSITION_UNAVAILABLE:
console.error("Location information is unavailable");
break;
case error.TIMEOUT:
console.error("The request to get user location timed out");
break;
case error.UNKNOWN_ERROR:
console.error("An unknown error occurred");
break;
}
}
);

Options for Geolocation Requests​

The getCurrentPosition() and watchPosition() methods accept an optional third parameter for configuring the request:

javascript
const options = {
enableHighAccuracy: true, // Use GPS if available
timeout: 5000, // Time to wait for a position (milliseconds)
maximumAge: 0 // Don't use a cached position
};

navigator.geolocation.getCurrentPosition(
successCallback,
errorCallback,
options
);
  • enableHighAccuracy: When true, the device will try to provide the most accurate position it can, which might use more battery power and take longer
  • timeout: The maximum time (in milliseconds) allowed to get the position
  • maximumAge: The maximum age (in milliseconds) of a cached position that is acceptable to return

Tracking User Movement with watchPosition()​

While getCurrentPosition() gets the location only once, watchPosition() continuously monitors the user's position and calls the success callback whenever the position changes:

javascript
// Start tracking the user's location
const watchId = navigator.geolocation.watchPosition(
(position) => {
const { latitude, longitude } = position.coords;
console.log(`Updated position: ${latitude}, ${longitude}`);

// Update your application with the new location
updateLocationOnMap(latitude, longitude);
},
(error) => {
console.error("Error tracking location:", error.message);
},
{ enableHighAccuracy: true }
);

// Function to update location on a map (example)
function updateLocationOnMap(lat, lng) {
// This would be replaced with actual map update code
console.log(`Map updated to position: ${lat}, ${lng}`);
}

// To stop watching the position later:
function stopTracking() {
navigator.geolocation.clearWatch(watchId);
console.log("Location tracking stopped");
}

// Example: Stop tracking after 1 minute
setTimeout(stopTracking, 60000);

The watchPosition() method returns a watch ID that you can use to stop tracking with the clearWatch() method.

Practical Example: Distance Calculator​

Let's create a practical example that calculates the distance between two points:

javascript
// Function to calculate distance between two points using the Haversine formula
function calculateDistance(lat1, lon1, lat2, lon2) {
const R = 6371; // Radius of the earth in km
const dLat = deg2rad(lat2 - lat1);
const dLon = deg2rad(lon2 - lon1);
const a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c; // Distance in km
return distance;
}

function deg2rad(deg) {
return deg * (Math.PI / 180);
}

// Example usage:
// Coordinates for New York City
const nycLat = 40.7128;
const nycLon = -74.0060;

// Get current position and calculate distance to NYC
navigator.geolocation.getCurrentPosition((position) => {
const { latitude, longitude } = position.coords;
const distance = calculateDistance(latitude, longitude, nycLat, nycLon);
console.log(`You are ${distance.toFixed(2)} km away from New York City`);
});

Real-world Example: Weather App​

Here's how you might use geolocation in a weather application:

javascript
function fetchWeatherForCurrentLocation() {
// Show loading state
const weatherDisplay = document.getElementById('weather-display');
weatherDisplay.innerHTML = '<p>Fetching your local weather...</p>';

navigator.geolocation.getCurrentPosition(
async (position) => {
try {
const { latitude, longitude } = position.coords;

// Replace with your actual weather API endpoint and key
const apiKey = 'your_weather_api_key';
const response = await fetch(
`https://api.weatherapi.com/v1/current.json?key=${apiKey}&q=${latitude},${longitude}`
);

if (!response.ok) {
throw new Error('Weather data not available');
}

const weatherData = await response.json();

// Display the weather
weatherDisplay.innerHTML = `
<h2>Weather for your location</h2>
<p>Temperature: ${weatherData.current.temp_c}°C</p>
<p>Condition: ${weatherData.current.condition.text}</p>
<p>Wind: ${weatherData.current.wind_kph} km/h</p>
<img src="${weatherData.current.condition.icon}" alt="Weather icon">
`;
} catch (error) {
weatherDisplay.innerHTML = `<p>Error: ${error.message}</p>`;
}
},
(error) => {
weatherDisplay.innerHTML = `<p>Could not access location: ${error.message}</p>`;
}
);
}

// Call the function when the page loads
document.addEventListener('DOMContentLoaded', fetchWeatherForCurrentLocation);

Using Geolocation with Google Maps​

A common use case for geolocation is integrating with mapping services like Google Maps:

javascript
// Note: You'll need to include the Google Maps JavaScript API in your HTML
// <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>

function initMap() {
// Create a map centered on a default location
const defaultLocation = { lat: 40.7128, lng: -74.0060 }; // New York City

const map = new google.maps.Map(document.getElementById("map"), {
zoom: 15,
center: defaultLocation,
});

// Try to get the user's position
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
(position) => {
const userLocation = {
lat: position.coords.latitude,
lng: position.coords.longitude,
};

// Center the map on the user's location
map.setCenter(userLocation);

// Add a marker at the user's location
const marker = new google.maps.Marker({
position: userLocation,
map: map,
title: "Your Location",
});

// Add an info window
const infoWindow = new google.maps.InfoWindow({
content: "<h3>You are here</h3>",
});

marker.addListener("click", () => {
infoWindow.open(map, marker);
});
},
() => {
// Handle geolocation error
alert("Could not get your location. Showing default location instead.");
}
);
} else {
// Browser doesn't support Geolocation
alert("Your browser doesn't support geolocation.");
}
}

// Call this function when the page loads
document.addEventListener('DOMContentLoaded', initMap);

Best Practices for Using the Geolocation API​

  1. Always check for support before using geolocation features

  2. Handle permissions gracefully - explain to users why you need their location

  3. Provide fallbacks when location is not available or denied

  4. Consider accuracy needs - only request high accuracy when needed to conserve battery

  5. Use secure contexts - the Geolocation API only works on HTTPS connections

  6. Be mindful of power consumption - especially when using watchPosition() for extended periods

  7. Respect user privacy - only request location when necessary and be transparent about usage

Summary​

The Geolocation API provides a straightforward way to incorporate location awareness into your web applications. We've covered:

  • Getting a user's current position with getCurrentPosition()
  • Continuously tracking movement with watchPosition()
  • Understanding and configuring geolocation options
  • Handling errors and permissions
  • Practical examples like distance calculation and weather applications
  • Integration with mapping services

With these tools, you can create rich, location-aware web experiences that respond to where your users are located.

Exercises​

  1. Create a simple "Find nearby coffee shops" app that displays coffee shops within 1km of the user's location (you can use mock data for the coffee shop locations)

  2. Build a running tracker that records distance traveled using watchPosition()

  3. Implement a "share my location" feature that generates a link with the user's coordinates encoded

  4. Create a geofencing application that alerts the user when they enter or leave a predefined area

Additional Resources​

Happy coding with location-based features!



If you spot any mistakes on this website, please let me know at feedback@compilenrun.com. I’d greatly appreciate your feedback! :)