# Bases croisées : le dictionnaire des données de l'onglet DataViz

{/* Page écrite à la main. Les fichiers décrits ici sont produits par scripts/dataviz/build_base.py. */}

:::info{title="En bref"}
- **Pour qui** : les data scientists et développeurs qui veulent réutiliser les données des cartes et graphiques DataViz, et toute personne qui veut savoir d'où vient un chiffre.
- **Ce que vous trouverez** : la liste des fichiers communs, le sens de chaque champ (définition, source, unité), les totaux de contrôle et la commande pour tout recalculer.
- **Données utilisées** : BD TOPO (communes), hébergements Insee, catalogue des 2 872 sites, écocompteurs, GTFS Loopi, Apidae, commerces, emploi URSSAF, covoiturage et recharge.
- **Mise à jour** : 9 novembre 2026, à chaque lancement du script `scripts/dataviz/build_base.py`.
:::

Toutes les pages de l'onglet DataViz partent des **mêmes fichiers** : un fond de carte des communes et une table d'indicateurs par commune. On rapproche les sources **une seule fois**, au même endroit. Ainsi, un chiffre affiché sur deux pages différentes est toujours le même.

<StatGrid>
  <Stat label="Communes" value="512" hint="toute l'Isère, BD TOPO 2026" />
  <Stat label="Champs par commune" value="40" hint="dont 5 indicateurs déduits" />
  <Stat label="Sites projetés" value="2 872" hint="dont 2 667 en Isère" />
  <Stat label="Compteurs projetés" value="420" hint="dont 258 avec un total 2025" />
</StatGrid>

## Comment les fichiers sont fabriqués

```mermaid
flowchart LR
  subgraph S["Données du SSP Cloud (lecture seule)"]
    A["BD TOPO : communes, EPCI, parkings"]
    B["Hébergements par commune (Insee)"]
    C["Catalogue des sites (portail)"]
    D["Écocompteurs : Eco-Compteur Isère + ENS"]
    E["GTFS Loopi : arrêts"]
    F["Apidae : fêtes et manifestations"]
    G["Commerces, emploi URSSAF, covoiturage, gares"]
  end
  P["build_base.py : rattachement à la commune (code Insee ou point dans le polygone)"]
  A --> P
  B --> P
  C --> P
  D --> P
  E --> P
  F --> P
  G --> P
  P --> M["communes.json : fond de carte"]
  P --> I["communes-indicateurs.json et .csv"]
  P --> R["epci-indicateurs.json"]
  P --> T["sites.json et compteurs.json"]
  M --> V["Cartes et graphiques de l'onglet DataViz"]
  I --> V
  R --> V
  T --> V
```

Comment lire : chaque source, à gauche, est lue par un seul script. Le script rattache chaque ligne à une commune, puis écrit les fichiers de droite. Les pages DataViz lisent seulement ces fichiers, jamais les données brutes.

## Les fichiers

Tous les fichiers sont servis par le portail sous `/dataviz/base/`. On peut les ouvrir dans le navigateur ou les télécharger.

| Fichier | Contenu | Taille |
|---|---|---:|
| [communes.json](/dataviz/base/communes.json) | Fond de carte : contour SVG de chaque commune et du département | 547 Ko |
| [communes-indicateurs.json](/dataviz/base/communes-indicateurs.json) | 40 indicateurs pour chacune des 512 communes | 543 Ko |
| [communes-indicateurs.csv](/dataviz/base/communes-indicateurs.csv) | La même table à plat, pour un tableur (séparateur point-virgule) | 85 Ko |
| [epci-indicateurs.json](/dataviz/base/epci-indicateurs.json) | Les indicateurs additionnés par intercommunalité (18 EPCI) | 13 Ko |
| [sites.json](/dataviz/base/sites.json) | Les 2 872 sites du catalogue, placés sur le fond de carte | 592 Ko |
| [compteurs.json](/dataviz/base/compteurs.json) | Les 420 compteurs de passage, placés sur le fond de carte, avec leur total 2025 | 151 Ko |
| [meta.json](/dataviz/base/meta.json) | Date de calcul, sources, totaux de contrôle | 3 Ko |

Comment lire : un fichier par usage. Pour une carte, il faut `communes.json` plus un fichier de valeurs. Pour un tableau ou un graphique, `communes-indicateurs.json` suffit.

## Les indicateurs, commune par commune

Le tableau reprend les principaux indicateurs. Cliquez sur un en-tête pour trier ; filtrez par intercommunalité.

<DataTable src="/dataviz/base/communes-table.json" pageSize={15} placeholder="Rechercher une commune, un code Insee, une intercommunalité…" />

Comment lire : une ligne par commune. Le tri par défaut place en tête les communes qui ont le plus de lits touristiques. « Lits pour 100 hab. » est un calcul (déduit) : plus il est élevé, plus la commune dépend du tourisme.

## Dictionnaire des données

### communes.json : le fond de carte

Un objet unique. Les coordonnées sont déjà converties dans le repère du dessin : aucune projection n'est à faire côté navigateur.

| Champ | Définition | Source | Unité |
|---|---|---|---|
| `viewBox` | Cadre du dessin SVG, `"0 0 1000 1015"` | calcul | pixels SVG |
| `width`, `height` | Largeur (1000) et hauteur (1015) du dessin | calcul | pixels SVG |
| `projection` | Paramètres pour passer du Lambert-93 au dessin (voir plus bas) | calcul | — |
| `outline` | Contour du département (chemin SVG) | BD TOPO, union des communes | chemin SVG |
| `simplification_m` | Tolérance de simplification des contours | calcul | mètres |
| `features[].insee` | Code Insee de la commune (5 caractères) | BD TOPO, couche `commune` | texte |
| `features[].nom` | Nom officiel | BD TOPO | texte |
| `features[].d` | Contour de la commune (attribut `d` d'un `path` SVG) | BD TOPO, simplifiée | chemin SVG |
| `features[].cx`, `cy` | Point d'étiquette, toujours à l'intérieur de la commune | calcul (pôle d'inaccessibilité) | pixels SVG |
| `features[].population` | Population municipale | BD TOPO (recensement Insee) | habitants |
| `features[].surface_km2` | Surface, calculée sur le contour complet | BD TOPO | km² |
| `features[].epci`, `epci_siren` | Intercommunalité de rattachement et son numéro SIREN | BD TOPO, couche `epci` | texte |

Comment lire : pour dessiner la carte, on trace un `path` par élément de `features`, puis `outline` par-dessus. Les communes voisines partagent exactement la même frontière, sans trou ni chevauchement.

### communes-indicateurs.json : les indicateurs croisés

Un objet dont chaque clé est un code Insee. Les communes sans donnée valent 0 (et non « absent »).

| Champ | Définition | Source (dossier du bucket) | Unité |
|---|---|---|---|
| `nom`, `population`, `surface_km2`, `epci`, `epci_siren` | Comme dans `communes.json` | BD TOPO | — |
| `densite_hab_km2` | Population divisée par la surface (déduit) | calcul | hab./km² |
| `lits` | Lits touristiques marchands : hôtels, campings et autres hébergements collectifs | `Hébergements/Hébergements par commune.xlsx` (Insee, 1er janvier 2026) | lits |
| `lits_hotels`, `lits_campings`, `lits_autres_collectifs` | Détail de `lits` par type (autres collectifs : résidences de tourisme, villages vacances, auberges de jeunesse) | idem | lits |
| `etablissements`, `etablissements_hotels`, `etablissements_campings`, `etablissements_autres_collectifs` | Nombre d'hébergements, au total et par type | idem | établissements |
| `lits_pour_100_hab` | Lits pour 100 habitants, appelé aussi taux de fonction touristique (déduit) | calcul | lits / 100 hab. |
| `sites` | Sites touristiques du catalogue situés dans la commune | `docs/public/tables/sites-isere.json` | sites |
| `sites_par_categorie` | Détail de `sites` par catégorie : Loisirs et baignade, Nature et paysages, Neige, Patrimoine et culture, Sports de nature | idem | sites |
| `sites_surfrequentes` | Sites de la liste « sur-fréquentés » d'Isère Attractivité | `Sites et équipements/Sites sur-fréquentés.xlsx`, via le catalogue | sites |
| `sites_conseilles` | Lieux conseillés en report par Isère Attractivité | idem | sites |
| `score_moyen_sites` | Moyenne du score de données exploitables des sites de la commune (déduit) | catalogue | note sur 10 |
| `compteurs` | Compteurs de passage situés dans la commune | `Fréquentation/eco-compteur-Isère/sites/sites_isere.csv` et archives `Fréquentation/DONNEES brutes ecocompteurs ENS/` | compteurs |
| `compteurs_actifs_2025` | Parmi eux, ceux qui ont au moins un jour de mesure en 2025 | comptages journaliers 2025 et mesures ENS 2025 | compteurs |
| `arrets_tc` | Arrêts de transport en commun distincts (même nom à 10 m près = un seul arrêt) | `Transports/Données transports Loopi~/data/gtfs/*.zip`, fichiers `stops.txt` | arrêts |
| `arrets_tc_pour_1000_hab` | Arrêts pour 1 000 habitants (déduit) | calcul | arrêts / 1 000 hab. |
| `gares` | Gares de voyageurs (intérêt national, régional ou local) | `Transports/Equipements gares, taxis et aéroport par commune.xlsx` (BPE Insee) | gares |
| `parkings` | Parkings recensés par l'IGN | BD TOPO, couche `equipement_de_transport` | parkings |
| `aires_covoiturage`, `places_covoiturage` | Aires de covoiturage et leurs places | `Transports/Mobilités alternatives (covoiturage, bornes élecrtiques.).xlsx`, feuille « Covoiturage » (BNLC) | aires, places |
| `stations_recharge`, `points_recharge` | Stations de recharge électrique et points de charge | idem, feuille « recharges électriques » | stations, points |
| `evenements` | Fiches de fêtes et manifestations, rattachées par la commune de leur adresse | `Activités/Fêtes et manifestations.xlsx` (Apidae) | fiches |
| `restaurants` | Restaurants et restauration rapide | `Commerces/Commerces par commune.xlsx`, feuille « Commerces par commune 4 » | établissements |
| `restaurants_pour_1000_hab` | Restaurants pour 1 000 habitants (déduit) | calcul | restaurants / 1 000 hab. |
| `commerces` | Grandes surfaces, commerces alimentaires de proximité et commerces de biens courants (hors restaurants) | idem | établissements |
| `grandes_surfaces`, `commerces_alimentaires`, `commerces_courants` | Détail de `commerces` | idem | établissements |
| `emplois_tourisme` | Salariés des activités du tourisme en 2025 (codes APE 55, 56, 79, 77.21, 91.02 à 91.04, 93.2) | `Emploi/emplois en Isère par commune.xlsx` (URSSAF) | salariés |
| `emplois_tourisme_detail` | Détail : `hebergement` (55), `restauration` (56), `agences_voyage` (79), `loisirs` (77.21, 91.02 à 91.04, 93.2) | idem | salariés |
| `etablissements_employeurs_tourisme` | Établissements employeurs de ces mêmes activités en 2025 | idem | établissements |

Comment lire : un champ est une colonne de la table, une commune est une ligne. Les champs marqués « (déduit) » sont des rapports calculés à partir des autres : ils ne viennent d'aucun fichier source.

### epci-indicateurs.json : les intercommunalités

Un objet dont chaque clé est le numéro SIREN de l'intercommunalité. Il contient `nom`, `communes` (nombre de communes membres) et la **somme** des indicateurs de comptage des communes : `population`, `surface_km2`, `lits` et son détail, `sites`, `sites_par_categorie`, `sites_surfrequentes`, `sites_conseilles`, `compteurs`, `compteurs_actifs_2025`, `arrets_tc`, `gares`, `parkings`, `aires_covoiturage`, `places_covoiturage`, `stations_recharge`, `points_recharge`, `evenements`, `restaurants`, `commerces`, `emplois_tourisme`, `etablissements_employeurs_tourisme`. Les rapports `lits_pour_100_hab` et `densite_hab_km2` sont recalculés à l'échelle de l'intercommunalité (déduit).

### sites.json : les sites placés sur la carte

Une liste d'objets, un par site, dans le même ordre que le [tableau de tous les sites](/sites/tous-les-sites).

| Champ | Définition | Source | Unité |
|---|---|---|---|
| `id` | Rang du site dans `tables/sites-isere.json` | catalogue | entier |
| `x`, `y` | Position dans le repère du fond de carte | calcul depuis la latitude et la longitude | pixels SVG |
| `nom`, `categorie`, `type`, `commune`, `insee` | Identité du site | catalogue (`scripts/build_sites_catalog.py`) | texte |
| `score` | Richesse des données exploitables autour du site | catalogue | note sur 10 |
| `surfrequente` | Le site est dans la liste des sites sur-fréquentés d'Isère Attractivité | catalogue | oui / non |
| `conseille` | Présent seulement si le site est un lieu conseillé en report | catalogue | oui |
| `position_approchee` | Présent seulement si le site est placé au centre de sa commune, faute de coordonnées | catalogue | oui |
| `fiche` | Présent seulement si le site a une fiche détaillée : adresse de la page | portail | lien |

Comment lire : 205 sites sont dans un département voisin (Savoie, Drôme, Hautes-Alpes…). Leur position sort du cadre de la carte de l'Isère : il faut les masquer ou les rogner.

### compteurs.json : les compteurs de passage

Une liste d'objets, un par compteur. Les 49 compteurs des espaces naturels sensibles (ENS) présents dans les deux sources ne comptent qu'une fois.

| Champ | Définition | Source | Unité |
|---|---|---|---|
| `id` | Identifiant Eco-Compteur du site de comptage | `sites_isere.csv`, `sites.csv` des archives ENS | texte |
| `x`, `y` | Position dans le repère du fond de carte | calcul | pixels SVG |
| `lat`, `lon` | Position géographique | idem | degrés |
| `nom` | Nom du site de comptage | idem | texte |
| `source` | « Eco-Compteur Isère », « écocompteurs ENS » ou les deux | calcul | texte |
| `gestionnaire` | Organisme qui gère le compteur | `sites_isere.csv` (`domain_name`) | texte |
| `modes` | Ce qui est compté : piétons, vélos, trottinettes, voitures, véhicules, motos, bus | `user_types`, `channels.csv` | liste |
| `debut`, `fin`, `periode` | Premier et dernier jour de mesure ; `periode` donne les années | idem | date |
| `insee` | Commune qui contient le compteur (point dans le polygone) | calcul | texte |
| `total_2025` | Passages comptés en 2025, tous modes et tous sens confondus | `comptages/comptages_journalier_2025_2026.csv`, sinon `measures.csv` de l'archive ENS 2025 | passages |
| `jours_2025` | Jours de 2025 avec au moins une mesure | idem | jours |
| `couverture_2025` | Part des jours de 2025 mesurés, de 0 à 1 (déduit) | calcul | ratio |
| `moyenne_jour` | `total_2025` divisé par `jours_2025` (déduit) | calcul | passages / jour |
| `total_2025_source` | Fichier qui a servi au total | calcul | texte |

Comment lire : les champs `total_2025` à `moyenne_jour` n'existent que pour les 258 compteurs mesurés en 2025. Avant de comparer deux compteurs, vérifiez `couverture_2025` : un compteur à 0,4 a manqué plus de la moitié de l'année.

## Le repère de la carte

Toutes les positions sont en **pixels SVG**, dans un cadre de 1000 sur 1015 : le nord en haut, l'axe vertical vers le bas. La conversion part du Lambert-93 (le système de coordonnées officiel en France, en mètres) :

```text
x = 10 + (X - 836000) * 0.0075734
y = 10 + (6534500 - Y) * 0.0075734
```

Comment lire : X et Y sont les coordonnées Lambert-93 du point, en mètres. Un pixel vaut environ 132 mètres. Pour un point en latitude et longitude, utilisez `project(lon, lat)` du module Python décrit plus bas.

## Les totaux de contrôle

Les totaux ci-dessous sont recalculés à chaque lancement et écrits dans [meta.json](/dataviz/base/meta.json).

| Indicateur | Total Isère | Contrôle |
|---|---:|---|
| Population | 1 298 990 | somme des 512 communes de la BD TOPO |
| Lits touristiques | 40 674 | identique à la ligne « Total » du fichier Insee |
| Hébergements | 451 | idem |
| Sites du catalogue en Isère | 2 667 | sur 2 872 sites |
| Compteurs | 420 | 417 Eco-Compteur Isère + 3 compteurs ENS absents du premier fichier |
| Arrêts de transport en commun | 7 140 | 149 flux GTFS lus |
| Fêtes et manifestations | 6 051 | sur 6 052 fiches (une seule est dans le Rhône) |
| Restaurants | 4 322 | identique à l'analyse « Commerces et emploi » |
| Commerces hors restaurants | 4 914 | idem |
| Emplois salariés du tourisme (2025) | 21 286 | lignes URSSAF des codes APE du tourisme |
| Aires de covoiturage | 474 | 5 313 places, identique à l'analyse « Covoiturage » |
| Stations de recharge | 429 | 1 024 points de charge |

:::caution{title="Lits : 40 674 et non 81 348"}
L'analyse « Capacité d'hébergement » de l'onglet Analyses affiche 81 348 lits et 902 établissements. Elle additionne aussi la ligne « Total » du fichier Insee, donc tout est compté deux fois. Le bon total est **40 674 lits dans 451 établissements**, celui des bases croisées.
:::

## Comment rejouer les calculs

Depuis le dossier `docs/`, avec l'environnement Python du projet (pandas, duckdb, shapely, pyproj, openpyxl, ftfy) :

```bash
python -I -W ignore scripts/dataviz/build_base.py
```

Le calcul prend moins d'une minute. Il lit les données brutes dans `data/` sans jamais les modifier. Il réécrit un fichier seulement si son contenu change : on peut le relancer autant de fois qu'on veut.

Pour réutiliser les bases dans un autre script Python, importez le module commun :

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path("scripts/dataviz").resolve()))
from common import project, load_communes, load_indicateurs, load_sites, load_compteurs, commune_of, OUT

ind = load_indicateurs()                  # {"38185": {"nom": "Grenoble", "lits": 2377, ...}, ...}
x, y = project(5.7245, 45.1885)           # longitude, latitude -> position sur le fond de carte
insee = commune_of(5.7245, 45.1885)       # "38185"
```

Comment lire : `OUT` est le dossier `public/dataviz/`. Un script qui y écrit un fichier JSON le rend disponible sous `/dataviz/…` dans le portail.

## Limites

- **Hébergement incomplet** : le fichier Insee ne compte que l'hébergement marchand collectif (hôtels, campings, résidences de tourisme, villages vacances, auberges). Les meublés de tourisme et les résidences secondaires n'y sont pas. Dans les stations de ski, la capacité réelle est donc bien plus grande. Certaines stations affichent 0 lit d'hôtel : c'est souvent un manque du fichier, pas une absence d'hôtel.
- **Transports en commun partiels** : les GTFS du bucket contiennent les cars Région Isère, les trains, Ruban (Bourgoin-Jallieu) et les autocars longue distance, mais **pas le réseau urbain de Grenoble** (M réso) ni celui du Pays voironnais. Grenoble n'a que 51 arrêts dans la base : la métropole est très sous-estimée.
- **Rattachement des événements** : la commune vient du texte de l'adresse Apidae. Les noms de stations (Alpe d'Huez, Les Sept Laux, Le Collet…) et d'anciennes communes sont convertis par une table de correspondance. Une fiche peut décrire un événement récurrent : `evenements` compte des fiches, pas des jours de fête.
- **Compteurs hétérogènes** : un compteur de déchèterie, une piste cyclable urbaine et un sentier d'espace naturel n'ont pas le même sens. Filtrez sur `modes` et `gestionnaire`. Certaines valeurs de comptage sont reconstruites par le fournisseur après une panne.
- **Emploi** : les effectifs URSSAF ne comptent que les salariés du privé, au lieu de l'établissement. Les petites valeurs peuvent manquer (secret statistique) : elles valent 0 ici. Les saisonniers ne sont pas tous visibles dans une moyenne annuelle.
- **Sites** : le catalogue rassemble plusieurs sources. 331 sites sans coordonnées sont placés au centre de leur commune (`position_approchee`). Un même lieu peut encore apparaître sous deux noms proches.
- **Fond de carte simplifié** : les contours sont lissés à 60 m près pour alléger le fichier. Ils servent à dessiner, pas à mesurer : les surfaces sont calculées sur les contours complets.
