Providing location-aware search results creates a personalised user experience. This example demonstrates how to request the user's current location using the browser's Geolocation API and use it to bias autocomplete suggestions towards nearby places—perfect for "near me" features and local discovery applications.
Click "Use My Location" to allow browser access to your coordinates. The autocomplete will then prioritise places near you, with distance calculations shown in the results.
Using default location (London) for search results
Geolocation bias combines browser APIs with Google Places to create personalised search experiences:
navigator.geolocation.getCurrentPosition() API to request the user's coordinates. This triggers a permission prompt on first use.position.coords. Store these coordinates in your component state.requestParams.locationBias with a circular area centred on the user's coordinates.
This tells the API to favour nearby results.requestParams.origin to the user's location. This enables accurate distance
calculations shown with the distance: true option.maximumAge to avoid repeated prompts.maximumAge to avoid constant re-prompts, but refresh for accuracy when needed.Here's a complete implementation with error handling and fallback behaviour:
<script lang="ts">
import { browser } from '$app/environment';
import { PlaceAutocomplete } from 'places-autocomplete-svelte';
import type { PlaceResult } from 'places-autocomplete-svelte/interfaces';
let userLocation: { lat: number; lng: number } | null = $state(null);
let componentKey = $state({});
// Request geolocation on component mount
const requestGeolocation = () => {
if (!browser || !navigator.geolocation) return;
navigator.geolocation.getCurrentPosition(
(position) => {
userLocation = {
lat: position.coords.latitude,
lng: position.coords.longitude
};
// Update params with user's location
requestParams = {
...requestParams,
locationBias: {
circle: {
center: userLocation,
radius: 10000 // 10km
}
},
origin: userLocation
};
componentKey = {}; // Re-initialise component
},
(error) => {
console.error('Geolocation error:', error.message);
},
{
enableHighAccuracy: false,
timeout: 10000,
maximumAge: 300000 // Cache for 5 minutes
}
);
};
// Reactive request params
let requestParams = $state({
language: 'en-gb',
region: 'GB',
locationBias: userLocation ? {
circle: {
center: userLocation,
radius: 10000
}
} : undefined,
origin: userLocation || { lat: 51.5074, lng: -0.1278 } // Fallback
});
const onResponse = (response: PlaceResult) => {
console.log('Selected place:', response);
};
</script>
<!-- Request location access -->
<button onclick={requestGeolocation}>
Use My Location
</button>
{#if userLocation}
<p>Searching near: {userLocation.lat.toFixed(4)}, {userLocation.lng.toFixed(4)}</p>
{/if}
<!-- Component with geolocation bias -->
{#key componentKey}
<PlaceAutocomplete
{onResponse}
{requestParams}
options={{
placeholder: userLocation ? 'Search near you...' : 'Search...',
distance: true
}}
/>
{/key}