From 5045c9869234f9777cdd969ad21d9571a6a1f1a7 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Fri, 15 Aug 2025 11:31:25 +0000 Subject: [PATCH 1/2] Improve location accuracy for weather data fetching Add logging to show parsed location details and handle cases where resolved address is missing in the weather API response. Replit-Commit-Author: Agent Replit-Commit-Session-Id: d43bd811-9372-45a7-8ac9-4a954c0538e1 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/d43bd811-9372-45a7-8ac9-4a954c0538e1/zoZabWF --- server/weatherService.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/weatherService.ts b/server/weatherService.ts index 294b2ba..9249f3f 100644 --- a/server/weatherService.ts +++ b/server/weatherService.ts @@ -260,6 +260,8 @@ export class WeatherService { const data = await response.json(); + console.log('🌍 API Response:', JSON.stringify(data, null, 2)); + // L'API Visual Crossing retourne les informations de localisation if (data.resolvedAddress) { const address = data.resolvedAddress; @@ -269,6 +271,8 @@ export class WeatherService { const city = parts[0] || 'Ville inconnue'; const country = parts[parts.length - 1] || 'Pays inconnu'; + console.log('🌍 Parsed location:', { city, country, fullLocation: address }); + return { city, country, @@ -276,6 +280,7 @@ export class WeatherService { }; } + console.log('🌍 No resolvedAddress found in API response'); return null; } catch (error) { console.error("Erreur lors de la géolocalisation:", error); From 5133f52d2a82ea30d6e7aaa27276ec740e36cf87 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Fri, 15 Aug 2025 11:33:17 +0000 Subject: [PATCH 2/2] Update location lookup to use OpenStreetMap for better accuracy Switch from Visual Crossing to Nominatim (OpenStreetMap) for reverse geocoding to improve city and country identification from GPS coordinates. Replit-Commit-Author: Agent Replit-Commit-Session-Id: d43bd811-9372-45a7-8ac9-4a954c0538e1 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/d43bd811-9372-45a7-8ac9-4a954c0538e1/zoZabWF --- server/weatherService.ts | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/server/weatherService.ts b/server/weatherService.ts index 9249f3f..31bc58d 100644 --- a/server/weatherService.ts +++ b/server/weatherService.ts @@ -244,43 +244,50 @@ export class WeatherService { } /** - * Convertit les coordonnées GPS en nom de ville via l'API Visual Crossing + * Convertit les coordonnées GPS en nom de ville via l'API de géocodage inverse Nominatim (OpenStreetMap) */ async getCityFromCoordinates(latitude: number, longitude: number, apiKey: string): Promise<{ city: string; country: string; fullLocation: string } | null> { try { - const url = `${this.baseUrl}/${latitude},${longitude}?unitGroup=metric&include=current&key=${apiKey}&contentType=json`; + // Utiliser l'API Nominatim (OpenStreetMap) pour la géolocalisation inverse + const nominatimUrl = `https://nominatim.openstreetmap.org/reverse?format=json&lat=${latitude}&lon=${longitude}&accept-language=fr`; - console.log('🌍 Géolocalisation:', { latitude, longitude }); + console.log('🌍 Géolocalisation via Nominatim:', { latitude, longitude }); + + const response = await fetch(nominatimUrl, { + headers: { + 'User-Agent': 'LogiFlow-Weather-System/1.0 (Enterprise Weather Management Platform)' + } + }); - const response = await fetch(url); if (!response.ok) { - console.error(`Geolocation API error: ${response.status} ${response.statusText}`); + console.error(`Nominatim API error: ${response.status} ${response.statusText}`); return null; } const data = await response.json(); - console.log('🌍 API Response:', JSON.stringify(data, null, 2)); + console.log('🌍 Nominatim Response:', JSON.stringify(data, null, 2)); - // L'API Visual Crossing retourne les informations de localisation - if (data.resolvedAddress) { - const address = data.resolvedAddress; - const parts = address.split(',').map((part: string) => part.trim()); + if (data && data.address) { + const address = data.address; - // Extraire la ville et le pays de l'adresse - const city = parts[0] || 'Ville inconnue'; - const country = parts[parts.length - 1] || 'Pays inconnu'; + // Extraire la ville (peut être dans city, town, village, municipality, etc.) + const city = address.city || address.town || address.village || address.municipality || address.hamlet || 'Ville inconnue'; + const country = address.country || 'Pays inconnu'; - console.log('🌍 Parsed location:', { city, country, fullLocation: address }); + // Créer une adresse lisible pour Visual Crossing + const fullLocation = `${city}, ${country}`; + + console.log('🌍 Parsed location:', { city, country, fullLocation }); return { city, country, - fullLocation: address + fullLocation }; } - console.log('🌍 No resolvedAddress found in API response'); + console.log('🌍 No address found in Nominatim response'); return null; } catch (error) { console.error("Erreur lors de la géolocalisation:", error);