Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ouverture des données #117

Open
wants to merge 35 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
4643ecd
Exemple fichier pour une commune
hfroot Jul 7, 2023
de1499f
First pass stocks CSV generation
hfroot Jul 13, 2023
3d157fb
Add forgotten file
hfroot Jul 13, 2023
eed4360
Complete geographical data
hfroot Jul 13, 2023
244f5ce
Refactor
hfroot Jul 14, 2023
7fca6a6
Fix bug where the ZPC file did not include the leading zeros for comm…
hfroot Jul 14, 2023
3183aa1
Flux records
hfroot Jul 14, 2023
ff4cc13
Files generated with previous commit
hfroot Jul 14, 2023
c8c9f09
First 100 communes
hfroot Jul 14, 2023
3d4ed29
Update documentation
hfroot Jul 14, 2023
2b0ad0d
Refactor to be able to generate the complete file without overwhelmin…
hfroot Jul 14, 2023
6ce425f
Add columns per-reservoir to reduce the size of the stocks file
hfroot Jul 19, 2023
3143417
Flux reservoirs into columns
hfroot Jul 20, 2023
57b3f8e
Add IGN localisation level and code to explain multiple biomass growt…
hfroot Jul 20, 2023
068f0c3
Refactor promise handling + stocks record count check
hfroot Jul 20, 2023
23c3b3d
Department split
hfroot Jul 20, 2023
a955a06
Region files
hfroot Jul 20, 2023
ab6be21
All communes
hfroot Jul 20, 2023
5409cf1
All communes
hfroot Jul 20, 2023
95cd1c1
Putting on pause memory leak and wood produt debugging
hfroot Jul 20, 2023
e2695ef
Option 2: stocks on one line
hfroot Jul 20, 2023
c30b457
Flux one-liners
hfroot Jul 20, 2023
a2ecd2b
All communes
hfroot Jul 20, 2023
6844044
Separate flux concepts into different files to make them manageable s…
hfroot Jul 24, 2023
647fa46
ignore generated data
hfroot Aug 15, 2023
f9e7f05
Merge branch 'main' into csv-stocks
hfroot Sep 3, 2023
8170adf
Add total sequestration in area change file and remove forest columns
hfroot Sep 3, 2023
886ddf9
Fix bug which assumes there will be fluxes due to forests, not the ca…
hfroot Sep 3, 2023
ea99167
Merge branch 'main' into csv-stocks
hfroot Sep 13, 2023
33505bf
Add total flux due to biomass growth in forests
hfroot Sep 13, 2023
6737e1a
Ensure all flux reference values can be included in export
hfroot Sep 15, 2023
c3a3fc5
Remove old code and add total stock per ground type and hedgerows
hfroot Sep 15, 2023
20118ab
Add 6 wood total stock columns
hfroot Oct 13, 2023
e600a2f
Add wood product flux columns to biomass growth file; and units for f…
hfroot Oct 13, 2023
735b7c5
Remove unnecessary file
hfroot Oct 13, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@
/scripts/*/*.csv
/scripts/*/*/*.csv
/scripts/*.zip
/scripts/*/*.zip
/scripts/*/*.zip
24 changes: 11 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,40 +1,38 @@
# Fiche produit : Aldo

Nos données sont ouvertes : [lire la documentation](data.md)

## Le drame

L'urgence de la lutte contre le réchauffement climatique n'est plus à présenter. La combustion de carburants fossiles est bien sûr la cause principale du réchauffement. Mais un autre sujet s'avère clef, et probablement moins médiatisé : l'évolution du stock de carbone dans les sols.
L'urgence de la lutte contre le réchauffement climatique n'est plus à présenter. La combustion de carburants fossiles est bien sûr la cause principale du réchauffement. Mais un autre sujet s'avère clef, et probablement moins médiatisé : l'évolution du stock de carbone dans les sols.

[
![](https://storage.gra.cloud.ovh.net/v1/AUTH_0f20d409cb2a4c9786c769e2edec0e06/imagespadincubateurnet/uploads/upload_ae5420c17ab682fad0a711e110c59a1c.png)](https://www.globalcarbonproject.org/carbonbudget/21/files/GCP_CarbonBudget_2021.pdf)

La planète [se verdit](https://earthobservatory.nasa.gov/images/146296/global-green-up-slows-warming), ce qui permet d'amoindrir le réchauffement climatique. En même temps, des investigations récentes montrent que les émissions de gaz à effet de serre des pays seraient [très lourdement sous-estimées](https://www.washingtonpost.com/climate-environment/interactive/2021/greenhouse-gas-emissions-pledges-data).
La planète [se verdit](https://earthobservatory.nasa.gov/images/146296/global-green-up-slows-warming), ce qui permet d'amoindrir le réchauffement climatique. En même temps, des investigations récentes montrent que les émissions de gaz à effet de serre des pays seraient [très lourdement sous-estimées](https://www.washingtonpost.com/climate-environment/interactive/2021/greenhouse-gas-emissions-pledges-data).

La France est le troisième plus vaste pays d'Europe. À ce titre, l'étude et la publication des chiffres sur l'usage des sols et en particulier les stocks et les flux de carbone, est nécessaire à la fois pour évaluer et diminuer le risque d'une évolution peu satisfaisante, mais aussi pour annoncer des bonnes nouvelles le cas échéant.
La France est le troisième plus vaste pays d'Europe. À ce titre, l'étude et la publication des chiffres sur l'usage des sols et en particulier les stocks et les flux de carbone, est nécessaire à la fois pour évaluer et diminuer le risque d'une évolution peu satisfaisante, mais aussi pour annoncer des bonnes nouvelles le cas échéant.

Au vu des incertitudes voir des controverses internationales sur l'estimation du carbone stocké dans les sols, il est primordial que la France soit exemplaire sur l'accessibilité et la transparence de ses propres données.

Or, l'accès aux données du territoire français, évidemment peu homogène du fait notamment de sa diversité de régimes climatiques et biorégions, est aujourd'hui très compliqué, en particulier pour les agents de l'administration locale qui est souvent la plus à même d'agir sur l'évolution des sols.



## La solution numérique

Pour mieux comprendre et gérer ces changements d'usage des sols, il nous faut faciliter l'accès aux données du stockage pour les 40 000 communes métropolitaines.
Pour mieux comprendre et gérer ces changements d'usage des sols, il nous faut faciliter l'accès aux données du stockage pour les 40 000 communes métropolitaines.

Des données aussi cruciales doivent être accessibles en 1 clic sur une interface qui permette à la fois d'avoir une synthèse pédagogique du bilan, que d'explorer les raisons de ce résultat, via un accès aux données *et* à l'algorithme de calcul de ces données se basant sur des relevés bruts des types de sols.
Des données aussi cruciales doivent être accessibles en 1 clic sur une interface qui permette à la fois d'avoir une synthèse pédagogique du bilan, que d'explorer les raisons de ce résultat, via un accès aux données _et_ à l'algorithme de calcul de ces données se basant sur des relevés bruts des types de sols.

La première version de l'outil sera un simple moteur de recherche par commune ou [intercommunalité](https://fr.wikipedia.org/wiki/Établissement_public_de_coopération_intercommunale) des données calculées de stock et de flux de carbone des sols, basée sur un tableur qui a déjà montré ses limites de charge et d'utilisabilité.
La première version de l'outil sera un simple moteur de recherche par commune ou [intercommunalité](https://fr.wikipedia.org/wiki/Établissement_public_de_coopération_intercommunale) des données calculées de stock et de flux de carbone des sols, basée sur un tableur qui a déjà montré ses limites de charge et d'utilisabilité.

Dans un second temps, l'utilisateur expert doit pouvoir mettre à jour lui-même les données de relevés s'il dispose d'informations complémentaires ou corrigées.

Un arbre, c'est du carbone atmoshérique stocké par la photosynthèse... mais au-delà de ce mécanisme de base si séduisant, le sujet s'avère incroyablement complexe. Pour le grand public, Aldo pourra aussi être un moyen d'appréhender la complexité du sujet de la captation de carbone via les sols.
Un arbre, c'est du carbone atmoshérique stocké par la photosynthèse... mais au-delà de ce mécanisme de base si séduisant, le sujet s'avère incroyablement complexe. Pour le grand public, Aldo pourra aussi être un moyen d'appréhender la complexité du sujet de la captation de carbone via les sols.

## Le déploiement

Aldo sera une application Web accessible à tout le monde.

Les Plans climat-air-énergie territoriaux ([PCAET](https://fr.wikipedia.org/wiki/Plan_climat-air-énergie_territorial)) sont les jalons récurrents qui profiteront certainement de l'accès à la plateforme Aldo, notamment pour leur volet d'état des lieux.

L'outil open source lui-même, déployé d'abord en France, pourra certainement l'être aussi à l'international, les besoins étant très similaires au moins dans l'Union Européenne.

Les Plans climat-air-énergie territoriaux ([PCAET](https://fr.wikipedia.org/wiki/Plan_climat-air-énergie_territorial)) sont les jalons récurrents qui profiteront certainement de l'accès à la plateforme Aldo, notamment pour leur volet d'état des lieux.

L'outil open source lui-même, déployé d'abord en France, pourra certainement l'être aussi à l'international, les besoins étant très similaires au moins dans l'Union Européenne.
20 changes: 13 additions & 7 deletions calculations/flux/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,22 @@ function getAnnualFluxes (communes, options) {
fluxes = replaceWithOverride(fluxes, areas, from, to, 'litière')
})

fluxes = fluxes.filter((f) => !!f.co2e)
fluxes.push(...getNitrousOxideEmissions(fluxes))
const fluxWithValue = fluxes.filter((f) => !!f.co2e)
const n20Emissions = getNitrousOxideEmissions(fluxWithValue)
fluxWithValue.push(...n20Emissions)
fluxes.push(...n20Emissions)
// TODO: aggregations for display
// - produits bois details

fluxes.push(...getFluxAgriculturalPractices(options?.agriculturalPracticesEstablishedAreas))
const agriculturalPractices = getFluxAgriculturalPractices(options?.agriculturalPracticesEstablishedAreas)
fluxWithValue.push(...agriculturalPractices)
fluxes.push(...agriculturalPractices)

const { summary, biomassSummary, fluxCo2eByGroundType, woodSummary, total } = fluxSummary(fluxes, options)
const { summary, biomassSummary, fluxCo2eByGroundType, woodSummary, total } = fluxSummary(fluxWithValue, options)

return {
allFlux: fluxes,
fluxWithValue,
summary,
biomassSummary,
areas,
Expand Down Expand Up @@ -250,13 +255,14 @@ function fluxSummary (allFluxes, options) {
// update change flag for forests based on if the area used in biomass growth
// calculations is defined by the user.
const biomassGrowthAreaModified = biomassSummary.some((subtype) => subtype.areaModified)
summary.forêts.areaModified = summary.forêts.areaModified || biomassGrowthAreaModified
summary.forêts.hasModifications = summary.forêts.hasModifications || biomassGrowthAreaModified
if (summary.forêts) {
summary.forêts.areaModified = summary.forêts.areaModified || biomassGrowthAreaModified
summary.forêts.hasModifications = summary.forêts.hasModifications || biomassGrowthAreaModified
}
return { summary, biomassSummary, fluxCo2eByGroundType, woodSummary, total }
}

function forestBiomassGrowthSummary (allFlux, options) {
// aggregate forest biomass data which is by commune, not EPCI
const forestBiomassSummaryByType = []
const forestSubtypes = ['forêt mixte', 'forêt feuillu', 'forêt conifere', 'forêt peupleraie']
for (const subtype of forestSubtypes) {
Expand Down
12 changes: 9 additions & 3 deletions calculations/flux/integration.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@ describe('Flux module integration tests', () => {
const communes = getCommunes({ epci: getEpci('200007177', true) })
test('returns expected number of entries for cultures ground changes', () => {
// only return fluxes != 0
const allFlux = getAnnualFluxes(communes).allFlux
const culturesFlux = allFlux.filter(f => f.to === 'cultures')
const cGround = culturesFlux.filter(f => f.gas === 'C' && f.reservoir === 'sol')
const fluxes = getAnnualFluxes(communes)
const fluxWithValue = fluxes.fluxWithValue
let culturesFlux = fluxWithValue.filter(f => f.to === 'cultures')
let cGround = culturesFlux.filter(f => f.gas === 'C' && f.reservoir === 'sol')
expect(cGround.length).toBe(5)
// 13 flux values * 12 communes in this EPCI = 156
const allFlux = fluxes.allFlux
culturesFlux = allFlux.filter(f => f.to === 'cultures')
cGround = culturesFlux.filter(f => f.gas === 'C' && f.reservoir === 'sol')
expect(cGround.length).toBe(156)
})

// data-dependent tests
Expand Down
17 changes: 17 additions & 0 deletions data.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Les données

Les données sont disponibles en format CSV, encodage UTF-8.

Pour que les nombres décimal sont bien formattés en LibreOffice, assurez-vous que le langage utilisé pour ouvrir le fichier est anglais.

[Stocks](./data/dataByCommune/stocks.csv)
[Flux](./data/dataByCommune/flux.csv)

## Valeurs de France

Pour les calculs de stocks et fluxs de produits bois, on utilise les valeurs suivantes:

- les stocks par usage : [getFranceStocksWoodProducts](./data/stocks.js#L209)
- le récolte par usage : [getAnnualFranceWoodProductsHarvest](./data/stocks.js#L217)
- la population de France : [totalPopulation](./data/dataByEpci/france.json#L48673)
- les puits en France par usage : [getFranceFluxWoodProducts](./data/flux.js#L345)
2 changes: 2 additions & 0 deletions data/flux.js
Original file line number Diff line number Diff line change
Expand Up @@ -369,9 +369,11 @@ function getForestBiomassFluxesByCommune (location) {
const significantCarbonData = carbonData.filter((data) => data.surface_ic === 's')
let areaDataByCommune = []
if (location.epci) {
// TODO: this function is only called with a single commune, remove this if
areaDataByCommune = areaData.filter(data => data.CODE_EPCI === location.epci.code)
} else if (location.commune) {
let code = location.commune.insee
// TODO: fix data to avoid this ugly 0 removal
if (code.startsWith('0')) code = code.slice(1)
areaDataByCommune = areaData.filter(data => data.INSEE_COM === code)
}
Expand Down
22 changes: 10 additions & 12 deletions front/handlers/territory.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,18 +135,16 @@ async function territoryHandler (req, res) {
function formatFluxForDisplay (flux) {
const fluxDetail = {}
const agriculturalPracticeDetail = {}
flux.allFlux.forEach(f => {
if (f.value !== 0) {
if (f.practice) {
if (!agriculturalPracticeDetail[f.to]) {
agriculturalPracticeDetail[f.to] = []
}
agriculturalPracticeDetail[f.to].push(f)
} else {
if (!fluxDetail[f.to]) fluxDetail[f.to] = []
// biomass growth in forests is displayed elsewhere
if (f.growth === undefined) fluxDetail[f.to].push(f)
flux.fluxWithValue.forEach(f => {
if (f.practice) {
if (!agriculturalPracticeDetail[f.to]) {
agriculturalPracticeDetail[f.to] = []
}
agriculturalPracticeDetail[f.to].push(f)
} else {
if (!fluxDetail[f.to]) fluxDetail[f.to] = []
// biomass growth in forests is displayed elsewhere
if (f.growth === undefined) fluxDetail[f.to].push(f)
}
})
// order the details by initial occupation
Expand Down Expand Up @@ -338,7 +336,7 @@ function fluxCharts (flux) {
const labels = keys.map(key => GroundTypes.find(k => k.stocksId === key)?.name)
const reservoirLabels = ['Sol et litière', 'Biomasse'] // produits bois
const reservoirData = [0, 0]
flux.allFlux.forEach(f => {
flux.fluxWithValue.forEach(f => {
if (f.reservoir === 'sol' || f.reservoir === 'litière') {
reservoirData[0] += Math.round(f.co2e)
} else if (f.reservoir === 'biomasse') {
Expand Down
13 changes: 13 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"sib-api-v3-sdk": "^8.4.2"
},
"devDependencies": {
"csv-writer": "^1.6.0",
"eslint": "^7.32.0",
"eslint-config-standard": "^16.0.3",
"eslint-plugin-import": "^2.25.4",
Expand Down
Loading