Fork de Open-Meteo Maps personnalisé pour Infoclimat.
Client SvelteKit qui rend des OMfiles via MapLibre GL — l'intégralité du rendu des tuiles météo s'exécute côté navigateur (pas de tile-server). Les fichiers sont récupérés directement depuis map-tiles.open-meteo.com ; les cumuls multi-heures transitent par un service Rust dédié (infoclimat-om-worker).
- Bandeau Infoclimat — logo + liens (site, forum, adhérer) intégrés en en-tête.
- Palette de températures « infoclimat-inspired » — échelle de couleurs adaptée aux conventions visuelles d'Infoclimat (voir
src/lib/color-scales/). - Domaine par défaut :
meteofrance_arome_france0025(MF AROME France). - Sélecteur de domaine filtré — préset Infoclimat dans
DOMAIN_ALLOWLIST(constants.ts) : AROME France HD/15min, AROME France, ARPEGE Europe, ECMWF IFS HRES/0.25°/AIFS, DWD ICON D2/EU. Les autres modèles restent accessibles via URL partagée. - Cumuls de précipitations — variables
precipitation_sum_Nh(3 / 6 / 12 / 24 / 48 / 72 h) calculées par le worker sur la base des OMfiles horaires Open-Meteo. - Labels — affichage optionnel des valeurs numériques sur la carte (toggle en haut à droite).
- Contours des départements — overlay GeoJSON bundlé (
/static/departements.geojson) toggleable. - Wind overlay — surcouche de vent à 10/80/120/180 m, opacité indépendante de la couche principale.
- Deuxième couche scalaire — superposition de deux variables (ex : température + précipitation) avec opacité réglable.
- Diaporama / playback — animation pré-rendue avec FPS configurable (4–15 fps), capture côté canvas via
preserveDrawingBuffer. - UI 100 % française.
Deux paquets @openmeteo/* sont consommés depuis des forks maison (voir package.json), en attendant l'upstream :
-
@openmeteo/file-reader→npm:@cm3r/file-reader— cache de l'en-tête (HEAD) par URL pour accélérer le scrubbing (le reader officiel refait HEAD + trailer à chaque fichier). PR proposée upstream : typescript-omfiles#93. -
@openmeteo/weather-map-layer→npm:@cm3r/weather-map-layer@0.1.0(fork publié npm, source :cmer81/weather-map-layerbranchefeat/grid-global-id, base upstreame65e070) — les points de la source-layergridportent désormais unidglobal stable (globalIndex = rangée_globale·nx + colonne_globale) au lieu de l'index local de la sous-grille rognée aux tuiles. Sans ça, un même nœud changeait d'idselon les tuiles chargées (nxClipvariable) → l'index de symboles inter-tuiles de MapLibre ne pouvait plus l'apparier (étiquettes qui se replacent au pan) et tout décodage(i, j)côté client produisait des bandes horizontales sur les domaines monde. Le fork découple l'id(global, pour MapLibre) de l'index local (qui sert encore à lire la valeur). Patch minimal :src/grids/{regular,projected}.ts+src/utils/grid-points.ts. C'est ce qui permet la couche « valeurs aux points de grille » figée (voir## Architecture). Version épinglée (comme@cm3r/file-reader).La ligne
@cm3rest versionnée indépendamment de l'upstream (le fork est figé sur la basee65e070, stable et compatible avec ce code). Monter vers un upstream plus récent est un chantier dédié (l'API publique a rétréci entre-temps :readSimpleVariabledevenu privé, types color-scales déplacés…) à faire et tester séparément. Pour repasser à l'upstream officiel : restaurergithub:open-meteo/weather-map-layer#<sha>une fois leglobalIndexmergé en amont.
Quand un correctif/feature ne peut pas se faire côté maps et exige de toucher la lib, on modifie le fork puis on monte la version npm — ne jamais consommer une lib forkée autrement que par une version npm publiée et épinglée (sinon CI et autres devs ne sont pas reproductibles).
- Dans le repo du fork (
cmer81/weather-map-layer, branchemain) : coder la modif (patch petit et isolé pour garder un futur rebase upstream gérable),npm run build && npx vitest run. npm version patch(→ tag git) puisnpm publish(public, OTP si 2FA) etgit push origin main --tags.- Dans
maps:npm install -D @openmeteo/weather-map-layer@npm:@cm3r/weather-map-layer@<nouvelle-version>, puisnpm run check && npm run test && npm run build, commit.
Pour itérer avant de publier, on peut pointer temporairement maps sur file:../wml-fork ou github:cmer81/weather-map-layer#<sha> ; on ne publie sur npm + bump le pin qu'une fois stable. Même principe pour @cm3r/file-reader.
npm install
npm run devL'app tourne par défaut sur http://localhost:5173.
Les variables *_sum_Nh ne s'affichent dans le sélecteur que si le worker est joignable. Démarrer le worker dans un terminal séparé :
cd ../infoclimat-om-worker && cargo runPuis configurer maps/.env.local :
VITE_OM_WORKER_URL=http://localhost:8080
npm run build # static export → ./build
npm run preview # servir la build localementLe Dockerfile produit une image nginx qui template VITE_OM_WORKER_URL au runtime via docker-entrypoint.d/ (pas besoin de rebuilder pour changer la cible du worker). Headers COOP/COEP/CORP appliqués pour activer SharedArrayBuffer (requis par @openmeteo/file-reader).
Une image est publiée automatiquement sur GHCR via .github/workflows/.
npm run check # typecheck (svelte-check)
npm run lint # prettier + eslint
npm run format # prettier --write
npm run test # vitest
npm run coverage # vitest --coverage (v8)Tests dans src/lib/tests/** (logique pure : temps, URLs, stores playback…).
Voir .claude/CLAUDE.md et les règles ciblées dans .claude/rules/ pour les détails internes :
- protocole MapLibre
om://et résolution d'URL (src/lib/url.ts) - routing des cumuls vers le worker (
getOMUrl()+om-protocol-settings.ts) - système de slots double-buffered pour les transitions de tuiles (
slot-manager.ts) - pipeline playback / pré-rendu (
playback-renderer.ts) - synchronisation URL ↔ stores Svelte 5
- sondages verticaux client-side (Skew-T + hodographe + indices convectifs) calculés depuis les OMfiles AROME niveaux de pression au point cliqué (
src/lib/sounding/)
Le chrome s'organise autour d'un header fin pleine largeur (marque Infoclimat, onglet « Carte », bouton « Réglages » ouvrant le panneau Avancé) et, sur desktop, d'une sidebar gauche repliable (sélecteur de modèle, liste verticale des calques, sections Affichage et Style) ; sur mobile, un bottom-sheet à onglets reprend les mêmes sections. La timeline et la légende se décalent de la largeur de la sidebar ; les contrôles MapLibre natifs sont ancrés en bas-droite au-dessus de la timeline.
- Upstream : open-meteo/maps — voir LICENSE.
- Layer : open-meteo/weather-map-layer.
- Données :
- OMfiles météo : Open-Meteo (et indirectement Météo-France, ECMWF, DWD, NOAA…).
- Contours administratifs FR :
gregoiredavid/france-geojson(licence ODbL).
Le meteogram utilise Highcharts, gratuit pour un usage
non commercial (licence CC BY-NC 3.0) —
ce qui couvre Infoclimat (association à but non lucratif, produit non monétisé). Tout
déploiement commercial d'un fork de ce dépôt nécessite une licence Highcharts propre.
Les icônes météo (static/weather-symbols/) proviennent de
nrkno/yr-weather-symbols (MIT).
Pour les contributions liées au layer ou au protocole om:// lui-même, ouvrir un ticket sur open-meteo/weather-map-layer plutôt qu'ici.
