jeudi, décembre 18

Le Monde, en partenariat avec un collectif pluridisciplinaire de scientifiques, a produit une carte inédite permettant de visualiser l’exposition potentielle des écoles françaises aux pesticides. Selon nos résultats, près d’un établissement sur quatre est soumis à une « pression forte », c’est-à-dire que son environnement proche reçoit au moins un traitement de pesticides à pleine dose par an. Ce travail fait suite à une série d’études robustes sur la surimprégnation des habitants des zones agricoles et sur les risques que présente l’exposition à ces substances chimiques, notamment pour les plus jeunes et les plus sensibles.

Lire notre enquête en détail | Article réservé à nos abonnés Plus de 1,7 million d’écoliers français soumis à une forte « pression pesticides », selon une cartographie inédite

Il repose sur le recensement des parcelles agricoles, des cultures associées, de l’intensité des traitements utilisés ainsi que sur le calcul de la distance entre les cultures et les écoles, à partir d’indicateurs scientifiques et de bases de données publiques exploitables. Cette cartographie d’intérêt public, permettant à chacun de situer son école, vient combler un manque : si le débat sur la pollution de l’air en ville et ses effets sur la santé des enfants émerge, l’information reste peu disponible voire absente lorsqu’il s’agit des expositions possibles aux pesticides en milieu rural et rurbain, a fortiori des enfants.



Protomaps © OpenStreetMap

Vous pouvez signaler une erreur de localisation d’un établissement scolaire en contactant l’adresse aubert+barometre[at]lemonde.fr.
Seules les parcelles bio déclarées pour les aides de la politique agricole commune sont connues et prises en compte.
La carte doit être utilisée comme un outil de repérage et de dialogue, et non comme un diagnostic toxicologique ou sanitaire.

Sources : Le Monde, collectif de scientifiques du « baromètre de la pression pesticides », à partir des données Adonis (Solagro) et BD TOPO (IGN), Rigal et Perrot (2025).

`;
}

async function initMap() {

const data = await d3.csv(« https://assets-decodeurs.lemonde.fr/sheets/do7ejUU8V-98xRlCzWZHrUGqf9vWcg_3831.csv »);
const correspondance = await d3.csv(« https://assets-decodeurs.lemonde.fr/sheets/do7ejUU8V-98xRlCzWZHrUGqf9vWcg_3736.csv »);
const quantiles = await d3.csv(« https://assets-decodeurs.lemonde.fr/sheets/do7ejUU8V-98xRlCzWZHrUGqf9vWcg_3815.csv »);
const scaleIft = d3.scaleThreshold([0.25, 0.5, 1, 3, 5], [« #f7f7f7 », « #e7d4e8 », « #c2a5cf », « #9970ab », « #762a83 », « #40004b »]);
const scaleSeuil = d3.scaleThreshold([1, 2, 3, 4], [« #f2f0f7 », « #cbc9e2 », « #9e9ac8 », « #756bb1 », « #54278f »]);

const quantilesByGroup = quantiles.reduce((acc, row) => {
if (+row.quantile === 100) return acc;

const groupType = row.group_type;
const groupValue = row.group_value;
if (!acc[groupType]) acc[groupType] = {};
if (!acc[groupType][groupValue]) acc[groupType][groupValue] = [];

const value = row.ift_moyen ? +row.ift_moyen.toString().replace(‘,’, ‘.’) : (row.cpe_mean ? +row.cpe_mean.toString().replace(‘,’, ‘.’) : null);
if (value === null) return acc;

acc[groupType][groupValue].push({
quantile: +row.quantile,
value: value
});
return acc;
}, {});

Object.keys(quantilesByGroup).forEach(groupType => {
Object.keys(quantilesByGroup[groupType]).forEach(groupValue => {
quantilesByGroup[groupType][groupValue].sort((a, b) => a.value – b.value);
});
});

function getQuantile(groupType, groupValue, value) {
const quantilesList = quantilesByGroup[groupType]?.[groupValue];
if (!quantilesList || quantilesList.length === 0) return null;

for (let i = quantilesList.length – 1; i >= 0; i–) {
if (value >= quantilesList[i].value) {
return 100 – quantilesList[i].quantile;
}
}
return 100;
}

function createIftGaugeNonLinear(value, maxValue = 17) {
const width = 200;
const height = 20;

const scaleIftDomain = scaleIft.domain();
const scaleIftColors = scaleIft.range();

const thresholds = [0, …scaleIftDomain, maxValue];

function iftToNormalizedPosition(iftValue) {
if (iftValue <= 0) return 0;
if (iftValue >= maxValue) return 1;

for (let i = 0; i < thresholds.length – 1; i++) {
if (iftValue >= thresholds[i] && iftValue < thresholds[i + 1]) {
const segmentStart = thresholds[i];
const segmentEnd = thresholds[i + 1];
const segmentLength = segmentEnd – segmentStart;
const positionInSegment = (iftValue – segmentStart) / segmentLength;

const segmentPosition = i / (thresholds.length – 1);
const segmentWidth = 1 / (thresholds.length – 1);
return segmentPosition + positionInSegment * segmentWidth;
}
}
return 1;
}

function getIftColor(iftValue) {
return scaleIft(iftValue);
}

const normalizedPosition = iftToNormalizedPosition(value);
const cursorPosition = width * normalizedPosition;
const cursorColor = getIftColor(value);

const gradientId = `iftGradient-${Math.random().toString(36).substr(2, 9)}`;

let gradientStops= » »;

gradientStops += ``;

scaleIftDomain.forEach((threshold, index) => {
const offset = ((index + 1) / thresholds.length) * 100;
gradientStops += ``;
});

gradientStops += ``;

return `
${gradientStops}


