{"id":763,"date":"2026-05-18T16:49:42","date_gmt":"2026-05-18T14:49:42","guid":{"rendered":"https:\/\/kots.fr\/?page_id=763"},"modified":"2026-05-19T11:46:50","modified_gmt":"2026-05-19T09:46:50","slug":"carte-interactive-des-chapters","status":"publish","type":"page","link":"https:\/\/kots.fr\/?page_id=763","title":{"rendered":"Carte interactive"},"content":{"rendered":"\n    <style>\n    .kots-map-container { border-radius:6px; box-shadow:0 2px 12px rgba(0,0,0,.15); overflow:hidden; }\n    .kots-map-popup { font-family:inherit; text-align:center; min-width:150px; }\n    .kots-map-popup .kots-pop-id {\n        display:inline-block; background:#c9a84c; color:#fff;\n        font-size:.7rem; font-weight:700; letter-spacing:.1em;\n        padding:2px 8px; border-radius:10px; margin-bottom:6px;\n    }\n    .kots-map-popup h3 {\n        font-size:.85rem; font-weight:700; margin:0 0 8px; color:#222; line-height:1.3;\n    }\n    .kots-map-popup a.kots-pop-link {\n        display:inline-block; background:#c9a84c; color:#fff;\n        font-size:.73rem; font-weight:600; letter-spacing:.06em;\n        padding:4px 12px; border-radius:3px; text-decoration:none; transition:background .2s;\n    }\n    .kots-map-popup a.kots-pop-link:hover { background:#b8963d; }\n    .leaflet-popup-content-wrapper { border-radius:6px !important; }\n    <\/style>    <div class=\"kots-map-container\" style=\"width:100%;\">\n      <div id=\"kots-map-6a6e2f25d7790\"\n           style=\"height:800px;width:100%;\"><\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener('DOMContentLoaded', function() {\n        if (typeof L === 'undefined' || typeof turf === 'undefined') return;\n\n        \n    var KOTS_CHAPTERS   = {\"K1\":{\"name\":\"K1 - Septimanie\",\"depts\":[\"11\",\"30\",\"34\",\"48\",\"66\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=785\",\"idf\":false},\"K2\":{\"name\":\"K2 - Marches de l'Est\",\"depts\":[\"77\",\"93\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=789\",\"idf\":true},\"K3\":{\"name\":\"K3 - Paris \\u00cele-de-France\",\"depts\":[\"75\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=781\",\"idf\":true},\"K4\":{\"name\":\"K4 - Guyenne Gascogne\",\"depts\":[\"33\",\"40\",\"64\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=793\",\"idf\":false},\"K5\":{\"name\":\"K5 - Neustrie\",\"depts\":[\"14\",\"27\",\"50\",\"61\",\"76\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=796\",\"idf\":false},\"K6\":{\"name\":\"K6 - Alpes M\\u00e9diterran\\u00e9e\",\"depts\":[\"06\",\"98\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=799\",\"idf\":false},\"K7\":{\"name\":\"K7 - Occitanie\",\"depts\":[\"09\",\"31\",\"32\",\"47\",\"65\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=802\",\"idf\":false},\"K8\":{\"name\":\"K8 - Paris Plaine Monceau\",\"depts\":[\"92\",\"94\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=805\",\"idf\":true},\"K9\":{\"name\":\"K9 - Val de Loire\",\"depts\":[\"18\",\"36\",\"37\",\"41\",\"45\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=808\",\"idf\":false},\"K10\":{\"name\":\"K10 - Dauphin\\u00e9 Savoie\",\"depts\":[\"73\",\"74\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=811\",\"idf\":false},\"K11\":{\"name\":\"K11 - Maine Atlantique\",\"depts\":[\"44\",\"49\",\"53\",\"72\",\"85\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=814\",\"idf\":false},\"K12\":{\"name\":\"K12 - Picardie Plaine de France\",\"depts\":[\"60\",\"95\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=817\",\"idf\":true},\"K13\":{\"name\":\"K13 - Massilia\",\"depts\":[\"13\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=821\",\"idf\":false},\"K14\":{\"name\":\"K14 - Beauce Rives de Seine\",\"depts\":[\"28\",\"78\",\"91\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=824\",\"idf\":true},\"K15\":{\"name\":\"K15 - Vall\\u00e9e du Rhin\",\"depts\":[\"67\",\"68\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=827\",\"idf\":false}};\n    var FILL_COLOR      = '#c9a84c';\n    var FILL_OPACITY    = 0.4;\n    var BORDER_COLOR    = '#8a6200';\n    var BORDER_WIDTH    = 2;\n    var TILE_URL        = 'https:\/\/{s}.basemaps.cartocdn.com\/light_nolabels\/{z}\/{x}\/{y}{r}.png';\n    var TILE_LABELS     = 'https:\/\/{s}.basemaps.cartocdn.com\/light_only_labels\/{z}\/{x}\/{y}{r}.png';\n    var TILE_ATTR       = '\u00a9 <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OSM<\/a> \u00a9 <a href=\"https:\/\/carto.com\/\">CARTO<\/a>';\n    var GEOJSON_URL     = 'https:\/\/raw.githubusercontent.com\/gregoiredavid\/france-geojson\/master\/departements.geojson';\n\n    function kotsMakePopup(id) {\n        var ch = KOTS_CHAPTERS[id];\n        return '<div class=\"kots-map-popup\">'\n            + '<span class=\"kots-pop-id\">' + id + '<\/span>'\n            + '<h3>' + ch.name + '<\/h3>'\n            + (ch.url ? '<a href=\"' + ch.url + '\" class=\"kots-pop-link\">Voir le chapter<\/a>' : '')\n            + '<\/div>';\n    }\n\n    function kotsBuildDeptIndex(filterFn) {\n        var idx = {};\n        Object.keys(KOTS_CHAPTERS).forEach(function(id) {\n            if (filterFn && !filterFn(id)) return;\n            KOTS_CHAPTERS[id].depts.forEach(function(d) {\n                if (!idx[d]) idx[d] = id;\n            });\n        });\n        return idx;\n    }\n\n    function kotsMergeFeatures(features) {\n        var merged = features[0];\n        for (var i = 1; i < features.length; i++) {\n            try { merged = turf.union(merged, features[i]); }\n            catch(e) { console.warn('Turf union error', e); }\n        }\n        return merged;\n    }\n\n    function kotsAddLayer(targetMap, feature, chapterId, style, hoverStyle) {\n        var ch    = KOTS_CHAPTERS[chapterId];\n        var layer = L.geoJSON(feature, { style: style });\n\n        layer.on('mouseover', function(e) {\n            this.setStyle(hoverStyle);\n            L.popup({ closeButton:false, offset:[0,-4] })\n             .setLatLng(e.latlng)\n             .setContent(kotsMakePopup(chapterId))\n             .openOn(targetMap);\n        });\n        layer.on('mouseout', function() {\n            this.setStyle(style);\n            targetMap.closePopup();\n        });\n        if (ch.url) {\n            layer.on('click', function() { window.location.href = ch.url; });\n        }\n        layer.addTo(targetMap);\n        return layer;\n    }\n    \n        var mapEl = document.getElementById('kots-map-6a6e2f25d7790');\n        if (!mapEl) return;\n\n        var map = L.map(mapEl, { center:[46.6,2.4], zoom:6, scrollWheelZoom:false });\n        L.tileLayer(TILE_URL, { attribution:TILE_ATTR, maxZoom:18 }).addTo(map);\n        L.tileLayer(TILE_LABELS, { maxZoom:18, pane:'shadowPane' }).addTo(map);\n\n        \/\/ Index dept \u2192 chapter (tous chapters)\n        var deptIndex     = kotsBuildDeptIndex();\n        \/\/ Index dept \u2192 chapter hors IDF uniquement\n        var deptIndexMain = kotsBuildDeptIndex(function(id) { return !KOTS_CHAPTERS[id].idf; });\n\n        fetch(GEOJSON_URL)\n        .then(function(r) { return r.json(); })\n        .then(function(geojson) {\n\n            \/\/ Groupe features par chapter\n            var byChapter = {};\n            geojson.features.forEach(function(f) {\n                var id = deptIndex[f.properties.code];\n                if (!id) return;\n                if (!byChapter[id]) byChapter[id] = [];\n                byChapter[id].push(f);\n            });\n\n            Object.keys(byChapter).forEach(function(id) {\n                var merged = kotsMergeFeatures(byChapter[id]);\n                var isIdf  = KOTS_CHAPTERS[id].idf;\n\n                if (!isIdf) {\n                    \/\/ Chapter normal \u2014 zone dor\u00e9e\n                    kotsAddLayer(map, merged, id,\n                        { fillColor:FILL_COLOR, fillOpacity:FILL_OPACITY, color:BORDER_COLOR, weight:BORDER_WIDTH },\n                        { fillColor:FILL_COLOR, fillOpacity:0.7, color:BORDER_COLOR, weight:3 }\n                    );\n                } else {\n                    \/\/ Chapter IDF \u2014 zone grise pointill\u00e9e avec popup du chapter\n                    (function(chapterId) {\n                        var ch    = KOTS_CHAPTERS[chapterId];\n                        var style = { fillColor:'#ff6', fillOpacity:0.12, color:BORDER_COLOR, weight:BORDER_WIDTH };\n                        var layer = L.geoJSON(merged, { style: style });\n\n                        layer.on('mouseover', function(e) {\n                            this.setStyle({ fillOpacity:0.28 });\n                            L.popup({ closeButton:false, offset:[0,-4] })\n                             .setLatLng(e.latlng)\n                             .setContent(kotsMakePopup(chapterId))\n                             .openOn(map);\n                        });\n                        layer.on('mouseout', function() {\n                            this.setStyle(style);\n                            map.closePopup();\n                        });\n                        if (ch.url) {\n                            layer.on('click', function() { window.location.href = ch.url; });\n                        }\n                        layer.addTo(map);\n                    })(id);\n                }\n            });\n\n            \/\/ D\u00e9partements sans chapter \u2014 gris discret\n            geojson.features.forEach(function(f) {\n                if (!deptIndex[f.properties.code]) {\n                    L.geoJSON(f, {\n                        style: { fillColor:'#ddd', fillOpacity:0.2, color:'#bbb', weight:0.4 },\n                        interactive: false,\n                    }).addTo(map);\n                }\n            });\n        })\n        .catch(function() {\n            mapEl.innerHTML = '<p style=\"padding:20px;text-align:center;color:#888;\">Impossible de charger la carte.<\/p>';\n        });\n\n        mapEl.addEventListener('click', function() { map.scrollWheelZoom.enable(); });\n    });\n    <\/script>\n    \n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Carte interactive des Chapters r\u00e9gion parisienne<\/h2>\n\n\n\n    <style>\n    .kots-map-container { border-radius:6px; box-shadow:0 2px 12px rgba(0,0,0,.15); overflow:hidden; }\n    .kots-map-popup { font-family:inherit; text-align:center; min-width:150px; }\n    .kots-map-popup .kots-pop-id {\n        display:inline-block; background:#c9a84c; color:#fff;\n        font-size:.7rem; font-weight:700; letter-spacing:.1em;\n        padding:2px 8px; border-radius:10px; margin-bottom:6px;\n    }\n    .kots-map-popup h3 {\n        font-size:.85rem; font-weight:700; margin:0 0 8px; color:#222; line-height:1.3;\n    }\n    .kots-map-popup a.kots-pop-link {\n        display:inline-block; background:#c9a84c; color:#fff;\n        font-size:.73rem; font-weight:600; letter-spacing:.06em;\n        padding:4px 12px; border-radius:3px; text-decoration:none; transition:background .2s;\n    }\n    .kots-map-popup a.kots-pop-link:hover { background:#b8963d; }\n    .leaflet-popup-content-wrapper { border-radius:6px !important; }\n    <\/style>    <div class=\"kots-map-container\" style=\"width:100%;\">\n      <div id=\"kots-idf-6a6e2f25d77de\"\n           style=\"height:800px;width:100%;\"><\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener('DOMContentLoaded', function() {\n        if (typeof L === 'undefined' || typeof turf === 'undefined') return;\n\n        \n    var KOTS_CHAPTERS   = {\"K1\":{\"name\":\"K1 - Septimanie\",\"depts\":[\"11\",\"30\",\"34\",\"48\",\"66\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=785\",\"idf\":false},\"K2\":{\"name\":\"K2 - Marches de l'Est\",\"depts\":[\"77\",\"93\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=789\",\"idf\":true},\"K3\":{\"name\":\"K3 - Paris \\u00cele-de-France\",\"depts\":[\"75\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=781\",\"idf\":true},\"K4\":{\"name\":\"K4 - Guyenne Gascogne\",\"depts\":[\"33\",\"40\",\"64\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=793\",\"idf\":false},\"K5\":{\"name\":\"K5 - Neustrie\",\"depts\":[\"14\",\"27\",\"50\",\"61\",\"76\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=796\",\"idf\":false},\"K6\":{\"name\":\"K6 - Alpes M\\u00e9diterran\\u00e9e\",\"depts\":[\"06\",\"98\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=799\",\"idf\":false},\"K7\":{\"name\":\"K7 - Occitanie\",\"depts\":[\"09\",\"31\",\"32\",\"47\",\"65\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=802\",\"idf\":false},\"K8\":{\"name\":\"K8 - Paris Plaine Monceau\",\"depts\":[\"92\",\"94\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=805\",\"idf\":true},\"K9\":{\"name\":\"K9 - Val de Loire\",\"depts\":[\"18\",\"36\",\"37\",\"41\",\"45\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=808\",\"idf\":false},\"K10\":{\"name\":\"K10 - Dauphin\\u00e9 Savoie\",\"depts\":[\"73\",\"74\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=811\",\"idf\":false},\"K11\":{\"name\":\"K11 - Maine Atlantique\",\"depts\":[\"44\",\"49\",\"53\",\"72\",\"85\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=814\",\"idf\":false},\"K12\":{\"name\":\"K12 - Picardie Plaine de France\",\"depts\":[\"60\",\"95\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=817\",\"idf\":true},\"K13\":{\"name\":\"K13 - Massilia\",\"depts\":[\"13\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=821\",\"idf\":false},\"K14\":{\"name\":\"K14 - Beauce Rives de Seine\",\"depts\":[\"28\",\"78\",\"91\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=824\",\"idf\":true},\"K15\":{\"name\":\"K15 - Vall\\u00e9e du Rhin\",\"depts\":[\"67\",\"68\"],\"url\":\"https:\\\/\\\/kots.fr\\\/?page_id=827\",\"idf\":false}};\n    var FILL_COLOR      = '#c9a84c';\n    var FILL_OPACITY    = 0.4;\n    var BORDER_COLOR    = '#8a6200';\n    var BORDER_WIDTH    = 2;\n    var TILE_URL        = 'https:\/\/{s}.basemaps.cartocdn.com\/light_nolabels\/{z}\/{x}\/{y}{r}.png';\n    var TILE_LABELS     = 'https:\/\/{s}.basemaps.cartocdn.com\/light_only_labels\/{z}\/{x}\/{y}{r}.png';\n    var TILE_ATTR       = '\u00a9 <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OSM<\/a> \u00a9 <a href=\"https:\/\/carto.com\/\">CARTO<\/a>';\n    var GEOJSON_URL     = 'https:\/\/raw.githubusercontent.com\/gregoiredavid\/france-geojson\/master\/departements.geojson';\n\n    function kotsMakePopup(id) {\n        var ch = KOTS_CHAPTERS[id];\n        return '<div class=\"kots-map-popup\">'\n            + '<span class=\"kots-pop-id\">' + id + '<\/span>'\n            + '<h3>' + ch.name + '<\/h3>'\n            + (ch.url ? '<a href=\"' + ch.url + '\" class=\"kots-pop-link\">Voir le chapter<\/a>' : '')\n            + '<\/div>';\n    }\n\n    function kotsBuildDeptIndex(filterFn) {\n        var idx = {};\n        Object.keys(KOTS_CHAPTERS).forEach(function(id) {\n            if (filterFn && !filterFn(id)) return;\n            KOTS_CHAPTERS[id].depts.forEach(function(d) {\n                if (!idx[d]) idx[d] = id;\n            });\n        });\n        return idx;\n    }\n\n    function kotsMergeFeatures(features) {\n        var merged = features[0];\n        for (var i = 1; i < features.length; i++) {\n            try { merged = turf.union(merged, features[i]); }\n            catch(e) { console.warn('Turf union error', e); }\n        }\n        return merged;\n    }\n\n    function kotsAddLayer(targetMap, feature, chapterId, style, hoverStyle) {\n        var ch    = KOTS_CHAPTERS[chapterId];\n        var layer = L.geoJSON(feature, { style: style });\n\n        layer.on('mouseover', function(e) {\n            this.setStyle(hoverStyle);\n            L.popup({ closeButton:false, offset:[0,-4] })\n             .setLatLng(e.latlng)\n             .setContent(kotsMakePopup(chapterId))\n             .openOn(targetMap);\n        });\n        layer.on('mouseout', function() {\n            this.setStyle(style);\n            targetMap.closePopup();\n        });\n        if (ch.url) {\n            layer.on('click', function() { window.location.href = ch.url; });\n        }\n        layer.addTo(targetMap);\n        return layer;\n    }\n    \n        var mapEl = document.getElementById('kots-idf-6a6e2f25d77de');\n        if (!mapEl) return;\n\n        var map = L.map(mapEl, {\n            center: [48.72, 2.40], zoom: 8, scrollWheelZoom: false,\n        });\n        L.tileLayer(TILE_URL, { attribution:TILE_ATTR, maxZoom:18 }).addTo(map);\n        L.tileLayer(TILE_LABELS, { maxZoom:18, pane:'shadowPane' }).addTo(map);\n\n        \/\/ Index dept \u2192 chapter IDF uniquement\n        var deptIndex = kotsBuildDeptIndex(function(id) { return KOTS_CHAPTERS[id].idf; });\n\n        fetch(GEOJSON_URL)\n        .then(function(r) { return r.json(); })\n        .then(function(geojson) {\n\n            var byChapter = {};\n            geojson.features.forEach(function(f) {\n                var id = deptIndex[f.properties.code];\n                if (!id) return;\n                if (!byChapter[id]) byChapter[id] = [];\n                byChapter[id].push(f);\n            });\n\n            Object.keys(byChapter).forEach(function(id) {\n                var merged = kotsMergeFeatures(byChapter[id]);\n                kotsAddLayer(map, merged, id,\n                    { fillColor:FILL_COLOR, fillOpacity:FILL_OPACITY, color:BORDER_COLOR, weight:BORDER_WIDTH },\n                    { fillColor:FILL_COLOR, fillOpacity:0.7, color:BORDER_COLOR, weight:3 }\n                );\n            });\n\n            \/\/ D\u00e9partements IDF sans chapter assign\u00e9 \u2014 gris discret\n            var idfDepts = ['75','77','78','91','92','93','94','95'];\n            geojson.features.forEach(function(f) {\n                var code = f.properties.code;\n                if (idfDepts.indexOf(code) !== -1 && !deptIndex[code]) {\n                    L.geoJSON(f, {\n                        style: { fillColor:'#ddd', fillOpacity:0.2, color:'#bbb', weight:0.4 },\n                        interactive: false,\n                    }).addTo(map);\n                }\n            });\n        })\n        .catch(function() {\n            mapEl.innerHTML = '<p style=\"padding:20px;text-align:center;color:#888;\">Impossible de charger la carte.<\/p>';\n        });\n\n        mapEl.addEventListener('click', function() { map.scrollWheelZoom.enable(); });\n    });\n    <\/script>\n    \n","protected":false},"excerpt":{"rendered":"<p>Carte interactive des Chapters r\u00e9gion parisienne<\/p>\n","protected":false},"author":112,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":"","_members_access_role":[],"_members_access_error":""},"class_list":["post-763","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/kots.fr\/index.php?rest_route=\/wp\/v2\/pages\/763","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kots.fr\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/kots.fr\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/kots.fr\/index.php?rest_route=\/wp\/v2\/users\/112"}],"replies":[{"embeddable":true,"href":"https:\/\/kots.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=763"}],"version-history":[{"count":13,"href":"https:\/\/kots.fr\/index.php?rest_route=\/wp\/v2\/pages\/763\/revisions"}],"predecessor-version":[{"id":854,"href":"https:\/\/kots.fr\/index.php?rest_route=\/wp\/v2\/pages\/763\/revisions\/854"}],"wp:attachment":[{"href":"https:\/\/kots.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}