Listen to the article
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.
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 `
`;
}
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 ».
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 ».










8 commentaires
Ce projet montre une fois de plus l’importance de la transparence. Les parents ont le droit de savoir.
Absolument, et c’est un premier pas vers une meilleure protection des enfants.
Je suis sceptique sur la méthodologie. Comment peuvent-ils garantir la précision des données à distance ?
Même si la méthodologie n’est pas parfaite, cela donne une tendance inquiétante.
Les scientifiques utilisent des bases de données publiques et des indicateurs reconnus. C’est une première approximation.
Cette carte interactive est une initiative précieuse. Cela permet aux parents de prendre conscience des risques potentiels pour leurs enfants.
Les écoles concernées devraient être prioritaires pour des programmes de sensibilisation.
Tout à fait, mais il faudrait aussi des actions concrètes pour réduire ces expositions.