`;
}

function createBioGaugeLinear(value, maxValue = 100) {
const width = 200;
const height = 20;
const normalizedValue = Math.min(value / maxValue, 1);
const cursorPosition = width * normalizedValue;

const hue = 139 – normalizedValue * 1; // 139 à 0, 138 à 1
const saturation = 45 + normalizedValue * 9; // 45 à 0, 54 à 1
const lightness = 93 – normalizedValue * 51; // 93 à 0, 42 à 1
const cursorColor = `hsl(${Math.round(hue)}, ${Math.round(saturation)}%, ${Math.round(lightness)}%)`;

const gradientId = `bioGradient-${Math.random().toString(36).substr(2, 9)}`;

return `


`;
}

function createCpeGaugeLinear(value, quantile, maxValue = 0.562) {
// 0.562 99th percentile
const width = 200;
const height = 20;
const normalizedValue = Math.min(value / maxValue, 1);
const cursorPosition = width * normalizedValue;

const hue = 60 – normalizedValue * 53;
const cursorColor = `hsl(${Math.round(hue)}, 100%, 70%)`;

const gradientId = `cpeGradient-${Math.random().toString(36).substr(2, 9)}`;

return `


`;
}

let enrichedData = data;

if (enrichedData) {
hideSpinner();

const rpgToLibelle = correspondance.reduce((acc, row) => {
acc[row.code_rpg] = row.libelle_tooltip;
return acc;
}, {});

let tooltip = d3.select(« .ecoles_pesticides__tooltip »);

function fillTooltip({ x, y, object }) {

// document.querySelector(‘canvas’).style.cursor= »pointer »;

if (object === undefined) return;

let content= » »;

if (object) {
content += `

${object[« commune »]}${object[« departement »] !=  » && object[« departement »] != ‘No’ ? `, ${DEPARTMENTS_FR[object[« departement »]]}` :  »}

`;
content += `

${object[« toponyme »] !=  » ? `${object[« toponyme »]} (${object[« nature »].toLowerCase()})` :  »}${object[« toponyme »] ==  » && object[« nature »] !=  » ? object[« nature »] :  »}

`;

if (object[« ift_moyen »] !=  » && object[« ift_moyen »] != ‘0’) {
content += `

`;
}

if (object[« code_rpg_culture_contributrice_max »] !=  » && object[« ift_moyen »] != ‘0’) {
content += `

La zone qui entoure l’établissement est couverte à ${formatNb(+object[« area_ha »].toString().replace(‘,’, ‘.’) / 314 * 100, 0)} % par des surfaces agricoles (${formatNb(+object[« area_ha »].toString().replace(‘,’, ‘.’), 0)} hectares).
La parcelle traitée la plus proche se situe à ${+object[« buffer_min »] <= 500 ? ‘moins de’ : ‘environ’} ${object[« buffer_min »]} mètres de l’établissement.
La culture ${rpgToLibelle[object[« code_rpg_culture_contributrice_max »]]} contribue le plus à la pression totale dans la zone (à hauteur de ${formatNb(+object[« part_contribution_culture_contributrice_max »].toString().replace(‘,’, ‘.’), 0)} %).

`;
}
if (object[« cpe_mean »] !=  » && object[« ift_moyen »] != ‘0’) {
content += `

