{"id":2111,"date":"2026-05-08T13:44:09","date_gmt":"2026-05-08T12:44:09","guid":{"rendered":"https:\/\/www.gpss.lu\/?page_id=2111"},"modified":"2026-05-08T13:44:09","modified_gmt":"2026-05-08T12:44:09","slug":"geoportail","status":"publish","type":"page","link":"https:\/\/www.gpss.lu\/en\/geoportail\/","title":{"rendered":"Geoportail"},"content":{"rendered":"    \n<style>\n    .gpss-liste-parcelles, .gpss-geojson-data { display: none !important; }\n    :root { --gpss-p: #8bc92e; --gpss-s: #047e7e; --gpss-bg: #f4f7f6; }\n    \n    #gpss-main { \n        display: flex; \n        height: 100vh; \n        min-height: 600px; \n        font-family: 'Quicksand', sans-serif; \n        background: #fff; \n        position: relative; \n        border-radius: 12px; \n        border: 1px solid #eee; \n        overflow: hidden; \n    }\n\t.wpforms-container .wpforms-field-container input, .wpforms-container .wpforms-field-container textarea, .wpforms-container .wpforms-field-container select {\n\t\tmax-width: 100% !important;\n\t\tborder: none !important;\n\t\tline-height: 1 !important;\n\t\tpadding: 0.9rem 1.5rem !important;\n\t\tfont-weight: 600 !important;\n\t\tborder-radius: 1rem !important;\n\t\tbackground-color: #ffffff !important;\n\t}\n    .lux-map {border: none;}\n    #interactive_map { \n        flex: 1; \n        position: relative; \n        width: 100%; \n        height: 100% !important; \n        touch-action: none; \n    }\n    #wpforms-submit-2025[type=\"submit\"] {\n        background-color: var(--gpss-p, #047e7e) !important;\n        color: #ffffff !important;\n        border: none !important;\n        padding: 12px 24px !important;\n        font-size: 16px !important;\n        font-weight: bold !important;\n        border-radius: 4px !important;\n        cursor: pointer !important;\n        transition: background 0.3s ease !important;\n        display: inline-block !important;\n        width: 100% !important;\n        box-shadow: 0 2px 4px rgba(0,0,0,0.1) !important;\n    }\n    #wpforms-submit-2025[type=\"submit\"]:hover {\n        background-color: #036666 !important;\n    }\n    #gpss-sidebar { \n        width: 380px; \n        border-left: 1px solid #eee; \n        background: var(--gpss-bg); \n        display: flex; \n        flex-direction: column; \n        z-index: 10; \n    }\n    .sidebar-phase { padding: 20px; display: flex; flex-direction: column; flex: 1; overflow-y: auto; }\n\t\/* MASQUAGE INITIAL DE LA RECHERCHE ET DU RESET *\/\n    #search-wrapper { display: none; margin-top: 10px; border-top: 1px solid #eee; pt: 10px; }\n    .search-container { background: #fff; padding: 15px; border-radius: 12px; margin-bottom: 15px; box-shadow: 0 4px 10px rgba(0,0,0,0.03); }\n    #commune-select, #search-target input { width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 8px; font-size: 16px; margin-bottom: 10px;    font-family: inherit; }\n\t.lux-search{width: 100%;}\n    \/* On force l'affichage du champ de recherche de l'API *\/\n    .lux-search input { width: 100% !important; border: 1px solid #ddd !important; padding: 10px !important; border-radius: 8px !important; }\n\n    #btn-reset-map {\n        background: #f0f0f0;\n        border: 1px solid #ccc;\n        color: #333;\n        font-size: 13px;\n        border-radius: 6px;\n        cursor: pointer;\n        padding: 8px;\n        margin-top: 10px;\n        display: block;\n        width: 100%;\n        font-weight: 600;\n        transition: all 0.2s;\n    }\n\t#btn-reset-website{\n\t\tcolor: #047e7e;\n\t\tpadding: 8px;\n        margin-top: 10px;\n        display: block;\n        width: 100%;\n\t\tfont-size: 13px;\n\t}\n    #btn-reset-map:hover { background: #e0e0e0; color: #cc0000; }\n    #search-target { min-height: 40px; margin-top: 10px; }\n\n    #btn-mobile-map { \n        display: none; \n        width: 100%; \n        padding: 14px; \n        background: var(--gpss-s); \n        color: white; \n        border: none; \n        border-radius: 8px; \n        margin-top: 10px; \n        font-weight: 700; \n        cursor: pointer; \n    }\n    #btn-mobile-back-to-list { \n        display: none; \n        position: absolute; \n        bottom: 30px; \n        left: 50%; \n        transform: translateX(-50%); \n        z-index: 2000; \n        padding: 15px 30px; \n        background: var(--gpss-p); \n        color: white; \n        border: none; \n        border-radius: 50px; \n        font-weight: 800; \n        box-shadow: 0 6px 20px rgba(0,0,0,0.4); \n    }\n\t.ol-attribution.ol-unselectable.ol-control.ol-uncollapsible{display: none !important;}\n    .area-summary { background: var(--gpss-s); color: #fff; padding: 15px; border-radius: 12px; text-align: center; margin-top: 15px; }\n    .area-summary span { font-size: 24px; font-weight: 800; color: var(--gpss-p); display: block; }\n    .btn-next { width: 100%; padding: 18px; border: none; border-radius: 12px; cursor: pointer; background: var(--gpss-p); color: #fff; font-weight: 800; margin-top: 15px; }\n    .btn-next:disabled { background: #ccc; cursor: not-allowed; }\n    .parcel-card { background: #fff; border: 1px solid #eee; padding: 10px; border-radius: 8px; margin-bottom: 8px; border-left: 4px solid var(--gpss-p); display: flex; justify-content: space-between; align-items: center; }\n    #gpss-init-loader { position: absolute; inset: 0; background: #fff; z-index: 10000; display: flex; flex-direction: column; align-items: center; justify-content: center; }\n    .loader-spin { width: 40px; height: 40px; border: 4px solid #f3f3f3; border-top: 4px solid var(--gpss-p); border-radius: 50%; animation: spin 1s linear infinite; }\n\t.ol-attribution.ol-unselectable.ol-control.ol-uncollapsible{display: none;}\n\t\/* Style de l'overlay d'instruction *\/\n#zoom-instruction {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    background: rgba(0, 0, 0, 0.4);\n    z-index: 2000;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    transition: opacity 1s ease-out;\n    pointer-events: none; \/* Permet de cliquer \u00e0 travers si besoin *\/\n}\n\n.instruction-content {\n    background: rgba(255, 255, 255, 0.95);\n    padding: 20px 30px;\n    border-radius: 15px;\n    text-align: center;\n    font-weight: 700;\n    box-shadow: 0 10px 30px rgba(0,0,0,0.2);\n    color: var(--gpss-s);\n}\n\n.mouse-icon {\n    display: block;\n    font-size: 30px;\n    margin-bottom: 10px;\n    animation: scroll-hint 2s infinite;\n}\n\n@keyframes scroll-hint {\n    0% { transform: translateY(0); }\n    50% { transform: translateY(10px); }\n    100% { transform: translateY(0); }\n}\n\n\/* Masquer sur mobile car le scroll n'est pas utilis\u00e9 pour le zoom *\/\n@media (max-width: 768px) {\n    #zoom-instruction { display: none !important; }\n}\n    @media (max-width: 768px) {\n        #gpss-main { flex-direction: column; height: 85vh; }\n        #gpss-sidebar { width: 100%; border-left: none; height: 100%; }\n        #btn-mobile-map { display: block; }\n        #gpss-main.map-active #gpss-sidebar { display: none !important; }\n        \/* Correction pour le plein \u00e9cran mobile r\u00e9el *\/\n        #gpss-main.map-active #interactive_map { \n            position: fixed; \n            top: 0; \n            left: 0; \n            width: 100vw !important; \n            height: 100dvh !important; \n            z-index: 1500; \n        }\n        #gpss-main.map-active #btn-mobile-back-to-list { display: block; }\n        #gpss-main.map-active .map-mode-selector { z-index: 1600; }\n    }\n    @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n<\/style>\n\n<div id=\"gpss-main\">\n    <div id=\"gpss-init-loader\">\n        <div class=\"loader-spin\"><\/div>\n        <p style=\"margin-top:15px; font-weight:700;\">\n            Loading...        <\/p>\n    <\/div>\n    \n    <div id=\"interactive_map\">\n\t\t<!-- Overlay d'instruction Zoom -->\n\t\t<div id=\"zoom-instruction\">\n\t\t\t<div class=\"instruction-content\">\n\t\t\t\t<span class=\"mouse-icon\">\ud83d\uddb1\ufe0f<\/span>\n\t\t\t\tUse the scroll wheel to zoom\t\t\t<\/div>\n\t\t<\/div>\n        <div class=\"map-mode-selector\" style=\"position: absolute; top: 15px; left: 80px; z-index: 1000; display: flex; gap: 8px; background: rgba(255,255,255,0.9); padding: 5px; border-radius: 50px; box-shadow: 0 4px 15px rgba(0,0,0,0.1);\">\n            <button id=\"btn-flik\" onclick=\"setMode('flik')\" style=\"border:none; padding:8px 15px; border-radius:40px; cursor:pointer; font-weight:700; background:var(--gpss-p); color:#fff;\">\n                \ud83d\ude9c FLiK            <\/button>\n            <button id=\"btn-cadastre\" onclick=\"setMode('cadastre')\" style=\"border:none; padding:8px 15px; border-radius:40px; cursor:pointer; font-weight:700; background:transparent; color:#666;\">\n                \ud83c\udfd8\ufe0f Cadastre            <\/button>\n        <\/div>\n        <!-- Bouton de retour mobile plac\u00e9 \u00e0 l'int\u00e9rieur de la div map -->\n        <button id=\"btn-mobile-back-to-list\" onclick=\"toggleMobileMap(false)\">\n            \u2190 Back to list        <\/button>\n    <\/div>\n    \n    <div id=\"gpss-sidebar\">\n        <div id=\"phase-selection\" class=\"sidebar-phase\">\n\t\t\t\t\n\t\t\t<a id=\"btn-reset-website\" href=\"https:\/\/gpss.lu\/en\/solutions\/agri-pv\/\" style=\"margin:10px 0;\">\n\t\t\t\t\u2190 Back to website\t\t\t<\/a>\n            <div class=\"search-container\">\n\t\t\t\t\n                <span style=\"font-size: 11px; font-weight: 800; color: var(--gpss-s); text-transform: uppercase; display: block; margin-bottom: 5px;\">\n                    Municipality                <\/span>\n                <select id=\"commune-select\">\n                    <option value=\"\">-- Choose a municipality --<\/option>\n                <\/select>\n                \n                <div id=\"search-wrapper\">\n                    <!-- Recherche d'adresse native -->\n                    <div id=\"search-target\"><\/div>\n\n                    <button id=\"btn-reset-map\" onclick=\"resetMap()\" style=\"margin-top:10px;\">\n                        \u21ba Reset selection                    <\/button>\n                <\/div>\n\n                <button id=\"btn-mobile-map\" onclick=\"toggleMobileMap(true)\">\n                    \ud83d\udccd View map                <\/button>\n\t\t\t<\/div>\n            \n            <div id=\"list_parcels\" style=\"flex:1; overflow-y:auto;\">\n                <p style=\"text-align:center; color:#bbb; margin-top:20px; font-size:13px;\">\n                    Select your parcels                <\/p>\n            <\/div>\n            \n            <div class=\"area-summary\">\n                <small>TOTAL AREA<\/small>\n                <span id=\"total_ha\">0,00<\/span> ha\n            <\/div>\n            \n            <button id=\"btn_next\" class=\"btn-next\" disabled onclick=\"togglePhase(true)\">\n                Confirm \u2192            <\/button>\n        <\/div>\n\n        <div id=\"phase-form\" class=\"sidebar-phase\" style=\"display:none;\">\n            <button type=\"button\" onclick=\"togglePhase(false)\" style=\"background:#eee; border:none; padding:10px; border-radius:8px; cursor:pointer; font-weight:700; margin-bottom:20px; width:100%; color:#555;\">\n                \u2190 Back            <\/button>\n            <div class=\"wpforms-container \" id=\"wpforms-2025\"><form id=\"wpforms-form-2025\" class=\"wpforms-validate wpforms-form wpforms-ajax-form\" data-formid=\"2025\" method=\"post\" enctype=\"multipart\/form-data\" action=\"\/en\/wp-json\/wp\/v2\/pages\/2111\" data-token=\"32f3840a95e7336079c89be43b61c5a7\"><noscript class=\"wpforms-error-noscript\">Please enable JavaScript in your browser to complete this form.<\/noscript><div class=\"wpforms-field-container\"><div id=\"wpforms-2025-field_10-container\" class=\"wpforms-field wpforms-field-html\" data-field-id=\"10\"><div id=\"wpforms-2025-field_10\"><h2 class=\"h3\">Ihre Kontaktdaten<\/h2><\/div><\/div><div id=\"wpforms-2025-field_8-container\" class=\"wpforms-field wpforms-field-radio\" data-field-id=\"8\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_8\">Wie wird das Land aktuell genutzt?<\/label><ul id=\"wpforms-2025-field_8\"><li class=\"choice-1 depth-1\"><input type=\"radio\" id=\"wpforms-2025-field_8_1\" name=\"wpforms[fields][8]\" value=\"Weide \/ Gr\u00fcnland\"  ><label class=\"wpforms-field-label-inline\" for=\"wpforms-2025-field_8_1\">Weide \/ Gr\u00fcnland<\/label><\/li><li class=\"choice-2 depth-1\"><input type=\"radio\" id=\"wpforms-2025-field_8_2\" name=\"wpforms[fields][8]\" value=\"Ackerland\"  ><label class=\"wpforms-field-label-inline\" for=\"wpforms-2025-field_8_2\">Ackerland<\/label><\/li><li class=\"choice-3 depth-1\"><input type=\"radio\" id=\"wpforms-2025-field_8_3\" name=\"wpforms[fields][8]\" value=\"Andere\"  ><label class=\"wpforms-field-label-inline\" for=\"wpforms-2025-field_8_3\">Andere<\/label><\/li><\/ul><\/div><div id=\"wpforms-2025-field_2-container\" class=\"wpforms-field wpforms-field-text\" data-field-id=\"2\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_2\">Name <span class=\"wpforms-required-label\">*<\/span><\/label><input type=\"text\" id=\"wpforms-2025-field_2\" class=\"wpforms-field-large wpforms-field-required\" name=\"wpforms[fields][2]\" required><\/div><div id=\"wpforms-2025-field_1-container\" class=\"wpforms-field wpforms-field-text\" data-field-id=\"1\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_1\">Vorname <span class=\"wpforms-required-label\">*<\/span><\/label><input type=\"text\" id=\"wpforms-2025-field_1\" class=\"wpforms-field-large wpforms-field-required\" name=\"wpforms[fields][1]\" required><\/div><div id=\"wpforms-2025-field_7-container\" class=\"wpforms-field wpforms-field-radio wpforms-list-2-columns wpforms-conditional-trigger\" data-field-id=\"7\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_7\">Wie wollen Sie kontaktiert werden? <span class=\"wpforms-required-label\">*<\/span><\/label><ul id=\"wpforms-2025-field_7\" class=\"wpforms-field-required\"><li class=\"choice-1 depth-1\"><input type=\"radio\" id=\"wpforms-2025-field_7_1\" name=\"wpforms[fields][7]\" value=\"Telefon\" required ><label class=\"wpforms-field-label-inline\" for=\"wpforms-2025-field_7_1\">Telefon<\/label><\/li><li class=\"choice-2 depth-1\"><input type=\"radio\" id=\"wpforms-2025-field_7_2\" name=\"wpforms[fields][7]\" value=\"Mail\" required ><label class=\"wpforms-field-label-inline\" for=\"wpforms-2025-field_7_2\">Mail<\/label><\/li><\/ul><\/div><div id=\"wpforms-2025-field_12-container\" class=\"wpforms-field wpforms-field-layout\" data-field-id=\"12\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-2025-field_12\">Layout (copy)<\/label><div class=\"wpforms-field-layout-columns wpforms-field-layout-preset-50-50\"><div class=\"wpforms-layout-column wpforms-layout-column-50\"><div id=\"wpforms-2025-field_13-container\" class=\"wpforms-field wpforms-field-text wpforms-conditional-field wpforms-conditional-show\" data-field-id=\"13\" style=\"display:none;\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_13\">Telefonnumer<\/label><input type=\"text\" id=\"wpforms-2025-field_13\" class=\"wpforms-field-large\" name=\"wpforms[fields][13]\" ><\/div><\/div><div class=\"wpforms-layout-column wpforms-layout-column-50\"><div id=\"wpforms-2025-field_14-container\" class=\"wpforms-field wpforms-field-text wpforms-conditional-field wpforms-conditional-show\" data-field-id=\"14\" style=\"display:none;\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_14\">E-Mail Adresse <span class=\"wpforms-required-label\">*<\/span><\/label><input type=\"text\" id=\"wpforms-2025-field_14\" class=\"wpforms-field-large wpforms-field-required\" name=\"wpforms[fields][14]\" required><\/div><\/div><\/div><\/div><div id=\"wpforms-2025-field_11-container\" class=\"wpforms-field wpforms-field-layout\" data-field-id=\"11\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-2025-field_11\">Layout<\/label><div class=\"wpforms-field-layout-columns wpforms-field-layout-preset-50-50\"><div class=\"wpforms-layout-column wpforms-layout-column-50\"><div id=\"wpforms-2025-field_4-container\" class=\"wpforms-field wpforms-field-text wpforms-conditional-field wpforms-conditional-show\" data-field-id=\"4\" style=\"display:none;\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_4\">Telefonnumer <span class=\"wpforms-required-label\">*<\/span><\/label><input type=\"text\" id=\"wpforms-2025-field_4\" class=\"wpforms-field-large wpforms-field-required\" name=\"wpforms[fields][4]\" required><\/div><\/div><div class=\"wpforms-layout-column wpforms-layout-column-50\"><div id=\"wpforms-2025-field_3-container\" class=\"wpforms-field wpforms-field-text wpforms-conditional-field wpforms-conditional-show\" data-field-id=\"3\" style=\"display:none;\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_3\">E-Mail Adresse<\/label><input type=\"text\" id=\"wpforms-2025-field_3\" class=\"wpforms-field-large\" name=\"wpforms[fields][3]\" ><\/div><\/div><\/div><\/div><div id=\"wpforms-2025-field_5-container\" class=\"wpforms-field wpforms-field-text gpss-liste-parcelles\" data-field-id=\"5\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_5\">Parcel Datas<\/label><input type=\"text\" id=\"wpforms-2025-field_5\" class=\"wpforms-field-medium\" name=\"wpforms[fields][5]\" ><\/div><div id=\"wpforms-2025-field_6-container\" class=\"wpforms-field wpforms-field-textarea gpss-geojson-data hidden\" data-field-id=\"6\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_6\">GeoJSON<\/label><textarea id=\"wpforms-2025-field_6\" class=\"wpforms-field-medium\" name=\"wpforms[fields][6]\" ><\/textarea><\/div><div id=\"wpforms-2025-field_15-container\" class=\"wpforms-field wpforms-field-textarea\" data-field-id=\"15\"><label class=\"wpforms-field-label\" for=\"wpforms-2025-field_15\">Kommentar<\/label><textarea id=\"wpforms-2025-field_15\" class=\"wpforms-field-medium\" name=\"wpforms[fields][15]\" ><\/textarea><\/div><div id=\"wpforms-2025-field_16-container\" class=\"wpforms-field wpforms-field-hidden\" data-field-id=\"16\"><input type=\"hidden\" id=\"wpforms-2025-field_16\" name=\"wpforms[fields][16]\"><\/div><\/div><!-- .wpforms-field-container --><div class=\"wpforms-submit-container\" ><input type=\"hidden\" name=\"wpforms[id]\" value=\"2025\"><input type=\"hidden\" name=\"wpforms[author]\" value=\"1\"><button type=\"submit\" name=\"wpforms[submit]\" id=\"wpforms-submit-2025\" class=\"wpforms-submit\" data-alt-text=\"Senden\u2026\" data-submit-text=\"Senden\" aria-live=\"assertive\" value=\"wpforms-submit\">Senden<\/button><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gpss.lu\/wp-content\/plugins\/wpforms\/assets\/images\/submit-spin.svg\" class=\"wpforms-submit-spinner\" style=\"display: none;\" width=\"26\" height=\"26\" alt=\"Loading\"><\/div><\/form><\/div>  <!-- .wpforms-container -->        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n(function(){\n    var map = null;\n    var vectorSource = null;\n    var vectorLayer = null;\n    var maskSource = null;\n    var currentMode = 'flik';\n    var selection = {};\n\n    const communesData = [\n  { \"code\": \"1\", \"name\": \"Arsdorf\" },\n  { \"code\": \"2\", \"name\": \"Asselborn\" },\n  { \"code\": \"3\", \"name\": \"Bascharage\" },\n  { \"code\": \"4\", \"name\": \"Bastendorf\" },\n  { \"code\": \"5\", \"name\": \"Beaufort\" },\n  { \"code\": \"6\", \"name\": \"Bech\" },\n  { \"code\": \"7\", \"name\": \"Beckerich\" },\n  { \"code\": \"8\", \"name\": \"Berdorf\" },\n  { \"code\": \"9\", \"name\": \"Berg\" },\n  { \"code\": \"10\", \"name\": \"Bertrange\" },\n  { \"code\": \"11\", \"name\": \"Bettborn\" },\n  { \"code\": \"12\", \"name\": \"Bettembourg\" },\n  { \"code\": \"13\", \"name\": \"Bettendorf\" },\n  { \"code\": \"14\", \"name\": \"Betzdorf\" },\n  { \"code\": \"15\", \"name\": \"Bigonville\" },\n  { \"code\": \"16\", \"name\": \"Bissen\" },\n  { \"code\": \"17\", \"name\": \"Biwer\" },\n  { \"code\": \"18\", \"name\": \"Boevange(Clervaux)\" },\n  { \"code\": \"19\", \"name\": \"Boevange-sur-Attert\" },\n  { \"code\": \"20\", \"name\": \"Boulaide\" },\n  { \"code\": \"21\", \"name\": \"Bourscheid\" },\n  { \"code\": \"22\", \"name\": \"Bous\" },\n  { \"code\": \"23\", \"name\": \"Burmerange\" },\n  { \"code\": \"24\", \"name\": \"Clemency\" },\n  { \"code\": \"25\", \"name\": \"Clervaux\" },\n  { \"code\": \"26\", \"name\": \"Consdorf\" },\n  { \"code\": \"27\", \"name\": \"Consthum\" },\n  { \"code\": \"28\", \"name\": \"Contern\" },\n  { \"code\": \"29\", \"name\": \"Dalheim\" },\n  { \"code\": \"30\", \"name\": \"Diekirch\" },\n  { \"code\": \"31\", \"name\": \"Differdange\" },\n  { \"code\": \"32\", \"name\": \"Dippach\" },\n  { \"code\": \"33\", \"name\": \"Dudelange\" },\n  { \"code\": \"34\", \"name\": \"Echternach\" },\n  { \"code\": \"35\", \"name\": \"Eich\" },\n  { \"code\": \"36\", \"name\": \"Ell\" },\n  { \"code\": \"37\", \"name\": \"Ermsdorf\" },\n  { \"code\": \"38\", \"name\": \"Erpeldange\" },\n  { \"code\": \"39\", \"name\": \"Esch-sur-Alzette\" },\n  { \"code\": \"40\", \"name\": \"Esch-sur-S\u00fbre\" },\n  { \"code\": \"41\", \"name\": \"Eschweiler\" },\n  { \"code\": \"42\", \"name\": \"Ettelbruck\" },\n  { \"code\": \"43\", \"name\": \"Feulen\" },\n  { \"code\": \"44\", \"name\": \"Fischbach\" },\n  { \"code\": \"45\", \"name\": \"Flaxweiler\" },\n  { \"code\": \"46\", \"name\": \"Folschette\" },\n  { \"code\": \"47\", \"name\": \"Fouhren\" },\n  { \"code\": \"48\", \"name\": \"Frisange\" },\n  { \"code\": \"49\", \"name\": \"Garnich\" },\n  { \"code\": \"50\", \"name\": \"Goesdorf\" },\n  { \"code\": \"51\", \"name\": \"Grevenmacher\" },\n  { \"code\": \"52\", \"name\": \"Grosbous\" },\n  { \"code\": \"53\", \"name\": \"Hachiville\" },\n  { \"code\": \"54\", \"name\": \"Hamm\" },\n  { \"code\": \"55\", \"name\": \"Harlange\" },\n  { \"code\": \"56\", \"name\": \"Heffingen\" },\n  { \"code\": \"57\", \"name\": \"Heiderscheid\" },\n  { \"code\": \"58\", \"name\": \"Heinerscheid\" },\n  { \"code\": \"59\", \"name\": \"Hesperange\" },\n  { \"code\": \"60\", \"name\": \"Hobscheid\" },\n  { \"code\": \"61\", \"name\": \"Hollerich\" },\n  { \"code\": \"62\", \"name\": \"Hoscheid\" },\n  { \"code\": \"63\", \"name\": \"Hosingen\" },\n  { \"code\": \"64\", \"name\": \"Junglinster\" },\n  { \"code\": \"65\", \"name\": \"Kautenbach\" },\n  { \"code\": \"66\", \"name\": \"Kayl\" },\n  { \"code\": \"67\", \"name\": \"Kehlen\" },\n  { \"code\": \"68\", \"name\": \"Koerich\" },\n  { \"code\": \"69\", \"name\": \"Kopstal\" },\n  { \"code\": \"70\", \"name\": \"Larochette\" },\n  { \"code\": \"71\", \"name\": \"Lenningen\" },\n  { \"code\": \"72\", \"name\": \"Leudelange\" },\n  { \"code\": \"73\", \"name\": \"Lintgen\" },\n  { \"code\": \"74\", \"name\": \"Lorentzweiler\" },\n  { \"code\": \"75\", \"name\": \"Luxembourg\" },\n  { \"code\": \"76\", \"name\": \"Mamer\" },\n  { \"code\": \"77\", \"name\": \"Manternach\" },\n  { \"code\": \"78\", \"name\": \"Mecher\" },\n  { \"code\": \"79\", \"name\": \"Medernach\" },\n  { \"code\": \"80\", \"name\": \"Mersch\" },\n  { \"code\": \"81\", \"name\": \"Mertert\" },\n  { \"code\": \"82\", \"name\": \"Mertzig\" },\n  { \"code\": \"83\", \"name\": \"Mompach\" },\n  { \"code\": \"84\", \"name\": \"Mondercange\" },\n  { \"code\": \"85\", \"name\": \"Mondorf-les-Bains\" },\n  { \"code\": \"86\", \"name\": \"Munshausen\" },\n  { \"code\": \"87\", \"name\": \"Neunhausen\" },\n  { \"code\": \"88\", \"name\": \"Niederanven\" },\n  { \"code\": \"89\", \"name\": \"Nommern\" },\n  { \"code\": \"90\", \"name\": \"Oberwampach\" },\n  { \"code\": \"91\", \"name\": \"Perl\u00e9\" },\n  { \"code\": \"92\", \"name\": \"P\u00e9tange\" },\n  { \"code\": \"93\", \"name\": \"Putscheid\" },\n  { \"code\": \"94\", \"name\": \"Reckange-sur-Mess\" },\n  { \"code\": \"95\", \"name\": \"Redange\/Attert\" },\n  { \"code\": \"96\", \"name\": \"Reisdorf\" },\n  { \"code\": \"97\", \"name\": \"Remerschen\" },\n  { \"code\": \"98\", \"name\": \"Remich\" },\n  { \"code\": \"99\", \"name\": \"Rodenbourg\" },\n  { \"code\": \"100\", \"name\": \"Roeser\" },\n  { \"code\": \"101\", \"name\": \"Rollingergrund\" },\n  { \"code\": \"102\", \"name\": \"Rosport\" },\n  { \"code\": \"103\", \"name\": \"Rumelange\" },\n  { \"code\": \"104\", \"name\": \"Saeul\" },\n  { \"code\": \"105\", \"name\": \"Sandweiler\" },\n  { \"code\": \"106\", \"name\": \"Sanem\" },\n  { \"code\": \"107\", \"name\": \"Schieren\" },\n  { \"code\": \"108\", \"name\": \"Schifflange\" },\n  { \"code\": \"109\", \"name\": \"Schuttrange\" },\n  { \"code\": \"110\", \"name\": \"Septfontaines\" },\n  { \"code\": \"111\", \"name\": \"Stadtbredimus\" },\n  { \"code\": \"112\", \"name\": \"Steinfort\" },\n  { \"code\": \"113\", \"name\": \"Steinsel\" },\n  { \"code\": \"114\", \"name\": \"Strassen\" },\n  { \"code\": \"115\", \"name\": \"Troisvierges\" },\n  { \"code\": \"116\", \"name\": \"Tuntange\" },\n  { \"code\": \"117\", \"name\": \"Useldange\" },\n  { \"code\": \"118\", \"name\": \"Vianden\" },\n  { \"code\": \"119\", \"name\": \"Vichten\" },\n  { \"code\": \"120\", \"name\": \"Wahl\" },\n  { \"code\": \"121\", \"name\": \"Waldbillig\" },\n  { \"code\": \"122\", \"name\": \"Waldbredimus\" },\n  { \"code\": \"123\", \"name\": \"Walferdange\" },\n  { \"code\": \"124\", \"name\": \"Weiler-la-Tour\" },\n  { \"code\": \"125\", \"name\": \"Weiswampach\" },\n  { \"code\": \"126\", \"name\": \"Wellenstein\" },\n  { \"code\": \"127\", \"name\": \"Wiltz\" },\n  { \"code\": \"128\", \"name\": \"Wilwerwiltz\" },\n  { \"code\": \"129\", \"name\": \"Winseler\" },\n  { \"code\": \"130\", \"name\": \"Wormeldange\" }\n];\n\n    function startMap() {\n        if (typeof lux === 'undefined' || typeof ol === 'undefined') {\n            setTimeout(startMap, 300); return;\n        }\n\n        const select = document.getElementById('commune-select');\n        communesData.sort((a,b) => a.name.localeCompare(b.name)).forEach(c => {\n            let opt = document.createElement('option');\n            opt.value = c.code; opt.textContent = c.name;\n            select.appendChild(opt);\n        });\n\n        select.onchange = function() { \n            toggleSearchVisibility(this.value);\n            if (this.value) loadCommuneData(this.value); \n        };\n\n        const luxCenter = [684347.02, 6413032.18]; \n\n        map = new lux.Map({\n            target: 'interactive_map',\n            bgLayer: 'streets_jpeg',\n            zoom: 10,\n\t\t\tsetLanguage: 'de_DE',\n            position: luxCenter,\n            search: { target: 'search-target', dataSets : ['Adresse', 'Coordinates', 'CP'], placeholder: 'Recherche' }\n        });\n\t\tmap.addLayerById('parcels_labels');\n\t\tconst zoomOverlay = document.getElementById('zoom-instruction');\n\t\tif (zoomOverlay) {\n\t\t\t\/\/ On attend 3 secondes avant de commencer \u00e0 faire dispara\u00eetre\n\t\t\tsetTimeout(() => {\n\t\t\t\tzoomOverlay.style.opacity = '0';\n\t\t\t\t\/\/ On retire l'\u00e9l\u00e9ment du DOM apr\u00e8s la transition CSS\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tzoomOverlay.style.display = 'none';\n\t\t\t\t}, 1000); \n\t\t\t}, 3500);\n\t\t}\n        maskSource = new ol.source.Vector();\n        const maskLayer = new ol.layer.Vector({\n            source: maskSource, zIndex: 5,\n            style: new ol.style.Style({ fill: new ol.style.Fill({ color: 'rgba(4, 126, 126, 1)' }) })\n        });\n        map.addLayer(maskLayer);\n\t\tmap.setLanguage('en');\n\n        fetch('https:\/\/www.gpss.lu\/wp-content\/themes\/theme-digitalvision\/inc\/geo\/lux.json')\n            .then(r => r.json())\n            .then(data => {\n                const worldExtent = [[-180, -90], [180, -90], [180, 90], [-180, 90], [-180, -90]];\n                const polyCoords = [worldExtent.map(c => ol.proj.fromLonLat(c))];\n                const features = data.cantons ? data.cantons.features : (data.features || []);\n                features.forEach(f => {\n                    const type = f.geometry.type;\n                    const coords = f.geometry.coordinates;\n                    if (type === 'Polygon') coords.forEach(ring => polyCoords.push(ring.map(c => ol.proj.fromLonLat(c))));\n                    else if (type === 'MultiPolygon') coords.forEach(poly => poly.forEach(ring => polyCoords.push(ring.map(c => ol.proj.fromLonLat(c)))));\n                });\n                maskSource.addFeature(new ol.Feature(new ol.geom.Polygon(polyCoords)));\n                document.getElementById('gpss-init-loader').style.display='none';\n                map.getView().setCenter(luxCenter);\n            });\n\n        vectorSource = new ol.source.Vector();\n        vectorLayer = new ol.layer.Vector({\n            source: vectorSource, zIndex: 10,\n            style: (f) => {\n                const id = f.get('FLIK') || f.get('ID_PARCELL');\n                const isS = !!selection[id];\n                return new ol.style.Style({\n                    stroke: new ol.style.Stroke({ color: isS ? '#ff0000' : '#ffffff', width: isS ? 3 : 1 }),\n                    fill: new ol.style.Fill({ color: isS ? 'rgba(255,0,0,0.4)' : 'rgba(139,201,46,0.2)' })\n                });\n            }\n        });\n        map.addLayer(vectorLayer);\n\n        map.on('singleclick', function(e) {\n            map.forEachFeatureAtPixel(e.pixel, function(feature) {\n                var pid = feature.get('FLIK') || feature.get('ID_PARCELL');\n                if (!pid) return;\n                \n                if (selection[pid]) {\n                    delete selection[pid];\n                } else {\n                    selection[pid] = { \n                        id: pid, \n                        area: feature.getGeometry().getArea(), \n                        feature: feature,\n                        num_pri: feature.get('NUMERO_PRI'),\n                        num_sec: feature.get('NUMERO_SEC')\n                    };\n                }\n                feature.changed(); updateUI();\n            }, { layerFilter: (l) => l === vectorLayer });\n        });\n    }\n\n    function toggleSearchVisibility(value) {\n        const wrapper = document.getElementById('search-wrapper');\n        wrapper.style.display = value ? 'block' : 'none';\n    }\n\n    \/\/ GESTION DU MODE MOBILE\n    window.toggleMobileMap = (showMap) => {\n        const container = document.getElementById('gpss-main');\n        if (showMap) {\n            container.classList.add('map-active');\n        } else {\n            container.classList.remove('map-active');\n        }\n        \/\/ Forcer le redimensionnement de la carte apr\u00e8s le changement de display\n        setTimeout(() => { map.updateSize(); }, 300);\n    };\n\n    function loadCommuneData(code) {\n        vectorSource.clear(); selection = {}; updateUI();\n        const geoUrl = \"https:\/\/www.gpss.lu\/wp-content\/themes\/theme-digitalvision\/inc\/geo\/\";\n        let path = (currentMode === 'flik') ? code.padStart(3, '0') : code;\n        fetch(`${geoUrl}${currentMode}\/${path}.json`)\n            .then(r => r.json())\n            .then(data => {\n                const features = new ol.format.GeoJSON().readFeatures(data, {\n                    featureProjection: map.getView().getProjection()\n                });\n                vectorSource.addFeatures(features);\n                if (features.length) map.getView().fit(vectorSource.getExtent(), { padding:[50,50,50,50], duration:800 });\n            });\n    }\n\n    window.setMode = (mode) => {\n        currentMode = mode;\n        document.getElementById('btn-flik').style.background = (mode==='flik') ? 'var(--gpss-p)' : 'transparent';\n        document.getElementById('btn-flik').style.color = (mode==='flik') ? '#fff' : '#666';\n        document.getElementById('btn-cadastre').style.background = (mode==='cadastre') ? 'var(--gpss-p)' : 'transparent';\n        document.getElementById('btn-cadastre').style.color = (mode==='cadastre') ? '#fff' : '#666';\n        const c = document.getElementById('commune-select').value;\n        if(c) loadCommuneData(c);\n    };\n\n    window.resetMap = () => {\n        selection = {};\n        vectorSource.clear();\n        document.getElementById('commune-select').value = \"\";\n        toggleSearchVisibility(\"\"); \n        const luxCenter = [684347.02, 6413032.18];\n        map.getView().animate({ center: luxCenter, zoom: 10, duration: 800 });\n        updateUI();\n    };\n\n    window.togglePhase = (toForm) => {\n        document.getElementById('phase-selection').style.display = toForm ? 'none' : 'flex';\n        document.getElementById('phase-form').style.display = toForm ? 'flex' : 'none';\n    };\n\n    function updateUI() {\n        let html='', total=0, ids=[], featuresExport=[];\n        const format = new ol.format.GeoJSON();\n        \n        Object.values(selection).forEach(p => {\n            total += p.area; \n            ids.push(p.id); \n            featuresExport.push(p.feature);\n            \n            let val = (p.area\/10000).toFixed(2).replace('.', ',');\n            \n            let labelDisplay = p.id; \n            if (currentMode === 'cadastre' && p.num_pri) {\n                labelDisplay = p.num_pri + (p.num_sec ? '\/' + p.num_sec : '');\n            }\n\n            html += `<div class=\"parcel-card\">\n                        <div>\n                            <b>${labelDisplay}<\/b><br>\n                            <small>${val} ha<\/small>\n                        <\/div>\n                        <div style=\"color:red; cursor:pointer; font-weight:bold; font-size:20px; padding:0 5px;\" onclick=\"removeById('${p.id}')\">\u00d7<\/div>\n                    <\/div>`;\n        });\n        \n        document.getElementById('list_parcels').innerHTML = html || '<p style=\"text-align:center; color:#bbb; margin-top:20px; font-size:13px;\">Select your parcels.<\/p>';\n        \n        document.getElementById('total_ha').innerText = (total\/10000).toLocaleString('fr-FR', {\n            minimumFractionDigits: 2,\n            maximumFractionDigits: 2\n        });\n\n        document.getElementById('btn_next').disabled = ids.length === 0;\n        const randomString = Math.random().toString(36).substring(2, 8);\n\n\t\tconst fHidden = document.getElementById('wpforms-2025-field_16');\n\t\tif (fHidden && !fHidden.value) {\n\t\t\t\/\/ On g\u00e9n\u00e8re juste le num\u00e9ro unique (ex: 1715081234)\n\t\t\tfHidden.value = Date.now();\n\t\t}\n\n        const fList = document.querySelector('.gpss-liste-parcelles input');\n        if(fList) fList.value = ids.join(', ');\n        const fGeo = document.querySelector('.gpss-geojson-data input, .gpss-geojson-data textarea');\n        if(fGeo) fGeo.value = ids.length ? format.writeFeatures(featuresExport, { dataProjection:'EPSG:4326', featureProjection:map.getView().getProjection() }) : '';\n    }\n\n    window.removeById = (id) => {\n        const f = selection[id] ? selection[id].feature : null;\n        delete selection[id]; if(f) f.changed(); updateUI();\n    };\n\n    startMap();\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"page-landing.php","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-2111","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Geoportail - Base<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.gpss.lu\/en\/geoportail\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Geoportail - Base\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.gpss.lu\/en\/geoportail\/\" \/>\n<meta property=\"og:site_name\" content=\"Base\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.gpss.lu\/en\/geoportail\/\",\"url\":\"https:\/\/www.gpss.lu\/en\/geoportail\/\",\"name\":\"Geoportail - Base\",\"isPartOf\":{\"@id\":\"https:\/\/gpss.lu\/#website\"},\"datePublished\":\"2026-05-08T12:44:09+00:00\",\"dateModified\":\"2026-05-08T12:44:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.gpss.lu\/en\/geoportail\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.gpss.lu\/en\/geoportail\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.gpss.lu\/en\/geoportail\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/gpss.lu\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Geoportail\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/gpss.lu\/#website\",\"url\":\"https:\/\/gpss.lu\/\",\"name\":\"Base\",\"description\":\"Just another WordPress site\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/gpss.lu\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Geoportail - Base","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.gpss.lu\/en\/geoportail\/","og_locale":"en_US","og_type":"article","og_title":"Geoportail - Base","og_url":"https:\/\/www.gpss.lu\/en\/geoportail\/","og_site_name":"Base","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.gpss.lu\/en\/geoportail\/","url":"https:\/\/www.gpss.lu\/en\/geoportail\/","name":"Geoportail - Base","isPartOf":{"@id":"https:\/\/gpss.lu\/#website"},"datePublished":"2026-05-08T12:44:09+00:00","dateModified":"2026-05-08T12:44:09+00:00","breadcrumb":{"@id":"https:\/\/www.gpss.lu\/en\/geoportail\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.gpss.lu\/en\/geoportail\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.gpss.lu\/en\/geoportail\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gpss.lu\/en\/"},{"@type":"ListItem","position":2,"name":"Geoportail"}]},{"@type":"WebSite","@id":"https:\/\/gpss.lu\/#website","url":"https:\/\/gpss.lu\/","name":"Base","description":"Just another WordPress site","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gpss.lu\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/www.gpss.lu\/en\/wp-json\/wp\/v2\/pages\/2111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gpss.lu\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.gpss.lu\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.gpss.lu\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gpss.lu\/en\/wp-json\/wp\/v2\/comments?post=2111"}],"version-history":[{"count":1,"href":"https:\/\/www.gpss.lu\/en\/wp-json\/wp\/v2\/pages\/2111\/revisions"}],"predecessor-version":[{"id":2112,"href":"https:\/\/www.gpss.lu\/en\/wp-json\/wp\/v2\/pages\/2111\/revisions\/2112"}],"wp:attachment":[{"href":"https:\/\/www.gpss.lu\/en\/wp-json\/wp\/v2\/media?parent=2111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}