Application web React/TypeScript de visualisation de la qualite de l'air sur carte interactive (Leaflet), avec filtrage par polluant, sources et pas de temps.
OpenAirMap permet de :
- afficher des appareils de mesure sur une carte avec marqueurs thematiques
- croiser plusieurs sources de donnees (AtmoRef, AtmoMicro, NebuleAir, PurpleAir, SensorCommunity, etc.)
- consulter les details dans des panneaux lateraux
- utiliser un mode historique pour rejouer des periodes passees
- basculer de langue et adapter l'application selon le domaine (branding/config)
- React 19 + TypeScript
- Vite 7
- Leaflet / React-Leaflet
- Tailwind CSS
- Node.js :
>= 20.19.0(recommande) ou>= 22.12.0 - npm : version recente (npm 10+ recommande)
- Git
La contrainte Node est alignee avec Vite 7 (^20.19.0 || >=22.12.0).
git clone <url-du-repo>
cd OpenAirMap3
npm ci
npm run devApplication disponible sur http://localhost:5173.
Le projet fournit un gabarit /.env.inc.
Copiez-le vers .env puis adaptez les valeurs selon votre environnement.
cp .env.inc .envNotes :
- toutes les variables front doivent etre prefixees par
VITE_; VITE_TOOLTIP_MIN_ZOOMaccepte un nombre (ex:11) oufalsepour desactiver le seuil de zoom.
Le branding et certains liens institutionnels sont portes par src/config/domainConfig.ts.
Structure principale :
DOMAIN_CONFIG.defaultcontient la configuration par defaut (logo, favicon, centre/zoom de carte, titre, liens, organisation)getConfigForDomain(domain)applique la config associee au domaine courant- si le domaine n'est pas defini dans
DOMAIN_CONFIG, fallback automatique versDOMAIN_CONFIG.default.
Pour ajouter un nouveau domaine :
- Ajouter une entree dans
DOMAIN_CONFIGavec la cle du domaine (ex:web-prod-no2.xpr) - Renseigner
logo,logo2,favicon,mapCenter,mapZoom,title,links,organization - Verifier le rendu du header, du favicon et du centrage de carte.
Le fond de carte par defaut (Carte standard) utilise StadiaMaps.
Pre-requis operationnel :
- creer un compte StadiaMaps
- declarer dans StadiaMaps la liste des domaines autorises (whitelist), incluant le domaine de production.
Symptomes en cas de mauvaise configuration StadiaMaps :
- erreurs reseau sur les tuiles dans la console navigateur
- statut
401 Unauthorizedsi le domaine courant n'est pas autorise - fond de carte absent.
Une alternative est deja integree : Carte OSM (OpenStreetMap), en plus de Carte standard (StadiaMaps) et Satellite IGN.
Procedure de bascule (sans redeploiement) :
- Ouvrir le menu des couches de fond dans l'interface carte ;
- Selectionner
Carte OSM; - Verifier que les tuiles OSM s'affichent correctement.
Cas d'usage recommande :
- utiliser
Carte OSMcomme solution de continuite si StadiaMaps renvoie des401(ou indisponibilite temporaire).
npm run dev # serveur de dev
npm run build # build production
npm run preview # verification locale du build
npm run lint # verification ESLintsrc/
components/
controls/ # menus et controles UI
map/ # carte, marqueurs, couches
panels/ # side panels par source
charts/ # visualisations historiques
services/ # acces et normalisation des donnees
hooks/ # logique metier partagee
constants/ # polluants, sources, pas de temps
config/ # config domaine / feature flags
locales/ # traductions i18n
Ce projet se deploie comme une SPA statique :
- build Vite,
- publication des fichiers
dist/, - service par Nginx avec fallback SPA.
npm ci
npm run buildLe build genere dist/.
Exemple :
rsync -avz --delete dist/ user@server:/var/www/openairmap/Exemple de serveur Nginx (/etc/nginx/sites-available/openairmap.conf) :
server {
listen 80;
server_name openairmap.example.org;
root chemin-vers-dossier-build;
index index.html;
# Fallback SPA
location / {
try_files $uri $uri/ /index.html;
}
# Cache long pour assets versionnes
location ~* \.(js|mjs|css|png|jpg|jpeg|gif|svg|ico|webp|woff2?)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000, immutable";
try_files $uri =404;
}
}Activation (Debian/Ubuntu) :
sudo ln -s /etc/nginx/sites-available/openairmap.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx