From 71b457892e6af33d15f7d7a3f1d50653b18bbe64 Mon Sep 17 00:00:00 2001 From: syoul Date: Sun, 22 Mar 2026 17:05:04 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20g=C3=A9olocalisation=20Cesium+=20?= =?UTF-8?q?=E2=80=94=200=20r=C3=A9sultats=20corrig=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CesiumAdapter : terms query en minuscules (champ title analysé par ES) - CesiumAdapter : z.coerce.number() pour geoPoint.lat/lon (37% des profils stockent les coordonnées en string → ZodError silencieux → 0 géolocalisées) - CesiumAdapter : clé de la Map en toLowerCase() pour cohérence - DataService : lookup geoMap par fromName.toLowerCase() Co-Authored-By: Claude Sonnet 4.6 --- src/services/DataService.ts | 2 +- src/services/adapters/CesiumAdapter.ts | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/services/DataService.ts b/src/services/DataService.ts index aad0a4b..6f0b190 100644 --- a/src/services/DataService.ts +++ b/src/services/DataService.ts @@ -48,7 +48,7 @@ async function fetchLiveTransactions(periodDays: number): Promise<{ // Seules les transactions avec un profil géo entrent dans le heatmap const geolocated: Transaction[] = []; for (const t of rawTransfers) { - const geo = geoMap.get(t.fromName); + const geo = geoMap.get(t.fromName.toLowerCase()); if (!geo) continue; // pas de profil → exclu du heatmap geolocated.push({ diff --git a/src/services/adapters/CesiumAdapter.ts b/src/services/adapters/CesiumAdapter.ts index 28d6986..03c362c 100644 --- a/src/services/adapters/CesiumAdapter.ts +++ b/src/services/adapters/CesiumAdapter.ts @@ -27,8 +27,8 @@ const HitSchema = z.object({ title: z.string().optional(), city: z.string().optional(), geoPoint: z.object({ - lat: z.number().min(-90).max(90), - lon: z.number().min(-180).max(180), + lat: z.coerce.number().min(-90).max(90), + lon: z.coerce.number().min(-180).max(180), }).optional(), }), }); @@ -58,8 +58,8 @@ export async function resolveGeoByNames( query: { bool: { must: [ - // Champ "title" analysé (lowercase tokens) — title.keyword retourne 0 résultats - { terms: { title: unique } }, + // Champ "title" analysé (lowercase tokens) — doit envoyer en minuscules + { terms: { title: unique.map((n) => n.toLowerCase()) } }, ], filter: [ { exists: { field: 'geoPoint' } }, @@ -86,7 +86,7 @@ export async function resolveGeoByNames( for (const hit of parsed.hits.hits) { const src = hit._source; if (src.geoPoint && src.title) { - result.set(src.title, { + result.set(src.title.toLowerCase(), { name: src.title, city: src.city ?? 'Inconnue', lat: src.geoPoint.lat,