{"id":13489,"date":"2025-10-23T14:25:03","date_gmt":"2025-10-23T14:25:03","guid":{"rendered":"https:\/\/coeurdefrance.gestion-idweb.fr\/?page_id=13489"},"modified":"2025-12-17T14:19:53","modified_gmt":"2025-12-17T14:19:53","slug":"drinking-water","status":"publish","type":"page","link":"https:\/\/cc-coeurdefrance.fr\/en\/rubrique\/eau-assainissement\/eau-potable\/","title":{"rendered":"Drinking water"},"content":{"rendered":"\n<p>Le captage, le traitement et la distribution de l\u2019eau potable eau sont aujourd\u2019hui assur\u00e9s par 6 syndicats d\u2019eau pr\u00e9sents sur le territoire de C\u0153ur de France, \u00e0 savoir\u00a0:<\/p>\n\n\n\n<style>\n.idweb-wrap {\n    height: 90vh;\n    border: 1px solid #e6ece9;\n    border-radius: 12px;\n    overflow: hidden;\n    position: relative;\n}\n.idweb-tooltip {\n    overflow-y:auto;\n    max-height:85vh;\n    position:absolute;\n    top:15vh;\n    left:10px;\n    background:rgba(255,255,255,0.9);\n    padding:2%;\n    border-radius:8px;\n    box-shadow:0 2px 6px rgba(0,0,0,.15);\n    z-index:999;\n    max-width:450px;\n    font-size:1.2rem;\n    color:#333;\n}\n.idweb-tooltip ul{margin:.5rem 0;padding-left:1rem;}\n.idweb-tooltip li{margin-bottom:.25rem;line-height:1.3;list-style:none;}\n.idweb-tooltip li::before { \n    content: \"\";\n    border-color: transparent #fba531;\n    border-style: solid;\n    border-width: 0.35em 0 0.35em 0.45em;\n    display: block;\n    height: 0;\n    width: 0;\n    left: -1em;\n    top: 0.9em;\n    position: relative;\n}\n<\/style>\n\n<div class=\"idweb-wrap\">\n    <div id=\"idweb-map-syndicats\" style=\"height:100%;\"><\/div>\n    <div class=\"idweb-tooltip\" id=\"idweb-info-syndicats\">Chargement de la carte\u2026<\/div>\n<\/div>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', () => {\n\n    const map = L.map('idweb-map-syndicats').setView([46.70, 2.50], 10);\n\n\n\n    L.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/light_all\/{z}\/{x}\/{y}{r}.png', {\n        attribution:'&copy; OpenStreetMap | &copy; CartoDB'\n    }).addTo(map);\n\n    const tooltip = document.getElementById('idweb-info-syndicats');\n    tooltip.dataset.locked = 'false';\n\n    const urlSyndicats =\n      'https:\/\/opendata.cc-coeurdefrance.fr\/api\/explore\/v2.1\/catalog\/datasets\/liste-des-syndicats-des-eaux\/records?limit=100&timezone=UTC';\n\n    \/\/ \ud83d\udd39 Listes venant du PHP\n    const communesMembres = [\"Vernais\",\"Saint-Pierre-les-\\u00c9tieux\",\"Saint-Amand-Montrond\",\"Orval\",\"Orcenais\",\"Nozi\\u00e8res\",\"Meillant\",\"Mar\\u00e7ais\",\"La Groutte\",\"La Celle\",\"Farges-Allichamps\",\"Drevant\",\"Coust\",\"Colombiers\",\"Charenton-du-Cher\",\"Bru\\u00e8re-Allichamps\",\"Bouzais\",\"Bessais-le-Fromental\",\"Arpheuilles\"];\n\n    \/\/ \ud83d\udd39 Layers\n    const layerPins        = L.layerGroup().addTo(map);\n    const layerContoursCC  = L.featureGroup().addTo(map); \/\/ contour g\u00e9n\u00e9ral vert\n    const layerCommunes    = L.featureGroup().addTo(map); \/\/ contours des communes (orange)\n    const layersBySyndicat = {}; \/\/ remplissage par syndicat\n\n    let syndicats = [];\n    const geomByCommune = {}; \/\/ cl\u00e9 = nom normalis\u00e9 -> contour GeoJSON\n\n    \/\/ --- Couleurs par syndicat (pour le remplissage)\n    const SYNDICAT_COLORS = {\n        \"SIAEP FONTAINE ST CLAIR\": \"#FF6B6B\",\n        \"SIAEP VALLEE DE GERMIGNY\": \"#4ECDC4\",\n        \"SIAEP DE DREVANT\": \"#FFA552\",\n        \"SIAEP DU CHARENTON DU CHER\": \"#4D7CFE\",\n        \"SIAEP BOISCHAUT MARCHE BOISCHAUT\": \"#7BC47F\",\n        \"SIVU STAMAND ORVAL\": \"#9A6AFF\"\n    };\n\n    \/\/ --- Icone orange FF5F00 (pins)\n    const orangeIcon = L.icon({\n        iconUrl: 'data:image\/svg+xml;utf8,' +\n        `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"42\" height=\"42\" viewBox=\"0 0 42 42\">\n            <path fill=\"%23FF5F00\" d=\"M21 0C12 0 5 7 5 16c0 12 16 26 16 26s16-14 16-26C37 7 30 0 21 0z\"\/>\n            <circle cx=\"21\" cy=\"16\" r=\"7\" fill=\"white\"\/>\n        <\/svg>`,\n        iconSize: [42, 42],\n        iconAnchor: [21, 42],\n        popupAnchor: [0, -40]\n    });\n\n    \/\/ --- Helpers normalisation + Levenshtein (comme VOIRIES)\n    function normalizeName(s) {\n        return (s || '')\n          .normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\")\n          .toLowerCase()\n          .replace(\/[-\u2019']\/g, \" \")\n          .replace(\/\\s+\/g, \" \")\n          .trim();\n    }\n\n    function levenshtein(a, b) {\n        if (a === b) return 0;\n        const m = [];\n        for (let i = 0; i <= b.length; i++) m[i] = [i];\n        for (let j = 0; j <= a.length; j++) m[0][j] = j;\n        for (let i = 1; i <= b.length; i++) {\n            for (let j = 1; j <= a.length; j++) {\n                m[i][j] = Math.min(\n                    m[i-1][j] + 1,\n                    m[i][j-1] + 1,\n                    m[i-1][j-1] + (b.charAt(i-1) === a.charAt(j-1) ? 0 : 1)\n                );\n            }\n        }\n        return m[b.length][a.length];\n    }\n\n    function bestMatch(res, targetName) {\n        const target = normalizeName(targetName);\n\n        let filtered = res.filter(c => c.codeDepartement === \"18\");\n        if (filtered.length === 0) filtered = res;\n\n        let strict = filtered.find(c => normalizeName(c.nom) === target);\n        if (strict) return strict;\n\n        let best = null;\n        let score = Infinity;\n        filtered.forEach(c => {\n            const s = levenshtein(normalizeName(c.nom), target);\n            if (s < score) { score = s; best = c; }\n        });\n        return best;\n    }\n\n    \/\/ \ud83d\udd39 Charger d'abord TOUS les contours des communes membres\n    async function chargerContoursCommunesMembres() {\n        const promises = communesMembres.map(async (nom) => {\n            const url = `https:\/\/geo.api.gouv.fr\/communes?nom=${encodeURIComponent(nom)}&fields=code,nom,contour,codeDepartement&limit=10`;\n            try {\n                const r   = await fetch(url);\n                const res = await r.json();\n                if (!Array.isArray(res) || res.length === 0) return;\n\n                const best = bestMatch(res, nom);\n                if (!best || !best.contour) return;\n\n                const key = normalizeName(best.nom);\n                geomByCommune[key] = best.contour;\n\n                \/\/ \ud83d\udd39 Polygone vert (contour global CC, l\u00e9g\u00e8rement plus gras, en dessous)\n                L.geoJSON(best.contour, {\n                    style: {\n                        color: \"#3c8054\",\n                        weight: 3,\n                        fillOpacity: 0\n                    }\n                }).addTo(layerContoursCC);\n\n                \/\/ \ud83d\udd39 Polygone orange (contour de chaque commune)\n                L.geoJSON(best.contour, {\n                    style: {\n                        color: \"#fba531\",\n                        weight: 1.5,\n                        fillOpacity: 0\n                    }\n                }).addTo(layerCommunes);\n\n            } catch (e) {\n                console.warn(\"Erreur commune membre :\", nom, e);\n            }\n        });\n\n        await Promise.all(promises);\n\n        if (layerCommunes.getLayers().length > 0) {\n            map.fitBounds(layerCommunes.getBounds(), { padding: [40, 40] });\n        }\n    }\n\n    \/\/ \ud83d\udd39 Charger les syndicats ensuite\n    async function chargerSyndicats() {\n        const r = await fetch(urlSyndicats);\n        const data = await r.json();\n        syndicats = data.results || [];\n        afficherSyndicats();\n        tooltip.innerHTML = \"Survolez un syndicat pour afficher les d\u00e9tails\u2026\";\n    }\n\nfunction htmlSyndicat(s) {\n\n    \/\/ Normalisation de la liste affich\u00e9e\n    const communesFull = s.communes_distribuees_par_le_syndicat\n        ? s.communes_distribuees_par_le_syndicat.split(\",\").map(c => c.trim())\n        : [];\n\n    const communesFullHTML = communesFull.length\n        ? communesFull.join(\", \")\n        : \"-\";\n\n    \/\/ Communes de la CC uniquement\n    const communesCC = s.communes_distribuees_sur_le_territoire_coeur_de_france\n        ? s.communes_distribuees_sur_le_territoire_coeur_de_france.split(\",\").map(c => c.trim())\n        : [];\n\n    const communesCCHTML = communesCC.length\n        ? communesCC.join(\", \")\n        : \"-\";\n\n    return `\n        <strong>${s.nom_du_syndicat || \"Syndicat inconnu\"}<\/strong>\n        <hr>\n\n        <ul>\n            <li><b>Commune du si\u00e8ge :<\/b> ${s.commune_siege || \"-\"}<\/li>\n            <li><b>Adresse :<\/b> ${s.adresse_siege || \"-\"}<\/li>\n            <li><b>Code postal :<\/b> ${s.code_postal_siege || \"-\"}<\/li>\n            <li><b>T\u00e9l\u00e9phone :<\/b> ${s.telephone || \"-\"}<\/li>\n\n            <li><b>Communes distribu\u00e9es (CC C\u0153ur de France) :<\/b><br>\n                ${communesCCHTML}\n            <\/li>\n\n            <li><b>Toutes les communes distribu\u00e9es par le syndicat :<\/b><br>\n                ${communesFullHTML}\n            <\/li>\n        <\/ul>\n    `;\n}\n\n\n    function masquerToutesZones() {\n        Object.values(layersBySyndicat).forEach(group => {\n            group.eachLayer(layer => {\n                layer.setStyle({ fillOpacity: 0 });\n            });\n        });\n    }\n\n    function afficherZoneSyndicat(name) {\n        masquerToutesZones();\n        if (layersBySyndicat[name]) {\n            layersBySyndicat[name].eachLayer(layer => {\n                layer.setStyle({ fillOpacity: 0.45 });\n            });\n        }\n    }\n\n    function chargerCommunesDistribuees(s, syndicatName) {\n        const communesStr = s.communes_distribuees_sur_le_territoire_coeur_de_france;\n        if (!communesStr) return;\n\n        const communes = communesStr.split(\",\").map(c => c.trim()).filter(Boolean);\n\n\n        communes.forEach(nomCommune => {\n            const key = normalizeName(nomCommune);\n\n            \/\/ 1\ufe0f\u20e3 Si on a d\u00e9j\u00e0 le contour de la commune dans geomByCommune\nif (geomByCommune[key]) {\n\n    const poly = L.geoJSON(geomByCommune[key], {\n        style: {\n            color: \"#fba531\",\n            weight: 1.5,\n            fillColor: SYNDICAT_COLORS[syndicatName] || \"#888\",\n            fillOpacity: 0,\n            fill: true\n        },\n        interactive: true\n    });\n\n    \/\/ Associer polygone \u2194 syndicat\n    poly.syndicat = syndicatName;\n    poly.data = s;\n\n    \/\/ Survol = affiche panneau + montre la zone du syndicat\n    poly.on(\"mouseover\", () => {\n        if (tooltip.dataset.locked === \"true\") return;\n        tooltip.innerHTML = htmlSyndicat(s);\n        afficherZoneSyndicat(syndicatName);\n    });\n\n    \/\/ Clic = verrouille \/ d\u00e9verrouille\n    poly.on(\"click\", () => {\n        if (tooltip.dataset.locked === \"true\") {\n            tooltip.dataset.locked = \"false\";\n            tooltip.innerHTML = \"Survolez un syndicat pour afficher les d\u00e9tails\u2026\";\n            masquerToutesZones();\n        } else {\n            tooltip.dataset.locked = \"true\";\n            tooltip.innerHTML =\n                htmlSyndicat(s) +\n                `<p><em>(Cliquez \u00e0 nouveau pour d\u00e9verrouiller)<\/em><\/p>`;\n            afficherZoneSyndicat(syndicatName);\n        }\n    });\n\n    layersBySyndicat[syndicatName].addLayer(poly);\n    return;\n}\n\n\n            \/\/ 2\ufe0f\u20e3 Sinon, on va chercher la commune (hors CC) via l'API\nconst url = `https:\/\/geo.api.gouv.fr\/communes?nom=${encodeURIComponent(nomCommune)}&fields=contour,nom,codeDepartement&limit=10`;\n\nfetch(url)\n    .then(r => r.json())\n    .then(res => {\n        if (!Array.isArray(res) || res.length === 0 || !res[0].contour) return;\n\nconst poly = L.geoJSON(res[0].contour, {\n    style: {\n        color: \"#fba531\",\n        weight: 1.5,\n        fillColor: SYNDICAT_COLORS[syndicatName] || \"#888\",\n        fillOpacity: 0,\n        fill: true     \/\/ \u2190 indispensable\n    },\n    interactive: true  \/\/ \u2190 indispensable\n});\n\n\n        \/\/ \u27a4 Associer polygone \u2194 syndicat\n        poly.syndicat = syndicatName;\n        poly.data = s;\n\n        \/\/ \u27a4 Survol = affiche panneau + montre la zone du syndicat\n        poly.on(\"mouseover\", () => {\n            if (tooltip.dataset.locked === \"true\") return;\n            tooltip.innerHTML = htmlSyndicat(s);\n            afficherZoneSyndicat(syndicatName);\n        });\n\n        \/\/ \u27a4 Clic = verrouille \/ d\u00e9verrouille\n        poly.on(\"click\", () => {\n            if (tooltip.dataset.locked === \"true\") {\n                tooltip.dataset.locked = \"false\";\n                tooltip.innerHTML = \"Survolez un syndicat pour afficher les d\u00e9tails\u2026\";\n                masquerToutesZones();\n            } else {\n                tooltip.dataset.locked = \"true\";\n                tooltip.innerHTML =\n                    htmlSyndicat(s) +\n                    `<p><em>(Cliquez \u00e0 nouveau pour d\u00e9verrouiller)<\/em><\/p>`;\n                afficherZoneSyndicat(syndicatName);\n            }\n        });\n\n        \/\/ \u27a4 Ajouter au layer du syndicat\n        layersBySyndicat[syndicatName].addLayer(poly);\n\n        \/\/ \u27a4 Et surtout, afficher le polygone sur la carte\n        poly.addTo(map);\n    })\n    .catch(err => console.warn(\"Erreur commune distribu\u00e9e :\", nomCommune, err));\n\n        });\n    }\n\n    function afficherSyndicats() {\n        layerPins.clearLayers();\n\n        syndicats.forEach(s => {\n            const lat = s.geopoint?.lat || parseFloat(s.latitude);\n            const lon = s.geopoint?.lon || parseFloat(s.longitude);\n\n            if (!lat || !lon) {\n                console.warn(\"Pas de g\u00e9olocalisation pour :\", s.nom_du_syndicat);\n                return;\n            }\n\n            const syndicatName = s.nom_du_syndicat || \"unknown\";\n\n            if (!layersBySyndicat[syndicatName]) {\n                layersBySyndicat[syndicatName] = L.layerGroup().addTo(map);\n            }\n\n            \/\/ Charger les communes distribu\u00e9es (remplissage color\u00e9)\n            chargerCommunesDistribuees(s, syndicatName);\n\n            const marker = L.marker([lat, lon], {\n                icon: orangeIcon\n            }).addTo(layerPins);\n\n\n\n            marker.on(\"click\", () => {\n                if (tooltip.dataset.locked === \"true\") {\n                    tooltip.dataset.locked = \"false\";\n                    tooltip.innerHTML = \"Survolez un syndicat pour afficher les d\u00e9tails\u2026\";\n                    masquerToutesZones();\n                } else {\n                    tooltip.dataset.locked = \"true\";\n                    tooltip.innerHTML =\n                        htmlSyndicat(s) +\n                        `<p><em>(Cliquez \u00e0 nouveau pour d\u00e9verrouiller)<\/em><\/p>`;\n                    afficherZoneSyndicat(syndicatName);\n                }\n            });\n        });\n    }\n\n    \/\/ \ud83d\udd39 S\u00e9quence de chargement : d'abord CC, puis syndicats\n    (async () => {\n        tooltip.innerHTML = \"Chargement des communes de la communaut\u00e9\u2026\";\n        await chargerContoursCommunesMembres();\n\n        tooltip.innerHTML = \"Chargement des syndicats des eaux\u2026\";\n        await chargerSyndicats();\n    })();\n\n});\n<\/script>\n\n\n\n\n\n<ul class=\"wp-block-list\">\n<li>Le SIAEP de la Fontaine Saint-Clair, pour les communes de Farges-Allichamps, Bru\u00e8re-Allichamps, La Celle, Meillant et Arpheuilles.<\/li>\n\n\n\n<li>Le SIAEP de Charenton-du-Cher, pour les communes de Coust, Saint-Pierre-les-Etieux, et Charenton-du-Cher.<\/li>\n\n\n\n<li>Le SIAEP de Drevant, pour les communes de Colombiers, Drevant, Bouzais, La Groutte.<\/li>\n\n\n\n<li>Le SIVU de Saint-Amand-Montrond \/ Orval.<\/li>\n\n\n\n<li>Le SIAEP de la Vall\u00e9e de Germigny, pour les communes de Bessais-le-Fromental et Vernais.<\/li>\n\n\n\n<li>Le SIAEP Marche \/ Boischaut pour les communes de Nozi\u00e8res, Orcenais et Mar\u00e7ais.<\/li>\n<\/ul>\n\n\n\n<p>Ces syndicats assurent leur comp\u00e9tence par d\u00e9l\u00e9gation de service public \u00e0 des soci\u00e9t\u00e9s priv\u00e9es (Veolia Eau, SAUR).<\/p>\n\n\n\n<p>Vous pouvez acc\u00e9der au site internet de <a href=\"https:\/\/www.eau.veolia.fr\/\" data-type=\"link\" data-id=\"https:\/\/www.eau.veolia.fr\/\">V\u00e9olia ici<\/a> et au site internet de <a href=\"https:\/\/www.saurclient.fr\/\" data-type=\"link\" data-id=\"https:\/\/www.saurclient.fr\/\">SAUR ici<\/a>.<\/p>\n\n\n\n<p><strong>Pour contacter le service inh\u00e9rent, composez le :<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-center\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0);color:#f18556\" class=\"has-inline-color\">02 42 74 00 03<\/mark><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le captage, le traitement et la distribution de l\u2019eau potable eau sont aujourd\u2019hui assur\u00e9s par 6 syndicats d\u2019eau pr\u00e9sents sur le territoire de C\u0153ur de France, \u00e0 savoir\u00a0: Ces syndicats assurent leur comp\u00e9tence par d\u00e9l\u00e9gation de service public \u00e0 des soci\u00e9t\u00e9s priv\u00e9es (Veolia Eau, SAUR). Vous pouvez acc\u00e9der au site internet de V\u00e9olia ici et [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":13982,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_seopress_robots_primary_cat":"","_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","footnotes":""},"rubrique":[17],"class_list":["post-13489","page","type-page","status-publish","has-post-thumbnail","hentry","rubrique-eau-assainissement"],"acf":[],"_links":{"self":[{"href":"https:\/\/cc-coeurdefrance.fr\/en\/wp-json\/wp\/v2\/pages\/13489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cc-coeurdefrance.fr\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cc-coeurdefrance.fr\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cc-coeurdefrance.fr\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/cc-coeurdefrance.fr\/en\/wp-json\/wp\/v2\/comments?post=13489"}],"version-history":[{"count":0,"href":"https:\/\/cc-coeurdefrance.fr\/en\/wp-json\/wp\/v2\/pages\/13489\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cc-coeurdefrance.fr\/en\/wp-json\/wp\/v2\/media\/13982"}],"wp:attachment":[{"href":"https:\/\/cc-coeurdefrance.fr\/en\/wp-json\/wp\/v2\/media?parent=13489"}],"wp:term":[{"taxonomy":"rubrique","embeddable":true,"href":"https:\/\/cc-coeurdefrance.fr\/en\/wp-json\/wp\/v2\/rubrique?post=13489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}