{"id":6219,"date":"2026-09-28T15:15:28","date_gmt":"2026-09-28T14:15:28","guid":{"rendered":"https:\/\/www.cgvl-merville.com\/?page_id=6219"},"modified":"2026-10-03T16:40:03","modified_gmt":"2026-10-03T15:40:03","slug":"6219-2","status":"publish","type":"page","link":"https:\/\/www.cgvl-merville.com\/?page_id=6219","title":{"rendered":"Recherche dans nos bases CGVL"},"content":{"rendered":"<div class=\"bms-menu\">\n  \n\t<span class=\"menu-title\">RECHERCHE BASE B.M.S :<\/span>\n  <a href=\"\/?page_id=6095&nom=&prenom=\" class=\"menu-link\"><span class=\"icon\">| &#x1F37C;<\/span> Bapt\u00eames\/Naissances |<\/a>\n  <a href=\"\/?page_id=6092&nom=&prenom=\" class=\"menu-link active\"><span class=\"icon\">| &#x1F48D;<\/span> Mariages\/Contrats\/Fian\u00e7ailles\/Divorces |<\/a>\n  <a href=\"\/?page_id=5968&nom=&prenom=\" class=\"menu-link\"><span class=\"icon\">| &#x1FAA6;<\/span> S\u00e9pultures\/D\u00e9c\u00e8s |<\/a>\n<a href=\"\/?page_id=6163&nom=&prenom=\" class=\"menu-link\"><span class=\"icon\">| &#128367;<\/span> Faire-part de d\u00e9c\u00e8s |<\/a>\t\n\t<a href=\"\/?page_id=6219\" class=\"menu-link\"><span class=\"icon\">| &#10067;\n<span class=\"\"> Explications |<\/span><\/span><\/a>\n<\/div>\n<div>\n\n<\/div>\n\n\n<!-- Inclusions des styles et des scripts Leaflet.js depuis CDN -->\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\">\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n\n<style>\n\/* Style du conteneur de carte *\/\n#map-container {\n    position: relative;\n    width: 100%;\n    height: 650px;\n}\n\n#bms-map {\n    width: 100%;\n    height: 100%;\n    border-radius: 8px;\n    border: 1px solid #ccc;\n    background: #f8f9fa;\n}\n\n\/* \u00c9cran de chargement *\/\n#bms-loader {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    background: rgba(255, 255, 255, 0.85);\n    z-index: 2000;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n    border-radius: 8px;\n    font-family: sans-serif;\n    color: #333;\n}\n\n.spinner {\n    width: 45px;\n    height: 45px;\n    border: 5px solid #e0e0e0;\n    border-top: 5px solid #bd0026;\n    border-radius: 50%;\n    animation: spin 1s linear infinite;\n    margin-bottom: 12px;\n}\n\n@keyframes spin {\n    0% { transform: rotate(0deg); }\n    100% { transform: rotate(360deg); }\n}\n\n\/* Style du filtre par commune *\/\n.commune-search-box {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n    z-index: 1000;\n    background: white;\n    padding: 8px 12px;\n    border-radius: 6px;\n    box-shadow: 0 2px 6px rgba(0,0,0,0.3);\n    font-family: sans-serif;\n    font-size: 13px;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n}\n\n.commune-search-box select {\n    padding: 4px 8px;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    font-size: 13px;\n    outline: none;\n    max-width: 220px;\n}\n<\/style>\n<h2> Moteur de recherche CGVL<\/h2>\n<span>\nNotre base de donn\u00e9es compte aujourd\u2019hui <b>plus de 4,2 millions d\u2019actes (BMS + D\u00e9c\u00e8s INSEE 59-62)<\/b> (Bapt\u00eames, Mariages, S\u00e9pultures\u2026) et pr\u00e8s de 17 000 faire-part de d\u00e9c\u00e8s.<br><br>\nCi\u2011dessous, vous trouverez une carte de France permettant de visualiser les communes couvertes par nos relev\u00e9s BMS.\nUn simple clic sur une commune vous affiche les statistiques BMS disponibles.\nVous pouvez librement <b>zoomer<\/b> ou <b>d\u00e9zoomer<\/b> pour explorer les zones en d\u00e9tail.\n<br><br>\nPour rechercher un individu, un couple, cliquer sur Bapt\u00eames, Mariages ou S\u00e9pultures.\n<br><br>\nBonne d\u00e9couverte !\n<br><\/span>\n<br>\n<!-- Conteneur Carte + Filtre + Loader -->\n<div id=\"map-container\">\n    <!-- \u00c9cran de chargement temporaire -->\n    <div id=\"bms-loader\">\n        <div class=\"spinner\"><\/div>\n        <div><b>Chargement des donn\u00e9es BMS en cours...<\/b><\/div>\n        <small style=\"color: #666; margin-top: 4px;\">Veuillez patienter quelques instants<\/small>\n    <\/div>\n\n    <div class=\"commune-search-box\">\n        <label for=\"commune-select\"><b>Communes: <\/b><\/label>\n        <select id=\"commune-select\">\n            <option value=\"\">-- Toutes les communes --<\/option>\n        <\/select>\n    <\/div>\n    <div id=\"bms-map\"><\/div>\n<\/div>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n    var loaderEl = document.getElementById('bms-loader');\n\n    \/\/ 1. Fond de carte unique : OpenStreetMap France\n    var osmFr = L.tileLayer('https:\/\/{s}.tile.openstreetmap.fr\/osmfr\/{z}\/{x}\/{y}.png', {\n        maxZoom: 20,\n        attribution: '&copy; OpenStreetMap France'\n    });\n\n    \/\/ 2. Limites g\u00e9ographiques restreintes \u00e0 la France\n    var franceBounds = L.latLngBounds(\n        L.latLng(41.0, -5.5),\n        L.latLng(51.5, 10.0)\n    );\n\n    \/\/ 3. Initialisation de la carte centr\u00e9e sur la Vall\u00e9e de la Lys (Merville \/ Estaires)\n    var map = L.map('bms-map', {\n        center: [50.64, 2.64], \/\/ Coordonn\u00e9es centr\u00e9es sur la Vall\u00e9e de la Lys\n        zoom: 12,              \/\/ Zoom adapt\u00e9 pour englober le secteur de la Lys\n        minZoom: 6,\n        maxBounds: franceBounds,\n        maxBoundsViscosity: 0.8,\n        layers: [osmFr]\n    });\n\n    var communeLayers = {};\n\n    \/\/ \u00c9chelle de couleurs selon le volume d'actes\n    function getColor(d) {\n        return d > 10000 ? '#800026' :\n               d > 5000  ? '#BD0026' :\n               d > 2000  ? '#E31A1C' :\n               d > 1000  ? '#FC4E2A' :\n               d > 500   ? '#FD8D3C' :\n               d > 100   ? '#FEB24C' :\n                           '#4caf50';\n    }\n\n    \/\/ Extraction et normalisation du code INSEE GeoJSON\n    function getInseeCode(props) {\n        if (!props) return null;\n        var rawCode = props.code || props.code_insee || props.insee || props.INSEE_COM || props.CODE_INSEE;\n        if (!rawCode) return null;\n        return String(rawCode).trim().padStart(5, '0');\n    }\n\n    \/\/ 4. Chargement simultan\u00e9 API REST + GeoJSON\n    Promise.all([\n        fetch('\/?rest_route=\/bms\/v1\/communes').then(function(res) {\n            if (!res.ok) throw new Error(\"Erreur REST (\" + res.status + \")\");\n            return res.json();\n        }),\n        fetch('\/wp-content\/uploads\/communes.geojson').then(function(res) {\n            if (!res.ok) throw new Error(\"Erreur GeoJSON (\" + res.status + \")\");\n            return res.json();\n        })\n    ]).then(function(results) {\n        var rawStats = results[0];\n        var geojson = results[1];\n\n        \/\/ Nettoyage automatique des cl\u00e9s INSEE venant de l'API REST\n        var statsBMS = {};\n        Object.keys(rawStats).forEach(function(code) {\n            var cleanCode = String(code).trim().padStart(5, '0');\n            statsBMS[cleanCode] = rawStats[code];\n        });\n\n        var communesList = [];\n\n        var geojsonLayer = L.geoJSON(geojson, {\n            filter: function(feature) {\n                var codeInsee = getInseeCode(feature.properties);\n                return statsBMS.hasOwnProperty(codeInsee);\n            },\n            style: function(feature) {\n                var codeInsee = getInseeCode(feature.properties);\n                var total = statsBMS[codeInsee] ? statsBMS[codeInsee].total : 0;\n                \n                return {\n                    fillColor: getColor(total),\n                    fillOpacity: 0.15,  \/\/ Transparence tr\u00e8s forte pour lire le fond\n                    color: '#ffffff',    \/\/ Contours blancs\n                    weight: 2.0,         \/\/ \u00c9paisseur des bordures\n                    opacity: 0.95\n                };\n            },\n            onEachFeature: function(feature, layer) {\n                var codeInsee = getInseeCode(feature.properties);\n                var data = statsBMS[codeInsee];\n                var nomCommune = feature.properties.nom || feature.properties.NOM_COM || feature.properties.nom_commune || \"Commune\";\n\n                if (codeInsee) {\n                    communeLayers[codeInsee] = layer;\n                    communesList.push({ code: codeInsee, nom: nomCommune });\n                }\n\n                \/\/ Surbrillance au survol\n                layer.on({\n                    mouseover: function(e) {\n                        var l = e.target;\n                        l.setStyle({\n                            fillOpacity: 0.45,\n                            weight: 3.0\n                        });\n                        l.bringToFront();\n                    },\n                    mouseout: function(e) {\n                        geojsonLayer.resetStyle(e.target);\n                    }\n                });\n\n                \/\/ Popup au clic\n                if (data) {\n                    var popupContent = \"<div style='font-family: sans-serif; line-height: 1.5;'>\" +\n                        \"<h3 style='margin:0 0 5px 0; font-size: 15px; color: #333;'>\" + nomCommune + \" (\" + codeInsee + \")<\/h3>\" +\n                        \"&#128118; Naissances : <b>\" + data.naissances.toLocaleString('fr-FR') + \"<\/b><br>\" +\n                        \"&#128141; Mariages : <b>\" + data.mariages.toLocaleString('fr-FR') + \"<\/b><br>\" +\n                        \"&#x2020; D\u00e9c\u00e8s : <b>\" + data.deces.toLocaleString('fr-FR') + \"<\/b><br>\" +\n                        \"<hr style='margin: 8px 0; border: 0; border-top: 1px solid #eee;'>\" +\n                        \" <b style='color:#bd0026;'>Total : \" + data.total.toLocaleString('fr-FR') + \" actes<\/b>\" +\n                        \"<\/div>\";\n                    \n                    layer.bindPopup(popupContent);\n                }\n            }\n        }).addTo(map);\n\n        \/\/ Alimentation du filtre d\u00e9roulant (tri par ordre alphab\u00e9tique)\n        var selectEl = document.getElementById('commune-select');\n        communesList.sort(function(a, b) {\n            return a.nom.localeCompare(b.nom, 'fr', { sensitivity: 'base' });\n        });\n\n        communesList.forEach(function(c) {\n            var opt = document.createElement('option');\n            opt.value = c.code;\n            opt.textContent = c.nom + \" (\" + c.code + \")\";\n            selectEl.appendChild(opt);\n        });\n\n        \/\/ Action lors du choix dans le filtre d\u00e9roulant\n        selectEl.addEventListener('change', function() {\n            var selectedCode = this.value;\n\n            geojsonLayer.eachLayer(function(l) {\n                geojsonLayer.resetStyle(l);\n            });\n\n            if (selectedCode && communeLayers[selectedCode]) {\n                var targetLayer = communeLayers[selectedCode];\n                map.fitBounds(targetLayer.getBounds(), { padding: [20, 20], maxZoom: 13 });\n                targetLayer.setStyle({\n                    fillOpacity: 0.5,\n                    weight: 3.5,\n                    color: '#ffff00' \/\/ Contours jaunes pour rep\u00e9rer la commune s\u00e9lectionn\u00e9e\n                });\n                targetLayer.bringToFront();\n                targetLayer.openPopup();\n            } else {\n                \/\/ Si aucune commune s\u00e9lectionn\u00e9e, retour au cadrage Vall\u00e9e de la Lys\n                map.setView([50.64, 2.64], 12);\n            }\n        });\n\n        \/\/ Masquage du loader\n        if (loaderEl) {\n            loaderEl.style.display = 'none';\n        }\n\n    }).catch(function(error) {\n        console.error(\"Erreur d'initialisation de la carte BMS :\", error);\n        if (loaderEl) {\n            loaderEl.innerHTML = \"<div style='color: #d32f2f; padding: 20px; text-align: center;'><b>Erreur de chargement.<\/b><br><small>\" + error.message + \"<\/small><\/div>\";\n        }\n    });\n});\n<\/script>\n<br>\n<span>\n<h3>Nos sources: <\/h3>\n- Relev\u00e9s, tables, Faire-part: nos membres et anciens membres du CGVL.<br>\n- INSEE : donn\u00e9es de d\u00e9c\u00e8s (et naissances associ\u00e9es) pour les d\u00e9partements 59 et 62, de 1970 \u00e0 2025.\n<\/span>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"more-link\"><a href=\"https:\/\/www.cgvl-merville.com\/?page_id=6219\">Lire la suite<\/a><\/span><\/p>\n","protected":false},"author":272,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_mc_calendar":[],"footnotes":""},"class_list":["entry","author-cmalvache","post-6219","page","type-page","status-publish"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.cgvl-merville.com\/index.php?rest_route=\/wp\/v2\/pages\/6219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cgvl-merville.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.cgvl-merville.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.cgvl-merville.com\/index.php?rest_route=\/wp\/v2\/users\/272"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cgvl-merville.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6219"}],"version-history":[{"count":24,"href":"https:\/\/www.cgvl-merville.com\/index.php?rest_route=\/wp\/v2\/pages\/6219\/revisions"}],"predecessor-version":[{"id":6266,"href":"https:\/\/www.cgvl-merville.com\/index.php?rest_route=\/wp\/v2\/pages\/6219\/revisions\/6266"}],"wp:attachment":[{"href":"https:\/\/www.cgvl-merville.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}