`;
}

}

// Fill tooltip
tooltip.select(‘.tooltipcontent’).attr(‘aria-label’, ‘Etablissement scolaire’).html(content);

// Display and translate tooltip
if (isMobile) {
tooltip.style(« display », « block »).transition().duration(200).style(« transform », « translate(0, -200px) »);
}
else {
tooltip.style(« display », « block »);
}

if (!isMobile) {
tooltip.style(« transform », `translate(`
+ `calc(-50% + ${x}px),`
+ `calc(-100% + ${y – 6}px))`);
}
}

// Hide tooltip

function onMouseOut() {

// document.querySelector(‘canvas’).style.cursor= »unset »;

if (isMobile) {
tooltip.transition().duration(200)
.style(« transform », « translate(0, 200px) »)
.transition().delay(200)
.style(« display », « none »);
}
else {
tooltip.style(« display », « none »);
}
}

const mapSettings = {
center: [2.7, 46.5],
zoom: isMobile ? 3.9 : 4.4,
minZoom: 1,
maxZoom: 15,
bearing: 0,
pitch: 0,
}

const themeUrl = isDark ? « https://assets-decodeurs.lemonde.fr/decodeurs/assets/protomaps/contrast_daltoniens_darkmode_fr_v0.0.5.json » : « https://assets-decodeurs.lemonde.fr/decodeurs/assets/protomaps/contrast_daltoniens_fr_v0.0.5.json »;

const theme = await d3.json(themeUrl);

const map = new maplibregl.Map({
container: ‘ecoles_pesticides’,
style: {
version: 8,
glyphs: « https://assets-decodeurs.lemonde.fr/decodeurs/assets/protomaps_fonts/{fontstack}/{range}.pbf »,
sources: {
« protomaps »: {
type: « vector »,
maxzoom: 15,
tiles: [« https://prd-protomap.8084.lemonde.io/20240111/{z}/{x}/{y}.mvt »],
},
},
layers: theme
},
center: mapSettings.center,
zoom: mapSettings.zoom,
minZoom: mapSettings.minZoom,
maxZoom: mapSettings.maxZoom,
//pitch: mapSettings.pitch,
//bearing: mapSettings.bearing,
//maxBounds: mapSettings.bounds
});

const deckOverlay = new deck.MapboxOverlay({
onHover: ({ x, y, object }) => {
if (object == undefined) return onMouseOut();
return object && fillTooltip({ x, y, object });
},
pickingRadius: isMobile ? 20 : 8,
});

// Add deck layer
map.addControl(deckOverlay);

let scale = new maplibregl.ScaleControl({
maxWidth: 80,
unit: ‘metric’
});

map.addControl(scale);

// Enable exploration

map.boxZoom.disable();
map.keyboard.disable();
map.doubleClickZoom.disable();
map.touchZoomRotate.disable();
map.dragRotate.disable();
map.touchPitch.disable();
map.scrollZoom.enable();
map.boxZoom.enable();
map.touchZoomRotate.enable();
map.dragPan.enable();

// map.flyTo({
// center: mapSettings.center,
// zoom: mapSettings.zoom + 0.2,
// speed: 0.25,
// curve: 0.2,
// });

map.addControl(new maplibregl.NavigationControl({ showCompass: false }), ‘top-left’);

const layerVisibility = {
primary_all: true,
college_all: false,
lycee_all: false,
primary_top: false,
college_top: false,
lycee_top: false,
primary_seuil: false,
college_seuil: false,
lycee_seuil: false,
};

let currentCategory = « primary »;
let scenario = « all »;

// Update layer
function toggleLayer(categ) {
Object.keys(layerVisibility).forEach((key) => {
layerVisibility[key] = categ == key ? true : false;
});
render();
}

// Watch layer update
document.querySelectorAll(« .lmui-tab.ecoles_pesticides__metric »).forEach(item => {

item.onclick = () => {
scenario = item.getAttribute(« name »);
document.querySelectorAll(« .lmui-tab.ecoles_pesticides__metric »).forEach(item => {
item.classList.remove(« lmui-tab_enabled »);
});
toggleLayer(`${currentCategory}_${scenario}`);
item.classList.add(« lmui-tab_enabled »);

updateLegend();

render();
}
});

// Color scale

let iftColorColumn = « ift_moyen »;
let seuilColumn = « nombre_annees_seuil_depasse »;

const legendDict = {
« 0 »: « nulle »,
« 0.25 »: « très faible »,
« 0.5 »: « faible »,
« 1 »: « modérée »,
« 3 »: « forte »,
« 5 »: « très forte »,
};

const cleanData = data.map(d => {
return {
…d,
« ift_moyen »: +d[« ift_moyen »].replace(‘,’, ‘.’),
}
}).sort((a, b) => [a[iftColorColumn] – b[iftColorColumn]]);

const primaryData = cleanData.filter(d => d[« nature »] == « Enseignement primaire »).sort((a, b) => a[iftColorColumn] – b[iftColorColumn]);
const primaryTopData = […primaryData].sort((a, b) => b[iftColorColumn] – a[iftColorColumn]).slice(0, sliceNumber).sort((a, b) => a[iftColorColumn] – b[iftColorColumn]);
const primarySeuilData = cleanData.filter(d => d[« nature »] == « Enseignement primaire »).sort((a, b) => a[seuilColumn] – b[seuilColumn]);
const collegeData = cleanData.filter(d => d[« nature »] == « Collège »).sort((a, b) => a[iftColorColumn] – b[iftColorColumn]);
const collegeTopData = […collegeData].sort((a, b) => b[iftColorColumn] – a[iftColorColumn]).slice(0, sliceNumber).sort((a, b) => a[iftColorColumn] – b[iftColorColumn]);
const collegeSeuilData = cleanData.filter(d => d[« nature »] == « Collège »).sort((a, b) => a[seuilColumn] – b[seuilColumn]);
const lyceeData = cleanData.filter(d => d[« nature »] == « Lycée »).sort((a, b) => a[iftColorColumn] – b[iftColorColumn]);
const lyceeTopData = […lyceeData].sort((a, b) => b[iftColorColumn] – a[iftColorColumn]).slice(0, sliceNumber).sort((a, b) => a[iftColorColumn] – b[iftColorColumn]);
const lyceeSeuilData = cleanData.filter(d => d[« nature »] == « Lycée »).sort((a, b) => a[seuilColumn] – b[seuilColumn]);

const iftValues = cleanData.map(d => d[iftColorColumn]); // TODO : adapter echelle a categ
const maxIft = Math.max(…iftValues);
const minIft = Math.min(…iftValues);

const hexToRgb = (hex) => {
const [r, g, b] = hex.match(/ww/g).map(hex => parseInt(hex, 16));
return [r, g, b];
}

const colorScale = (value, scenario) => {
const numValue = +value || 0;
if (scenario != « seuil » && numValue == 0) {
return [218, 223, 225];
} else if (scenario != « seuil » && numValue > 0) {
return hexToRgb(scaleIft(numValue));
} else {
return hexToRgb(scaleSeuil(numValue));
}
};

const updateLegend = () => {
const legendTitle = document.querySelector(‘.ecoles_pesticides__legend_title’);
const legendContainer = document.querySelector(‘.ecoles_pesticides__container .lmui-chart__legend’);

if (scenario == « seuil ») {
if (legendTitle) {
legendTitle.textContent = « Nombre d’années où une pression forte est atteinte : »;
}

if (legendContainer) {
legendContainer.innerHTML =  »;

const scaleColors = scaleSeuil.range();
const scaleDomain = scaleSeuil.domain();

for (let i = 0; i < scaleColors.length; i++) {
const legendItem = document.createElement(‘div’);
legendItem.className= »lmui-chart__legend-item »;

const bullet = document.createElement(‘div’);
bullet.className= »lmui-chart__legend-bullet »;
bullet.style.backgroundColor = scaleColors[i];

const label = document.createElement(‘span’);
label.textContent = `${Math.round(scaleDomain[i – 1] || 0)}`;

legendItem.appendChild(bullet);
legendItem.appendChild(label);
legendContainer.appendChild(legendItem);
}
}
} else {

if (legendTitle) {
legendTitle.textContent= »Pression : »;
}

if (legendContainer) {
legendContainer.innerHTML =  »;

/* 0 parcelle */
const legendItem = document.createElement(‘div’);
legendItem.className= »lmui-chart__legend-item »;

const bullet = document.createElement(‘div’);
bullet.className= »lmui-chart__legend-bullet »;
bullet.style.backgroundColor = `rgb(218, 223, 225)`;

const label = document.createElement(‘span’);
label.textContent = `nulle`;

legendItem.appendChild(bullet);
legendItem.appendChild(label);
legendContainer.appendChild(legendItem);

const scaleColors = scaleIft.range();
const scaleDomain = scaleIft.domain();

for (let i = 0; i < scaleColors.length; i++) {
const legendItem = document.createElement(‘div’);
legendItem.className= »lmui-chart__legend-item »;

const bullet = document.createElement(‘div’);
bullet.className= »lmui-chart__legend-bullet »;
bullet.style.backgroundColor = scaleColors[i];

const label = document.createElement(‘span’);
if (scaleDomain[i] === 0.25) {
label.textContent = `très faible`;
}
else if (scaleDomain[i] === 0.5) {
label.textContent = `faible`;
} else if (scaleDomain[i] === 1) {
label.textContent = `modérée`;
} else if (scaleDomain[i] === 3) {
label.textContent = `forte`;
} else if (scaleDomain[i] === 5) {
label.textContent = `très forte`;
} else {
label.textContent = `maximale`;
}

legendItem.appendChild(bullet);
legendItem.appendChild(label);
legendContainer.appendChild(legendItem);
}
}
}
};
updateLegend();

// Render layers
function render() {

const layerPrimary = new deck.ScatterplotLayer({
id: ‘primary’,
data: primaryData,
visible: layerVisibility.primary_all,
stroked: true,
radiusScale: isMobile ? 0.004 : 0.006,
radiusMinPixels: 4,
radiusMaxPixels: 100,
radiusUnits: ‘pixels’,
getPosition: d => [+d.longitude, +d.latitude],
getFillColor: d => {
const value = colorScale(+d[iftColorColumn] || 0, « all »);
return value;
},
getLineColor: d => [0, 0, 0],
transitions: {
getPosition: 600,
getFillColor: {
duration: 300,
easing: d3.easeCubicInOut,
enter: ([r, g, b]) => [r, g, b, 0]
},
radiusScale: {
type: ‘spring’,
stiffness: 0.01,
damping: 0.15
},
},
pickable: true,
autoHighlight: true,
highlightColor: [225, 225, 225, 128],
parameters: {
depthTest: false
},
updateTriggers: {
getFillColor: [iftColorColumn]
},
});

const layerTopPrimary = new deck.ScatterplotLayer({
id: ‘top-primary’,
data: primaryTopData,
visible: layerVisibility.primary_top,
stroked: true,
radiusScale: isMobile ? 0.004 : 0.006,
radiusMinPixels: 4,
radiusMaxPixels: 100,
radiusUnits: ‘pixels’,
getPosition: d => [+d.longitude, +d.latitude],
getFillColor: d => {
const value = colorScale(d[iftColorColumn] || 0, « top »);
return value;
},
getLineColor: d => [0, 0, 0],
pickable: true,
autoHighlight: true,
highlightColor: [225, 225, 225, 128],
parameters: {
depthTest: false
}
});

const layerPrimarySeuil = new deck.ScatterplotLayer({
id: ‘seuil-primary’,
data: primarySeuilData,
visible: layerVisibility.primary_seuil,
stroked: true,
radiusScale: isMobile ? 0.004 : 0.006,
radiusMinPixels: 4,
radiusMaxPixels: 100,
radiusUnits: ‘pixels’,
getPosition: d => [+d.longitude, +d.latitude],
getFillColor: d => {
const value = colorScale(+d[seuilColumn] || 0, « seuil »);
return value;
},
getLineColor: d => [0, 0, 0],
transitions: {
getPosition: 600,
getFillColor: {
duration: 300,
easing: d3.easeCubicInOut,
enter: ([r, g, b]) => [r, g, b, 0]
},
radiusScale: {
type: ‘spring’,
stiffness: 0.01,
damping: 0.15
},
},
pickable: true,
autoHighlight: true,
highlightColor: [225, 225, 225, 128],
parameters: {
depthTest: false
},
updateTriggers: {
getFillColor: [seuilColumn]
},
});

const layerCollege = new deck.ScatterplotLayer({
id: ‘college’,
data: collegeData,
visible: layerVisibility.college_all,
stroked: true,
radiusScale: isMobile ? 0.004 : 0.006,
radiusMinPixels: 4,
radiusMaxPixels: 100,
radiusUnits: ‘pixels’,
getPosition: d => [+d.longitude, +d.latitude],
getFillColor: d => {
const value = colorScale(+d[iftColorColumn] || 0, « all »);
return value;
},
getLineColor: d => [0, 0, 0],
transitions: {
getPosition: 600,
getFillColor: {
duration: 300,
easing: d3.easeCubicInOut,
enter: ([r, g, b]) => [r, g, b, 0]
},
radiusScale: {
type: ‘spring’,
stiffness: 0.01,
damping: 0.15
},
},
pickable: true,
autoHighlight: true,
highlightColor: [225, 225, 225, 128],
parameters: {
depthTest: false
}
});

const layerTopCollege = new deck.ScatterplotLayer({
id: ‘top-college’,
data: collegeTopData,
visible: layerVisibility.college_top,
stroked: true,
radiusScale: isMobile ? 0.004 : 0.006,
radiusMinPixels: 4,
radiusMaxPixels: 100,
radiusUnits: ‘pixels’,
getPosition: d => [+d.longitude, +d.latitude],
getFillColor: d => {
const value = colorScale(d[iftColorColumn] || 0, « top »);
return value;
},
getLineColor: d => [0, 0, 0],
pickable: true,
autoHighlight: true,
highlightColor: [225, 225, 225, 128],
parameters: {
depthTest: false
}
});

const layerCollegeSeuil = new deck.ScatterplotLayer({
id: ‘seuil-college’,
data: collegeSeuilData,
visible: layerVisibility.college_seuil,
stroked: true,
radiusScale: isMobile ? 0.004 : 0.006,
radiusMinPixels: 4,
radiusMaxPixels: 100,
radiusUnits: ‘pixels’,
getPosition: d => [+d.longitude, +d.latitude],
getFillColor: d => {
const value = colorScale(+d[seuilColumn] || 0, « seuil »);
return value;
},
getLineColor: d => [0, 0, 0],
transitions: {
getPosition: 600,
getFillColor: {
duration: 300,
easing: d3.easeCubicInOut,
enter: ([r, g, b]) => [r, g, b, 0]
},
radiusScale: {
type: ‘spring’,
stiffness: 0.01,
damping: 0.15
},
},
pickable: true,
autoHighlight: true,
highlightColor: [225, 225, 225, 128],
parameters: {
depthTest: false
},
updateTriggers: {
getFillColor: [seuilColumn]
},
});

const layerLycee = new deck.ScatterplotLayer({
id: ‘lycee’,
data: lyceeData,
visible: layerVisibility.lycee_all,
stroked: true,
radiusScale: isMobile ? 0.004 : 0.006,
radiusMinPixels: 4,
radiusMaxPixels: 100,
radiusUnits: ‘pixels’,
getPosition: d => [+d.longitude, +d.latitude],
getFillColor: d => {
const value = colorScale(+d[iftColorColumn] || 0, « all »);
return value;
},
getLineColor: d => [0, 0, 0],
transitions: {
getPosition: 600,
getFillColor: {
duration: 300,
easing: d3.easeCubicInOut,
enter: ([r, g, b]) => [r, g, b, 0]
},
radiusScale: {
type: ‘spring’,
stiffness: 0.01,
damping: 0.15
},
},
pickable: true,
autoHighlight: true,
highlightColor: [225, 225, 225, 128],
parameters: {
depthTest: false
}
});

const layerTopLycee = new deck.ScatterplotLayer({
id: ‘top-lycee’,
data: lyceeTopData,
visible: layerVisibility.lycee_top,
stroked: true,
radiusScale: isMobile ? 0.004 : 0.006,
radiusMinPixels: 4,
radiusMaxPixels: 100,
radiusUnits: ‘pixels’,
getPosition: d => [+d.longitude, +d.latitude],
getFillColor: d => {
const value = colorScale(d[iftColorColumn] || 0, « top »);
return value;
},
getLineColor: d => [0, 0, 0],
pickable: true,
autoHighlight: true,
highlightColor: [225, 225, 225, 128],
parameters: {
depthTest: false
}
});

const layerLyceeSeuil = new deck.ScatterplotLayer({
id: ‘seuil-lycee’,
data: lyceeSeuilData,
visible: layerVisibility.lycee_seuil,
stroked: true,
radiusScale: isMobile ? 0.004 : 0.006,
radiusMinPixels: 4,
radiusMaxPixels: 100,
radiusUnits: ‘pixels’,
getPosition: d => [+d.longitude, +d.latitude],
getFillColor: d => {
const value = colorScale(+d[seuilColumn] || 0, « seuil »);
return value;
},
getLineColor: d => [0, 0, 0],
transitions: {
getPosition: 600,
getFillColor: {
duration: 300,
easing: d3.easeCubicInOut,
enter: ([r, g, b]) => [r, g, b, 0]
},
radiusScale: {
type: ‘spring’,
stiffness: 0.01,
damping: 0.15
},
},
pickable: true,
autoHighlight: true,
highlightColor: [225, 225, 225, 128],
parameters: {
depthTest: false
},
updateTriggers: {
getFillColor: [seuilColumn]
},
});

const layers = [
layerPrimary,
layerTopPrimary,
layerPrimarySeuil,
layerCollege,
layerTopCollege,
layerCollegeSeuil,
layerLycee,
layerTopLycee,
layerLyceeSeuil,
];

deckOverlay.setProps({ layers: layers });
}

// Render first view
render();

// Watch flyto

document.querySelectorAll(« .ecoles_pesticides__flytobtn »).forEach(btn => {
btn.onclick = () => {
const place = btn.getAttribute(« data-attr »);
switch (place) {
case ‘reset’:
map.jumpTo({
center: mapSettings.center,
zoom: mapSettings.zoom,
});
break;
case ‘reunion’:
map.jumpTo({
center: [55.558823, -21.109403],
zoom: 8,
});
break;
case ‘guyane’:
map.jumpTo({
center: [-53.141910, 4.113978],
zoom: 6,
});
break;
case ‘antilles’:
map.jumpTo({
center: [-61.235294, 15.125274],
zoom: 6.5,
});
break;
case ‘mayotte’:
map.jumpTo({
center: [45.150284, -12.800424],
zoom: 9,
});
break;
default:
map.jumpTo({
center: mapSettings.center,
zoom: mapSettings.zoom,
});
break;
}
}
});

/* AUTOCOMPLETE*/

let max_n_to_display = 6;
let min_char_to_search = 3;
let format_to_search = slugify;
let no_results_message= « Aucun établissement trouvé avec cette recherche »;

const reset_func = () => {console.log(« reset »)};
const func_to_treat_result_donnees = (result) => {
map.flyTo({
center: [result.longitude, result.latitude],
zoom: 15,
});

if (isMobile) {
fillTooltip({ x: 0, y: 0, object: result });
document.querySelector(« .ecoles_pesticides__container .tooltipcross »).onclick = () => {
onMouseOut();
}
}

};
const get_text_in_data = (x) => `${x.toponyme} ${x.commune} (${x.departement})`;
autocomplete_decodeurs(

// L’id du lmui-search
« ecoles-pesticides-search »,

// Les données dans lesquelles chercher
primaryData,

// Une fonction qui s’execute quand on sélectionne un item, elle prend en argument
// l’objet sélectionné
func_to_treat_result_donnees,

// Une fonction qui s’execute quand on désélectionne / reset
reset_func,

// Une fonction qui sélectionne le texte à chercher dans le tableau (optionnel si vos données
// ne sont que du texte)
get_text_in_data,

// Nombre de choix dans le autocomplete, par défaut 5
max_n_to_display,

// Nombre de lettres avant le déclenchement de l’autocomplete, par défaut 3
min_char_to_search,

// Une fonction qui normalise les input pour la recherche, par défaut slugify, c’est à dire que la casse
// et les accents sont ignorés
format_to_search,

// Texte à afficher si aucun resultat, par défaut « Aucun résultat avec cette recherche »
no_results_message
)

// Watch category update
document.querySelectorAll(« .ecoles_pesticides__container .lmui-select »).forEach(item => {
item.addEventListener(« input », (e) => {
currentCategory = e.target.value;
toggleLayer(`${currentCategory}_${scenario}`);
let dataAutocomplete = currentCategory == « primary » ? primaryData : currentCategory == « college » ? collegeData : lyceeData;

autocomplete_decodeurs(

// L’id du lmui-search
« ecoles-pesticides-search »,

// Les données dans lesquelles chercher
dataAutocomplete,

// Une fonction qui s’execute quand on sélectionne un item, elle prend en argument
// l’objet sélectionné
func_to_treat_result_donnees,

// Une fonction qui s’execute quand on désélectionne / reset
reset_func,

// Une fonction qui sélectionne le texte à chercher dans le tableau (optionnel si vos données
// ne sont que du texte)
get_text_in_data,

// Nombre de choix dans le autocomplete, par défaut 5
max_n_to_display,

// Nombre de lettres avant le déclenchement de l’autocomplete, par défaut 3
min_char_to_search,

// Une fonction qui normalise les input pour la recherche, par défaut slugify, c’est à dire que la casse
// et les accents sont ignorés
format_to_search,

// Texte à afficher si aucun resultat, par défaut « Aucun résultat avec cette recherche »
no_results_message
)
});
});
}
}

// const INIT_DELAY = 2000; // 2 secondes
document.addEventListener(« DOMContentLoaded », () => {
fillHtml();
initMap();
// setTimeout(() => {
// initMap();
// }, INIT_DELAY);
});
window.onresize = () => {
isMobile = document.querySelector(« .ecoles_pesticides__container »).offsetWidth <= 600 ? true : false;
}

}

initViz();

Concrètement, que nous montre cette carte ?

Cette carte désigne une « pression pesticide » autour des établissements scolaires, c’est-à-dire l’intensité estimée des usages agricoles à proximité. « La carte ne doit pas être interprétée comme un indicateur de risque, précisent les experts du Joint Research Centre de la Commission européenne associés au projet. Il s’agit d’un outil servant à repérer les établissements situés dans des contextes de pratiques agricoles plus ou moins intensives », afin d’objectiver des situations locales, d’alimenter le dialogue et, le cas échéant, de mettre en place des mesures de précaution.

Ce baromètre est construit à partir du registre parcellaire graphique et de l’indice de fréquence de traitement (IFT) associé aux cultures présentes dans un rayon de 1 000 mètres autour de chaque école. Les établissements sont géolocalisés grâce à la base de données BD TOPO de l’IGN.

Pour compléter la lecture de la carte, des indicateurs sont disponibles pour chaque école consultée :

  • la part de surfaces cultivées en bio dans le périmètre ;

  • la distance entre l’école et la première parcelle traitée ;

  • la culture qui contribue le plus à la « pression pesticide » autour de l’école ;

  • l’exposition de l’ensemble de la commune aux pesticides les plus dangereux sur la période (ces données ne sont pas extrapolables à l’échelle d’un établissement).

La méthodologie complète du baromètre est disponible en ligne.

Pourquoi s’intéresser aux écoles en particulier ?

Les écoles sont, après le domicile, les lieux où les enfants passent le plus de temps, souvent à l’extérieur, dans les cours de récréation. Or, les enfants constituent un public particulièrement sensible aux pesticides, comme le montrent plusieurs études. PestiRiv, une étude de Santé publique France et de l’Agence nationale de sécurité sanitaire de l’alimentation, de l’environnement et du travail (Anses) destinée à connaître l’exposition aux pesticides des personnes vivant près de vignes, a mis en évidence une surimprégnation chez les plus jeunes résidents de zones viticoles. Et leurs conclusions sont « extrapolables à d’autres cultures car les résultats concernent également des substances non exclusives du traitement de la vigne », précisent ses auteurs. Les établissements scolaires sont par ailleurs déjà reconnus comme des sites sensibles dans la réglementation, mais avec des protections jugées faibles ou trop hétérogènes.

Enfin, « les communes ont la responsabilité des écoles, de l’urbanisme et du dialogue avec le monde agricole », rappelle Adrien Guetté, maître de conférences en géographie de l’environnement à l’université de Tours. Selon lui, « il serait légitime que les candidats et candidates aux élections municipales s’engagent publiquement sur ce qu’ils comptent faire pour réduire la pression des pesticides autour des établissements scolaires ».

Pourquoi avoir choisi un rayon de 1 000 mètres autour des écoles ?

C’est la distance couramment utilisée dans les études scientifiques. Il est établi que certains pesticides, très volatils et pourtant très utilisés, comme le prosulfocarbe, un herbicide d’hiver, peuvent voyager bien au-delà d’un kilomètre de leur lieu d’application.

Ce rayon est notamment employé dans les travaux épidémiologiques de Géocap-Agri, un programme de recherche de l’Institut national de la santé et de la recherche médicale (Inserm) qui a mis en évidence un lien entre la densité de vignes autour du domicile et le risque de leucémie aiguë lymphoblastique chez l’enfant. A noter que notre carte renseigne aussi sur une estimation de la distance entre l’école et la première parcelle traitée : de manière générale, plus les établissements sont éloignés des champs, plus la surface agricole et la pression dans le rayon sont faibles.

L’école de mon enfant est sous forte pression : dois-je m’inquiéter ?

Pour les écoles classées en pression forte et plus, « la première étape est de mieux comprendre la réalité locale : quels types de produits sont utilisés, à quelles distances, avec quels aménagements de protection éventuels ?, suggère le géographe Adrien Guetté. Si, à l’issue de ce travail d’information, le risque d’exposition apparaît significatif, il est alors légitime que la communauté éducative demande à la collectivité d’agir ».

Le Monde

Soutenez une rédaction de 550 journalistes

Accédez à tous nos contenus en illimité à partir de 7,99 €/mois pendant 1 an.

S’abonner

Suivez-nous sur WhatsApp

Restez informés

Retrouvez la sélection de la rédaction sur notre chaîne

Rejoindre

Actualités du Monde

Ne manquez pas les informations qui vous intéressent

Recevez les nouveautés éditoriales et avantages exclusifs proposés par « Le Monde »

Recevoir les communications

Newsletter

« A la une »

Chaque matin, parcourez l’essentiel de l’actualité du jour avec les derniers titres du « Monde »

S’inscrire

Le Monde Mémorable

Testez votre culture générale avec la rédaction du « Monde »

Testez votre culture générale avec la rédaction du « Monde »

Découvrir

Newsletter

« La revue du Monde »

Chaque week-end, la rédaction sélectionne les articles de la semaine qu’il ne fallait pas manquer

S’inscrire

Les parents d’élèves d’écoles sous forte pression « doivent se mobiliser, demander des informations complémentaires et des actions, mais sans tomber dans la panique ni la stigmatisation des agriculteurs, qui ont eux aussi besoin d’accompagnement pour faire évoluer leurs pratiques », recommande Karine Princé, écologue au Muséum national d’histoire naturelle.

Quels sont les risques des pesticides pour la santé des enfants ?

Rappelons d’abord que cette carte est un outil de repérage, pas une évaluation des risques sanitaires. Elle renseigne sur l’intensité des usages agricoles de proximité, mais pas sur la dangerosité des substances, ni sur l’exposition réelle des enfants.

L’Inserm établit une présomption forte de liens entre l’exposition précoce aux pesticides et les risques de contracter certains cancers (leucémies, tumeur du système nerveux central), ou des troubles du développement neuropsychologique. Si le risque est supérieur pour les résidents des zones agricoles, Matthieu Mancini, docteur en épidémiologie, précise que « tous les enfants de ces écoles ne développeront pas ces pathologies », et que « ces pathologies existent aussi chez des enfants scolarisés dans des écoles non exposées ».

Sait-on quels produits sont utilisés près des écoles ?

Pas précisément. Les cahiers d’épandage ne sont pas publics, ce qui empêche d’identifier les molécules utilisées. L’Anses soulignait, lors de la parution des résultats de PestiRiv, la nécessité de disposer de données réelles d’utilisation des produits phytosanitaires.

Notre baromètre renseigne sur l’intensité des traitements, pas sur la nature exacte des produits. Pour donner des informations contextuelles sur la dangerosité des produits présents dans l’environnement, Le Monde affiche « l’exposition combinée aux pesticides », un indicateur complémentaire qui renseigne sur l’exposition aux pesticides les plus dangereux sur la période, construit à partir des données de ventes de pesticides et de mesures effectuées dans l’air et dans l’eau. Attention, cette donnée n’étant disponible qu’à l’échelle de la commune, elle ne renseigne pas sur l’exposition précise de l’école.

Que peut-on faire pour faire baisser la pression ?

Il n’existe pas de solution unique, mais plusieurs leviers complémentaires. A court terme, le dialogue local est central : échanges entre parents d’élèves, collectivités et agriculteurs, information en amont des traitements, adaptation des horaires ou des matériels pour limiter la dérive des pulvérisations hors des champs (sous l’effet du vent par exemple).

A moyen terme, les experts recommandent de réduire l’usage de pesticides à proximité des écoles, d’élargir les zones non traitées et d’accompagner les changements de pratiques agricoles (agriculture biologique, diversification des cultures, plantation de haies, délimitation de bandes enherbées). Les collectivités peuvent aussi orienter les usages du foncier (obligations ou baux environnementaux), agir sur les plans locaux d’urbanisme et passer par des mécanismes d’indemnisation aux agriculteurs pour services environnementaux. L’organisme d’études Plante & Cité a recensé plusieurs leviers applicables aux écoles dans un guide à destination des collectivités.

L’agriculture biologique peut-elle faire monter la pression ?

Cette idée contre-intuitive est répandue, notamment chez les agriculteurs, car certaines cultures nécessitent des applications plus régulières si elles sont cultivées avec des produits compatibles avec l’agriculture biologique. Mais elle est inexacte. « L’indice de fréquence de traitement ne mesure pas juste le nombre de passages au champ, mais le nombre de passages à pleine dose, explique Aurélien Chayre, ingénieur agronome à Solagro. En vigne bio, il peut y avoir plus de passages de pulvérisateur, mais à des doses plus faibles et avec moins de produits dangereux. » En effet, le bio autorise beaucoup moins de molécules – quelques dizaines, contre plus de 250 en agriculture conventionnelle. « Cette différence est importante car la dangerosité ne vient pas seulement des substances individuelles, mais aussi de l’effet cocktail, lié au nombre élevé de molécules utilisées en conventionnel », souligne Aurélien Chayre.

En outre, dans l’agriculture bio, « seules certaines cultures comme la vigne, les fruits et les légumes, sont traitées, poursuit M. Chayre, et elles le sont environ deux fois moins qu’en conventionnel. » Pour ces cultures, « l’IFT est donc nettement plus faible, tandis qu’une grande partie des surfaces en grandes cultures ne reçoit aucun traitement ».

Coordonné par Le Monde, le baromètre de la « pression pesticides » autour des établissements scolaires est le fruit d’une collaboration de plusieurs mois avec un collectif pluridisciplinaire, constitué d’une dizaine d’experts, parmi lesquels Adrien Guetté (maître de conférences en géographie de l’environnement à l’université de Tours), Aurélien Chayre (ingénieur agronome à Solagro), Colin Fontaine (chargé de recherche CNRS – Centre d’écologie et des sciences de la conservation), Matthieu Mancini (docteur en épidémiologie, ingénieur bio-informaticien), Benjamin Nowak (maître de conférences en agronomie à VetAgro Sup – UMR Territoires), Karine Princé (chargée de recherche au Centre d’écologie et des sciences de la conservation), Stanislas Rigal (chargé de recherche à la Fondation pour la recherche sur la biodiversité), et des scientifiques du Joint Research Centre de la Commission européenne. La méthodologie et les données issues de nos analyses sont publiques et consultables en ligne.
Share.
Exit mobile version