Commit 40b682f6 authored by Benjam's avatar Benjam
Browse files

Merge branch 'develop'

parents ec0c91a8 b5a9874f
......@@ -135,15 +135,18 @@ export const donneesInitiales: DonneesCarte = {
},
{
id: 'nodu-normalise',
libelle: 'Nombre moyen de traitements par hectare',
description: 'Cet indicateur correspond au NODU normalisé, ie au rapport entre le NODU et la SAU totale.',
libelle: 'Nombre moyen de traitements de pesticides par hectare',
description:
`Cet indicateur correspond au ratio entre le <abbr title="NOmbre de Doses Unités">NODU</abbr> et la <abbr title="Surface Agricole Utile">SAU</abbr> totale.
Il permet d'appréhender l'intensité d'usage en pesticides d'un territoire
(voir <a href="./methodologie.html#regles-de-gestion-pour-les-pratiques-agricoles" target="_blank">méthodologie</a>).`,
estCliquable: true,
style: 'GradientNoduNormalise',
nomIndicateurApi: 'pratiquesAgricoles.produitsPhytosanitaires.indicateursMoyennesTriennales.NoduNormalise',
nomValeurApi: '3',
nomMessageApi: '3',
texteTitre: `<h1>Nombre moyen de traitements par hectare</h1>
<h2><strong>NB</strong>: des valeurs supérieures à 10 peuvent signifier une surestimation du NODU
<h2><strong>NB</strong>: des valeurs supérieures à 10 peuvent signifier une surestimation du <abbr title="NOmbre de Doses Unités">NODU</abbr>
(voir <a href="./methodologie.html#regles-de-gestion-pour-les-pratiques-agricoles" target="_blank">méthodologie</a>)</h2>
<h2>D'après <a href="https://www.data.gouv.fr/fr/datasets/achats-de-pesticides-par-code-postal/" target="_blank">BNVd 2021</a>,
arrêtés ministériels <a href="https://info.agriculture.gouv.fr/gedei/site/bo-agri/document_administratif-fbafa36b-8218-40fc-a461-1b47df670dbe" target="_blank">2017</a>
......
import { Afficheur } from '../../commun/controleurs/Afficheur';
import {
ContenuStatique,
EnteteTitreEtNavigation,
GroupeBoutons,
GroupeBoutonsGlissants,
MenuGlissant,
PiedPage
} from '../../commun/vues';
import { ContenuStatique, EnteteTitreEtNavigation, GroupeBoutons, GroupeBoutonsGlissants, MenuGlissant, PiedPage } from '../../commun/vues';
import { EchelleTerritoriale, Indicateur, PageCarte } from '../domaines/PageCarte';
import { CarteColoree } from '../vues/CarteColoree';
import { ControleurCarte } from './ControleurCarte';
......
import L, {
FeatureGroup,
GeoJSON,
GeoJSONOptions,
LatLng,
LatLngBounds,
Layer,
LeafletMouseEvent,
Map,
PathOptions
} from 'leaflet';
import L, { FeatureGroup, GeoJSON, GeoJSONOptions, LatLng, LatLngBounds, Layer, LeafletMouseEvent, Map, PathOptions } from 'leaflet';
import 'leaflet/dist/leaflet.css';
import * as geojson from 'geojson';
import {
calculerCouleurNoteSelonGradient,
calculerCouleurValeurSelonGradient,
JaugeNoteSur10
} from '../../commun/vues';
import { calculerCouleurNoteSelonGradient, calculerCouleurValeurSelonGradient, JaugeNoteSur10 } from '../../commun/vues';
import { IndicateurSynthese } from '../../diagnostic/domaines/rapports';
import { DonneesFeatureGeoJson, ValeursIndicateurs } from '../domaines/PageCarte';
import { arrondirANDecimales } from '../../commun/base';
......
......@@ -167,6 +167,7 @@ a:hover {
--c-histogramme-serie-1: var(--turquoise);
--c-histogramme-serie-2: var(--bleu);
--c-ligne-serie-1: var(--turquoise);
--c-ligne-serie-1-bis: var(--turquoise-opaque);
--c-ligne-serie-2: var(--bleu);
--c-ligne-serie-3: var(--rouge);
--c-ligne-serie-4: var(--orange);
......
......@@ -383,17 +383,19 @@
<h4>Quantités de substances actives achetées et Nombre de doses unités équivalent</h4>
<p>
L'indicateur QSA, exprimé en kg, correspond à la quantité totale de substances actives qui ont été achetées sur le territoire.
<br />Seules les substances considérées comme cancérigènes, mutagène ou reprotoxiques, dangereuses pour la santé ou dangereuses
pour l'environnement (voir
L'indicateur <abbr title="Quantité de Substances Actives">QSA</abbr>, exprimé en kg, correspond à la quantité totale de substances
actives qui ont été achetées sur le territoire. <br />Seules les substances considérées comme cancérigènes, mutagène ou
reprotoxiques, dangereuses pour la santé ou dangereuses pour l'environnement (voir
<a href="methodologie.html#regles-de-gestion-pour-les-pratiques-agricoles"> sources et règles de calcul</a>) sont prises en compte
(ie classées tout sauf 'Autre').
</p>
<p>
L'indicateur NODU, exprimé en hectares, est calculé pour chaque subtsance active en faisant le ratio de la QSA avec la dose unité
(DU) de la substance active. Cette DU correspond à la dose maximale applicable sur un hectare. Le calcul du NODU permet donc de
comparer et d'additionner des substances actives qui n'ont pas le même impact à quantité égale utilisée.
<br />Certaines substances n'ont pas de DU et sont donc exclues de facto du calcul. Aussi, comme il est calculé à partir du QSA,
L'indicateur <abbr title="NOmbre de Doses Unités">NODU</abbr>, exprimé en hectares, est calculé pour chaque subtsance active en
faisant le ratio de la <abbr title="Quantité de Substances Actives">QSA</abbr> avec la dose unité (DU) de la substance active.
Cette <abbr title="Dose Unité">DU</abbr> correspond à la dose maximale applicable sur un hectare. Le calcul du
<abbr title="NOmbre de Doses Unités">NODU</abbr> permet donc de comparer et d'additionner des substances actives qui n'ont pas le
même impact à quantité égale utilisée. <br />Certaines substances n'ont pas de <abbr title="Dose Unité">DU</abbr> et sont donc
exclues de facto du calcul. Aussi, comme il est calculé à partir du <abbr title="Quantité de Substances Actives">QSA</abbr>,
seules les substances prises en compte dans le calcul de ce dernier le sont également ici.
</p>
......@@ -410,8 +412,8 @@
<div id="pratiques-agricoles-evolution-qsa-nodu-chart"></div>
<div class="chart-legende">
<p>
Source : Les Greniers d'Abondance, à partir des données BNVd (2021) et des arrêtés ministériels fixant les DU (2017 et
2019)
Source : Les Greniers d'Abondance, à partir des données <abbr title="Banque Nationale des Ventes de produits phytopharmaceutiques par les Distributeurs agréés">BNVD</abbr> (2021) et des arrêtés ministériels fixant les
<abbr title="Dose Unité">DU</abbr> (2017 et 2019)
</p>
</div>
</figure>
......@@ -422,19 +424,20 @@
</div>
<p>
Le NODU normalisé [-] est calculé en faisant le ratio entre le NODU et la surface agricole utile (SAU) totale du territoire. Il
peut s'interpréter comme le nombre moyen de traitements réalisés par hectare. Il permet de faire des comparaisons entre
territoires et/ou périodes temporelles différent(e)s.
<br /><strong>NB</strong> : cet indicateur étant calculé à partir du NODU présenté plus haut, il ne tient compte que de certaines
substances actives. De plus, étant calculé sur base de la SAU totale, il peut cacher des sur-dosages locaux.
Le <abbr title="NOmbre de Doses Unités">NODU</abbr> normalisé [-] est calculé en faisant le ratio entre le
<abbr title="NOmbre de Doses Unités">NODU</abbr> et la surface agricole utile (SAU) totale du territoire. Il peut s'interpréter
comme le nombre moyen de traitements réalisés par hectare. Il permet de faire des comparaisons entre territoires et/ou périodes
temporelles différent(e)s. <br /><strong>NB</strong> : cet indicateur étant calculé à partir du
<abbr title="NOmbre de Doses Unités">NODU</abbr> présenté plus haut, il ne tient compte que de certaines substances actives. De
plus, étant calculé sur base de la SAU totale, il peut cacher des sur-dosages locaux.
</p>
<figure class="conteneur-chart">
<div id="pratiques-agricoles-evolution-nodu-normalise-chart"></div>
<div class="chart-legende">
<p>
Source : Les Greniers d'Abondance, à partir des données BNVd (2021), des arrêtés ministériels fixant les DU (2017 et 2019)
et du recensement agricole (2020)
Source : Les Greniers d'Abondance, à partir des données <abbr title="Banque Nationale des Ventes de produits phytopharmaceutiques par les Distributeurs agréés">BNVD</abbr> (2021), des arrêtés ministériels fixant les
<abbr title="Dose Unité">DU</abbr> (2017 et 2019) et du recensement agricole (2020)
</p>
</div>
</figure>
......
......@@ -30,6 +30,7 @@ export class AfficheurDiagnosticPratiquesAgricoles implements Afficheur<Rapport>
titreYaxisGauche: 'Quantité Substance Active [kg]',
titreYaxisDroite: 'Nombre de Doses Unités [ha]',
couleurYaxisGauche: getVariableCss('--c-ligne-serie-1'),
couleurYaxisGaucheBis: getVariableCss('--c-ligne-serie-1-bis'),
couleurYaxisDroite: getVariableCss('--c-ligne-serie-2')
});
this.chartPratiquesAgricolesEvolutionNODUnormalise = new ChartLignes('pratiques-agricoles-evolution-nodu-normalise-chart', {
......
import { EtatRapport, Rapport } from './Rapport';
import {
creerDiagnosticVide,
creerHierarchieCommune,
creerHierarchiePays,
creerHierarchieRegion
} from '../../__test__/outils-tests-diagnostic';
import { creerDiagnosticVide, creerHierarchieCommune, creerHierarchiePays, creerHierarchieRegion } from '../../__test__/outils-tests-diagnostic';
import { CategorieTerritoire, Territoire } from '../territoires';
describe('Tests de la classe Rapport', () => {
......
......@@ -3,123 +3,121 @@ import { Diagnostic, IndicateursProduitsPhytosanitaires } from './diagnostics';
import { PreferencesAffichage } from './preferences';
export enum EtatRapport {
INCOMPLET,
PRET,
ERREUR
INCOMPLET,
PRET,
ERREUR
}
export class Rapport {
private etat: EtatRapport = EtatRapport.INCOMPLET;
private hierarchieTerritoires: HierarchieTerritoires | undefined;
private idTerritoireActif: string | undefined;
private diagnostics: Map<string, Diagnostic> = new Map<string, Diagnostic>();
public preferencesAffichage: PreferencesAffichage = new PreferencesAffichage();
getEtat() {
return this.etat;
}
mettreEnErreur() {
this.reinitialiser();
this.etat = EtatRapport.ERREUR;
}
reinitialiser() {
this.hierarchieTerritoires = undefined;
this.idTerritoireActif = undefined;
this.etat = EtatRapport.INCOMPLET;
this.diagnostics.clear();
}
getHierarchieTerritoires(): HierarchieTerritoires | undefined {
return this.hierarchieTerritoires;
}
setHierarchieTerritoires(hierarchieTerritoires: HierarchieTerritoires) {
this.reinitialiser();
this.hierarchieTerritoires = hierarchieTerritoires;
this.idTerritoireActif = this.hierarchieTerritoires.territoirePrincipal.id;
}
getTerritoireActif(): Territoire | undefined {
return this.hierarchieTerritoires?.getListeTerritoires().find((t) => t.id === this.idTerritoireActif);
}
setTerritoireActif(idTerritoireActif: string) {
this.idTerritoireActif = idTerritoireActif;
}
getDiagnosticActif(): Diagnostic | undefined {
if (this.idTerritoireActif === undefined) return undefined;
return this.diagnostics.get(this.idTerritoireActif);
}
getDiagnosticPays(): Diagnostic | undefined {
if (this.hierarchieTerritoires?.pays) {
return this.diagnostics.get(this.hierarchieTerritoires?.pays.id);
} else return undefined;
}
ajouterDiagnostic(diagnostic: Diagnostic) {
if (
!this.hierarchieTerritoires
?.getListeTerritoires()
.map((t) => t.id)
.includes(diagnostic.idTerritoire)
) {
throw new Error(
'Erreur lors de l\'ajout d\'un diagnostic pour le territoire ' +
diagnostic.idTerritoire +
' dans le rapport. Ce territoire ne fait pas partie de la hierarchie de territoires.'
);
private etat: EtatRapport = EtatRapport.INCOMPLET;
private hierarchieTerritoires: HierarchieTerritoires | undefined;
private idTerritoireActif: string | undefined;
private diagnostics: Map<string, Diagnostic> = new Map<string, Diagnostic>();
public preferencesAffichage: PreferencesAffichage = new PreferencesAffichage();
getEtat() {
return this.etat;
}
const territoire = this.hierarchieTerritoires?.getListeTerritoires().find((t) => t.id === diagnostic.idTerritoire);
diagnostic = this.filtrerDonneesPourCommunes(territoire!, diagnostic);
this.diagnostics.set(diagnostic.idTerritoire, diagnostic);
if (this.tousDiagnosticsCharges()) {
this.etat = EtatRapport.PRET;
this.getListeDiagnostics().forEach((d) => d?.setDiagnosticPays(this.getDiagnosticPays()));
mettreEnErreur() {
this.reinitialiser();
this.etat = EtatRapport.ERREUR;
}
}
private filtrerDonneesPourCommunes(territoire: Territoire, diagnostic: Diagnostic) {
if (territoire && territoire.categorie === CategorieTerritoire.Commune) {
const valeursVidesIndicateursMoyenneTriennale = diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursMoyennesTriennales.annees.map(
(a) => null
);
diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursMoyennesTriennales =
new IndicateursProduitsPhytosanitaires(
diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursMoyennesTriennales.annees,
valeursVidesIndicateursMoyenneTriennale,
valeursVidesIndicateursMoyenneTriennale,
valeursVidesIndicateursMoyenneTriennale,
valeursVidesIndicateursMoyenneTriennale
);
const valeursVidesIndicateursBruts = diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursBrutsParAnnees.annees.map(
(a) => null
);
diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursBrutsParAnnees =
new IndicateursProduitsPhytosanitaires(
diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursBrutsParAnnees.annees,
valeursVidesIndicateursBruts,
valeursVidesIndicateursBruts,
valeursVidesIndicateursBruts,
valeursVidesIndicateursBruts);
reinitialiser() {
this.hierarchieTerritoires = undefined;
this.idTerritoireActif = undefined;
this.etat = EtatRapport.INCOMPLET;
this.diagnostics.clear();
}
getHierarchieTerritoires(): HierarchieTerritoires | undefined {
return this.hierarchieTerritoires;
}
setHierarchieTerritoires(hierarchieTerritoires: HierarchieTerritoires) {
this.reinitialiser();
this.hierarchieTerritoires = hierarchieTerritoires;
this.idTerritoireActif = this.hierarchieTerritoires.territoirePrincipal.id;
}
getTerritoireActif(): Territoire | undefined {
return this.hierarchieTerritoires?.getListeTerritoires().find((t) => t.id === this.idTerritoireActif);
}
setTerritoireActif(idTerritoireActif: string) {
this.idTerritoireActif = idTerritoireActif;
}
getDiagnosticActif(): Diagnostic | undefined {
if (this.idTerritoireActif === undefined) return undefined;
return this.diagnostics.get(this.idTerritoireActif);
}
getDiagnosticPays(): Diagnostic | undefined {
if (this.hierarchieTerritoires?.pays) {
return this.diagnostics.get(this.hierarchieTerritoires?.pays.id);
} else return undefined;
}
ajouterDiagnostic(diagnostic: Diagnostic) {
if (
!this.hierarchieTerritoires
?.getListeTerritoires()
.map((t) => t.id)
.includes(diagnostic.idTerritoire)
) {
throw new Error(
"Erreur lors de l'ajout d'un diagnostic pour le territoire " +
diagnostic.idTerritoire +
' dans le rapport. Ce territoire ne fait pas partie de la hierarchie de territoires.'
);
}
const territoire = this.hierarchieTerritoires?.getListeTerritoires().find((t) => t.id === diagnostic.idTerritoire);
diagnostic = this.filtrerDonneesPourCommunes(territoire!, diagnostic);
this.diagnostics.set(diagnostic.idTerritoire, diagnostic);
if (this.tousDiagnosticsCharges()) {
this.etat = EtatRapport.PRET;
this.getListeDiagnostics().forEach((d) => d?.setDiagnosticPays(this.getDiagnosticPays()));
}
}
private filtrerDonneesPourCommunes(territoire: Territoire, diagnostic: Diagnostic) {
if (territoire && territoire.categorie === CategorieTerritoire.Commune) {
const valeursVidesIndicateursMoyenneTriennale =
diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursMoyennesTriennales.annees.map((a) => null);
diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursMoyennesTriennales = new IndicateursProduitsPhytosanitaires(
diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursMoyennesTriennales.annees,
valeursVidesIndicateursMoyenneTriennale,
valeursVidesIndicateursMoyenneTriennale,
valeursVidesIndicateursMoyenneTriennale,
valeursVidesIndicateursMoyenneTriennale
);
const valeursVidesIndicateursBruts = diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursBrutsParAnnees.annees.map(
(a) => null
);
diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursBrutsParAnnees = new IndicateursProduitsPhytosanitaires(
diagnostic.pratiquesAgricoles.produitsPhytosanitaires.indicateursBrutsParAnnees.annees,
valeursVidesIndicateursBruts,
valeursVidesIndicateursBruts,
valeursVidesIndicateursBruts,
valeursVidesIndicateursBruts
);
}
return diagnostic;
}
private tousDiagnosticsCharges() {
return this.hierarchieTerritoires?.getListeTerritoires().every((t) => this.diagnostics.has(t.id));
}
getListeDiagnostics() {
if (this.hierarchieTerritoires) {
return this.hierarchieTerritoires
.getListeTerritoires()
.map((t) => this.diagnostics.get(t.id))
.filter((d) => d !== undefined);
} else return [];
}
return diagnostic;
}
private tousDiagnosticsCharges() {
return this.hierarchieTerritoires?.getListeTerritoires().every((t) => this.diagnostics.has(t.id));
}
getListeDiagnostics() {
if (this.hierarchieTerritoires) {
return this.hierarchieTerritoires
.getListeTerritoires()
.map((t) => this.diagnostics.get(t.id))
.filter((d) => d !== undefined);
} else return [];
}
}
import { IndicateurSynthese } from '../IndicateurSynthese';
import { MessageHvn } from '../MessageHvn';
import {
arrondirANDecimales,
formaterNombreEnEntierString,
formaterNombreEnNDecimalesString
} from '../../../../../commun/base';
import { arrondirANDecimales, formaterNombreEnEntierString, formaterNombreEnNDecimalesString } from '../../../../../commun/base';
import { MessageEvolutionProduitsPhytosanitaires } from './MessageEvolutionProduitsPhytosanitaires';
export class PratiquesAgricoles {
......
......@@ -41,13 +41,7 @@ export class CategorieTerritoire {
'<abbr title="Projet alimentaire territorial">PAT</abbr>',
9
),
Nd: new CategorieTerritoire(
CODE_REGROUPEMENT_COMMUNES,
'NOUVEAU_DEPARTEMENT',
'Nouveau Département',
'<abbr title="Nouveau département">Nouveau département</abbr>',
10
)
Nd: new CategorieTerritoire(CODE_REGROUPEMENT_COMMUNES, 'NOUVEAU_DEPARTEMENT', 'Nouveau Département', 'Nouveau département', 10)
};
static readonly Departement = new CategorieTerritoire('DEPARTEMENT', null, 'Département', 'Département', 11);
static readonly Region = new CategorieTerritoire('REGION', null, 'Région', 'Région', 12);
......
......@@ -49,7 +49,7 @@ export class ChartLignes {
}
public afficher(series: Serie[]) {
const seriesNonVides = series.filter(s => s.data.every(d => d !== null));
const seriesNonVides = series.filter((s) => s.data.every((d) => d !== null));
this.chart.updateSeries(seriesNonVides);
}
}
......@@ -9,6 +9,7 @@ interface OptionsChartLignesDeuxAxesY {
titreYaxisGauche: string;
titreYaxisDroite: string;
couleurYaxisGauche: string;
couleurYaxisGaucheBis: string;
couleurYaxisDroite: string;
}
......@@ -18,7 +19,7 @@ export class ChartLignesDeuxAxesY {
constructor(idDOMRacine: string, optionsGraphique: OptionsChartLignesDeuxAxesY) {
var optionsLocales = {
series: [],
colors: [optionsGraphique.couleurYaxisGauche, optionsGraphique.couleurYaxisGauche, optionsGraphique.couleurYaxisDroite],
colors: [optionsGraphique.couleurYaxisGauche, optionsGraphique.couleurYaxisGaucheBis, optionsGraphique.couleurYaxisDroite],
chart: {
type: 'line',
height: 400,
......@@ -88,7 +89,7 @@ export class ChartLignesDeuxAxesY {
}
public afficher(series: Serie[]) {
const seriesVideesSiNull = series.map(s => s.data.every(d => d === null)?{name: s.name, data:[]}:s);
const seriesVideesSiNull = series.map((s) => (s.data.every((d) => d === null) ? { name: s.name, data: [] } : s));
this.chart.updateSeries(seriesVideesSiNull);
}
}
......@@ -143,6 +143,16 @@
</li>
<li>mise à jour du référentiel des territoires (géographie au 1e janvier 2021 de l'INSEE).</li>
</ul>
<p>Février 2022 :</p>
<ul>
<li>enrichissement du chapitre "Pratiques agricoles" avec des indicateurs sur l'usage des produits phytosanitaires (pesticides) ;
<li>
cartographie de ces résultats dans la page Carte ;
</li>
<li>
ajout de passerelles entre les pages Diagnostic et Carte.
</li>
</ul>
</section>
</main>
<footer id="structure-page__pied-page"></footer>
......
......@@ -99,7 +99,7 @@
<p>Son objectif est double :</p>
<ul>
<li>
d'une part participer la prise de conscience d’un large public (citoyens, élus, etc...) sur les enjeux de résilience
d'une part participer à la prise de conscience d’un large public (citoyens, élus, etc...) sur les enjeux de résilience
alimentaire ;
</li>
<li>
......
This diff is collapsed.
......@@ -48,7 +48,7 @@
<p>Son objectif est double :</p>
<ul>
<li>
d'une part participer la prise de conscience d’un large public (citoyens, élus, etc...) sur les enjeux de résilience
d'une part participer à la prise de conscience d’un large public (citoyens, élus, etc...) sur les enjeux de résilience
alimentaire ;
</li>
<li>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment