second to last commit hopefully final features and Ui refinements
This commit is contained in:
33
src/lib/utils/geocode.js
Normal file
33
src/lib/utils/geocode.js
Normal file
@@ -0,0 +1,33 @@
|
||||
import { env } from '$env/dynamic/public';
|
||||
|
||||
// --- "passport stamps" reverse geocoding -----------------------------------
|
||||
// Reverse-geocodes a lat/lng pair into a { city, country } pair using the
|
||||
// Google Maps Geocoding API (REST), reusing the same PUBLIC_MAPS_KEY the
|
||||
// Maps JavaScript API loader already uses (see MapView.svelte) - the
|
||||
// Geocoding API must be enabled for this key in the Google Cloud Console for
|
||||
// this to work.
|
||||
//
|
||||
// Walks the first result's address_components looking for the 'locality'
|
||||
// type for the city name (falling back to 'administrative_area_level_1',
|
||||
// e.g. a state/province, for rural areas with no locality) and the 'country'
|
||||
// type for the country name. Returns { city: 'Unknown', country: 'Unknown' }
|
||||
// if the request fails or no results come back, so a failed lookup never
|
||||
// blocks stamp creation - it just produces a generically-labeled stamp.
|
||||
export async function reverseGeocode(lat, lng) {
|
||||
try {
|
||||
const url = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${env.PUBLIC_MAPS_KEY}`;
|
||||
const res = await fetch(url);
|
||||
const data = await res.json();
|
||||
|
||||
const components = data.results?.[0]?.address_components ?? [];
|
||||
const findType = (type) => components.find(c => c.types.includes(type))?.long_name;
|
||||
|
||||
return {
|
||||
city: findType('locality') ?? findType('administrative_area_level_1') ?? 'Unknown',
|
||||
country: findType('country') ?? 'Unknown'
|
||||
};
|
||||
} catch (err) {
|
||||
console.error('[stamps] reverse geocode failed:', err);
|
||||
return { city: 'Unknown', country: 'Unknown' };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user